ํ๋ก์ ํธ๋ฅผ AWS EC2 ์ธ์คํด์ค์ Jenkins๋ฅผ ์ฌ์ฉํ์ฌ ์๋ ๋ฐฐํฌํ๋ ๊ณผ์
๋ก์ปฌ ์ฝ๋ ๋ณ๊ฒฝ → ๊นํ๋ธ ํธ์ → ์ ํจ์ค์์ ์ด๋ฅผ ๊ฐ์ง → ์๋์ผ๋ก ๋์ปค์ด๋ฏธ์ง๋ก ๋น๋ ๋ฐ ec2 ์๋ฒ์์ ํ ๋ฐ์์ ๋ฐฐํฌ
ํด๋น ๊ณผ์ ์์ ec2 ์ธ์คํด์ค์ ๋์ปค๋ ์ค์น๋์ด์๋ค๊ณ ๊ฐ์ ํ๊ณ , ์ ํจ์ค ์๋ฒ์ ๋ฐฐํฌ ์๋ฒ๋ฅผ ๋ฐ๋ก ๋ฌ์ ์งํํ๋ค. ๋์ปค๋ ๋ ์ธ์คํด์ค์ ๋ชจ๋ ์ค์น๋์ด ์์ด์ผ ํ๋ค.
๋ฐฐํฌ ๊ณผ์ ์์ Docker์ ์ญํ
- ์ด๋ฏธ์ง ๋น๋ → ์ ํจ์ค ์๋ฒ์์ ์์ค์ฝ๋๋ก๋ถํฐ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๋ค.
- ์ด๋ฏธ์ง ์ ์ฅ → ๋น๋๋ ๋์ปค ์ด๋ฏธ์ง๋ Docker Registry(ex. Docker Hub, AWS ECR ๋ฑ)์ ํธ์๋๋ค. ์ด ๊ณผ์ ์ ์ ํจ์ค์์ ์๋ํํ ์ ์๋ค.
- ์ด๋ฏธ์ง ๋ฐฐํฌ ๋ฐ ์คํ → ๋ฐฐํฌ ๋์ ์ธ์คํด์ค์์ Docker ์ด๋ฏธ์ง๋ฅผ ๋ ์ง์คํธ๋ฆฌ๋ก๋ถํฐ ํ ๋ฐ์ ํ, ์ปจํ ์ด๋๋ก ์คํํ๋ค. ์ด ๋จ๊ณ์์ ๋ฐฐํฌ ์๋ฒ์๋ ๋์ปค๊ฐ ์ค์น๋์ด ์์ด์ผ ํ๋ค.⇒ ๋์ปค๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๊ทธ ์ข ์์ฑ์ ์ปจํ ์ด๋ ๋ด์ ํจํค์งํ์ฌ ์ด๋ค ํ๊ฒฝ์์๋ ๋์ผํ๊ฒ ์คํ๋ ์ ์๋๋ก ํ๋ค. ์ด๋ ๊ฐ๋ฐ, ํ ์คํธ, ํ๋ก๋์ ํ๊ฒฝ ๊ฐ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ํ์์ ์ด๋ค.
- ⇒ ๋์ปค ์ด๋ฏธ์ง๋ ๋์ปค ์์ง ์์์ ์ปจํ ์ด๋๋ก ์คํ๋๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ์ง๋ฅผ ์ปจํ ์ด๋๋ก ์คํํ๊ธฐ ์ํด์๋ ๋ฐฐํฌ ์๋ฒ์ ๋์ปค๊ฐ ์ค์น๋์ด ์์ด์ผ ํ๋ค.
ec2 ์ธ์คํด์ค ์ฉ๋ ํ๋
์ฐธ๊ณ ) https://velog.io/@kku64r/ec2freetier
https://velog.io/@kmw10693/EC2-ํ๋ฆฌํฐ์ด-์ฉ๋-๋๋ฆฌ๊ธฐ
https://yunamom.tistory.com/302
EC2 ์ธ์คํด์ค์ Jenkins ์ค์น
sudo yum update -y
๐ซฅ apt-get์ด ์๋ํ์ง ์๊ณ yum์ด ์๋ํ๋ ์ด์
ec2๋ฅผ ๋ง๋ค ๋ Amazon Linux๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ
Amazon Linux๋ Red Hat Enterprise Linux์ CentOS์ ๊ธฐ๋ฐ์ ๋ ๋ฆฌ๋ ์ค ๋ฐฐํฌํ์ด๋ค. apt-get์ ๋ฐ๋น์ ๊ธฐ๋ฐ์ ๋ฆฌ๋ ์ค ๋ฐฐํฌํ์์ ์ฌ์ฉํ๋ ํจํค์ง ๊ด๋ฆฌ ๋๊ตฌ์ด๋ค.
ec2 ์๋ฒ ์์ ์ง์ Jenkins๋ฅผ ์ค์นํ๋ ๊ฒฝ์ฐ
sudo wget -O /etc/yum.repos.d/jenkins.repo \\
<https://pkg.jenkins.io/redhat-stable/jenkins.repo>
sudo rpm --import <https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key>
sudo yum upgrade
Install Java (Amazon Linux 2023)
sudo dnf install java-11-amazon-corretto -y
์ ํจ์ค๋ ์๋ฐ ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ผ ์ ํจ์ค๋ฅผ ์ค์นํ๊ธฐ ์ ์ ์๋ฐใ ๊ฐ ์ค์น๋์ด์์ด์ผํจ
Install Jenkins
sudo yum install jenkins -y
sudo systemctl enable jenkins
sudo systemctl start jenkins
์ ํจ์ค ์น๋ธ๋ผ์ฐ์ ์ ์
https://guide-gov.ncloud-docs.com/docs/devtools-devtools-1-2 ์ฐธ๊ณ
์น๋ธ๋ผ์ฐ์ ์ด๊ณ http://ec2์ธ์คํด์ค์ํผ๋ธ๋ฆญip:18080/ ์ ์ ์ํ๋ฉด ๋๋ค.
(ec2 ๋ณด์๊ทธ๋ฃน์์ 18080ํฌํธ๊ฐ ์ถ๊ฐ๋์ด ์์ด์ผ ํจ)
ํจ์ค์๋ ํ์ธํ๊ธฐ
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
๋์ปคํ๋ธ์์ ์ ํจ์ค ๋ค์ด๋ฐ๊ธฐ
https://bsssss.tistory.com/1176 ์ฐธ๊ณ
sudo docker run -itd --name jenkins -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -p 18080:8080 jenkins/jenkins:lts
๋น๋ฐ๋ฒํธ ํ์ธ
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
Jenkins - Github ๊ณ์ ์ฐ๋ ์ค์
์ด ๊ณผ์ ์ ํตํด ๊นํ๋ธ์์ ๋ฐ์ํ๋ ์ด๋ฒคํธ(ex. ์ฝ๋ ํธ์)๊ฐ Jenkins์์ ์๋์ผ๋ก ๋น๋๋ฅผ ํธ๋ฆฌ๊ฑฐํ ์ ์๊ฒ ๋๋ค.
1. Github Personal Access Token ์์ฑ
github -> settings -> developer settings -> Personal access tokens
ํด๋น ํ์ด์ง์์ Generate new token ํด๋ฆญ token ์ด๋ฆ ์ค์ ํ repo, admin_hook ๊ถํ์ ์ฒดํฌํ๊ณ Generate token ์ ํด๋ฆญํ๋ค.
2. ํ ํฐ ์ฐ๋ - ์ ํจ์ค์ Github Credentials ์ถ๊ฐ
์ ํจ์ค ๋์๋ณด๋์์ Manage Jenkins → Credentials๋ก ์ด๋ํ๋ค.
Jenkins ์ค์ฝํ ๋ด์์ global ์์ญ์ ์ ํํ๊ณ Add Credentials๋ฅผ ํด๋ฆญํ๋ค.
Kind์์ Username with password๋ฅผ ์ ํํ๊ณ Username์๋ ๋ด ๊นํ๋ธ ์์ด๋๋ฅผ, ์์ ์์ฑํ Github Personal Access Token์ Password ํ๋์ ์ ๋ ฅํ๋ค. ID์ Description์ ์ ์ ํ ์ค์ ํ์ฌ ํ ํฐ์ ์๋ณํ ์ ์๊ฒ ํ๋ค.
OK๋ฅผ ํด๋ฆญํ์ฌ ์ ์ฅํ๋ค.
3. ๊นํ๋ธ ์๋ฒ ์ฐ๋
์ ํจ์ค ๋์๋ณด๋์์ Manage Jenkins → System์ผ๋ก ์ด๋ํ๋ค.
๋ด๋ฆฌ๋ค ๋ณด๋ฉด Github๋ผ๋ ๊ฒ ์๋๋ฐ ๊ฑฐ๊ธฐ์ name์ ์์๋ก ์ง์ ํ Credentials์์ Add → Jenkins๋ฅผ ํด๋ฆญํด์ค๋ค.
credential์ ๋ฑ๋กํ๋ค. (Kind๋ฅผ Secret text๋ก, Secret์๋ ๊นํ๋ธ ํ ํฐ์)
test connection์ ๋๋ ์ ๋ ๋ด ๊นํ๋ธ ์์ด๋์ ์ฐ๋๋๋ฉด ์ฑ๊ณต!
4. Github ์นํ ์ค์
๊นํ๋ธ์์ ์ ํจ์ค์ ์ฐ๋ํ ๋ ํฌ์งํ ๋ฆฌ๋ก ์ด๋ํ๋ค.
Settings → Webhooks๋ก ์ด๋ํ์ฌ Add webhook์ ํด๋ฆญํ๋ค.
Payload URL์ ์ ํจ์ค ์๋ฒ์ url์ ์ ๋ ฅํ๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด url์ http://your-jenkins-url/github-webhook/ ํ์์ด๋ค.
Content type์ application/json์ผ๋ก ์ ํํ๋ค.
"Which events would you like to trigger this webhook?"์์ "Just the push event."๋ฅผ ์ ํํ๊ฑฐ๋, ํ์์ ๋ฐ๋ผ ๋ค๋ฅธ ์ด๋ฒคํธ๋ฅผ ์ ํํ ์ ์์ต๋๋ค.
"Active"๋ฅผ ์ฒดํฌํ๊ณ "Add webhook"์ ํด๋ฆญํฉ๋๋ค.
Jenkins์์ GitHub ํ๋ก์ ํธ ์ค์
- Jenkins์์ ์๋ก์ด "Pipeline"์ ์์ฑํ๋ค.
- "General" ์น์ ์์ "Github project"์ ์ ํํ๊ณ , GitHub ๋ฆฌํฌ์งํ ๋ฆฌ์ URL์ ์ ๋ ฅํ๋ค.
- "Build Triggers" ์น์ ์์ "GitHub hook trigger for GITScm polling"์ ์ ํํ๋ค.
- ํ์ํ ๋น๋ ์คํฌ๋ฆฝํธ๋ฅผ ๊ตฌ์ฑํ๋ค.
์ด๋ ๊ฒ ์ค์ ํ๋ฉด GitHub์ ์ฝ๋๊ฐ ํธ์๋ ๋๋ง๋ค Jenkins๊ฐ ์๋์ผ๋ก ๋น๋๋ฅผ ์์ํ๋๋ก ์ค์ ํ ์ ์๋ค.
Docker Registry ์ธ์ฆ ์ ๋ณด ๋ฑ๋ก
docker pipeline plugin ์ค์น
Jenkins Management → Credentials → Add Credentials → username: dockerhub id , password: dockerhub password
ssh agent ์ค์น
์ ํจ์ค ๋ฐฐํฌ ์คํฌ๋ฆฝํธ์์ ssh๋ฅผ ํตํด ec2 ์ธ์คํด์ค์ ์ ๊ทผํด์ผ ํ๋ค. ๋ฐ๋ผ์ ssh agent ํ๋ฌ๊ทธ์ธ์ ์ค์นํด์ผ ํ๋ค.
Credentials ์ถ๊ฐ
๋๋ ubuntu๋ฅผ ์์ป๊ธฐ ๋๋ฌธ์ username์ ec2-user๋ฅผ ์ผ๋ค.
https://cl8d.tistory.com/m/95 ์ฐธ๊ณ
์ ํจ์ค ์คํฌ๋ฆฝํธ ์์ฑ
์ด์ ๋๋ง์ ์ ํจ์ค ์คํฌ๋ฆฝํธ ์์ฑ๋ง ๋จ์๋ค.
pipeline {
agent any
environment {
// ํ๊ฒฝ ๋ณ์ ์ค์
DOCKER_IMAGE = 'dockerhub-username/projectname'
DOCKER_TAG = 'latest'
CONTAINER_NAME = 'projectname'
EC2_HOSTNAME = 'ec2์๋ฒ์ฃผ์'
}
stages {
stage('Checkout') {
steps {
// GitHub ๋ฉ์ธ ๋ธ๋์น์์ ์์ค ์ฝ๋ ์ฒดํฌ์์
git branch: 'main', url: '<https://github.com/projectname.git>'
}
}
stage('Build & Push Docker Images') {
steps {
script {
// Docker Hub์ ๋ก๊ทธ์ธ
withCredentials([usernamePassword(credentialsId: 'docker-credentials', usernameVariable: 'DOCKER_USERNAME', passwordVariable: 'DOCKER_PASSWORD')]) {
sh 'echo $DOCKER_PASSWORD | docker login -u $DOCKER_USERNAME --password-stdin'
}
// Docker ์ด๋ฏธ์ง ๋น๋ ๋ฐ ํธ์
sh 'docker build -t $DOCKER_IMAGE:$DOCKER_TAG ./'
sh 'docker push $DOCKER_IMAGE:$DOCKER_TAG'
}
}
}
stage('Deploy to EC2') {
steps {
// Docker ์ด๋ฏธ์ง๋ฅผ ์คํํ๊ธฐ ์ํด SSH ์์ด์ ํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
sshagent(credentials: ['ssh-credentials']) {
// SSH๋ฅผ ํตํด EC2 ์ธ์คํด์ค์ ์ ์ํ์ฌ Docker ์ด๋ฏธ์ง ์คํ
sh """
ssh -o StrictHostKeyChecking=no ec2-user@$EC2_HOSTNAME '
docker pull $DOCKER_IMAGE:$DOCKER_TAG
docker stop $CONTAINER_NAME || true
docker rm $CONTAINER_NAME || true
docker run -d --name $CONTAINER_NAME -p 80:80 $DOCKER_IMAGE:$DOCKER_TAG
'
"""
}
}
}
}
}
๋ง์ง๋ง์๋ฌ..ใ ใ ใ ใ
ERROR: Failed to find configuration named [ssh-credentials] check the global configuration
์ด๊ฒ๋ง ํด๊ฒฐํ๋ ์ฑ๊ณตํ๋ค..
ํ
์๋ฌ ์ง์ง๋ง์ด๋ฌ๋ค
ec2 hostname์ 54-180-80-81๋ก ํด์๋ ๋ฌ๊ณ
์ฉ๋ ๋ค์ฐจ์ rmi๋ฅผ ์ํด์๋ ๋ซ๊ณ ..
ssh ํค์ %๊ฐ ๋ค์ด๊ฐ์๋ ๋ฌ๊ณ ..
ํธ๋ฌ๋ธ์ํ ใ ์ ์ถํ์ ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค.
'Infra & DevOps' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Windows] Windows Server 2019์ ssh ์๋ฒ ์ค์น (0) | 2024.10.01 |
---|---|
[WinRM] WinRM ์ค์ ๋ฐ HTTPS ํต์ (0) | 2024.05.31 |
[AWS] EC2 SSH Connection Refused ํธ๋ฌ๋ธ์ํ (0) | 2024.03.28 |
[DevOps] ๋ฐฐํฌํ ๋ฆฌ์กํธ ํ๋ก์ ํธ์ nginx ์๋ฒ 404 ์๋ฌ (0) | 2024.03.08 |
[AWS] ๋ฆฌ์กํธ ํ๋ก์ ํธ ๋์ปค๋ผ์ด์งํด์ EC2์ ๋ฐฐํฌํ๊ธฐ (0) | 2024.03.08 |