์ด ์๋ฆฌ์ฆ์์๋ MSA ํ๋ก์ ํธ๋ฅผ ์์ฑํ ๋ค, Docker์ Jenkins๋ฅผ ์ด์ฉํ์ฌ CI/CD๋ฅผ ๊ตฌ์ถํ๋ ๊ณผ์ ์ ์ค๋ช ํ๋๋ก ํ๊ฒ ๋ค.
์ด์ ํฌ์คํ ์์๋ Docker๋ฅผ ์ค์น์ ์๋ ๋ฐฐํฌ ๊ณผ์ ๊ณผ ์๋ ๋ฐฐํฌ์ ํ์์ฑ์ ๋ํด ์ค๋ช ํ์๋ค. ๊ทธ๋ฆฌ๊ณ Jenkins๋ฅผ ์ค์นํ๋ ๋ฐฉ๋ฒ์ ๋ํด์๋ ์ค๋ช ํ๋ค
Docker ์ค์นํ๊ธฐ : https://programmingiraffe.tistory.com/12
Jenkins ์ค์นํ๊ธฐ : https://programmingiraffe.tistory.com/124
๐ป ํ๊ฒฝ
- OS : Window
- Server : AWS EC2
- Backend : Spring boot, Spring Cloud(Gateway, Eureka), Gradle, Java11
- Deploy : Docker, Dockerhub, Jenkins
- Git : Gitlab
๐ ํ๋ก์ ํธ ๊ตฌ์กฐ๋
- ๋ฐฑ์๋ 6๊ฐ, DB 2๊ฐ, Jenkins(Docker in docker๋ก ํ๋ค) ์ด 9๊ฐ์ ์ปจํ ์ด๋๋ฅผ ๋ง๋ค ๊ฒ์ด๋ค.
- ๊ทธ๋ฆฌ๊ณ GitLab๊ณผ ์ฐ๊ฒฐํ์ฌ webhook์ ์ค์ ํด push ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ์๋์ผ๋ก ๋ฐฐํฌ๊ฐ ๋๋๋ก ํ ๊ฒ์ด๋ค.
- ๊ฐ ์๋น์ค๋ณ๋ก ๋ธ๋์น๋ฅผ ๊ตฌ์ฑํ๋ค. ๊ทธ๋์ ๊ฐ ๋ธ๋์น ๋ณ๋ก webhook์ ์ค์ ํด์ผ ํ๋ค.
CI/CD ๊ณผ์
- ์์ค์ฝ๋๊ฐ ํด๋น ๋ธ๋์น์ push ๋๋ค. (ํธ์ฌ ์ด๋ฒคํธ ๋ฐ์)
- ํ๋ก์ ํธ ๋ด์ Jenkinsfile์ ์ฝ์ด ์คํํ๋ค.
- Git์ ์๋ ํ๋ก์ ํธ๋ฅผ Cloneํด, ๋น๋๋ฅผ ํ๋ค.
- jar ํ์ผ์ด ์์ฑ๋๊ณ , ๋์ปค ์ด๋ฏธ์ง๋ก ๋น๋ํ๋ค.
- ๋์ปค ์ด๋ฏธ์ง๋ฅผ ๋์ปค ํ๋ธ์ ์ ๋ก๋ ํ๋ค.
- ์ง๊ธ ๋์ปค์์ run ๋๊ณ ์๋ ํด๋น ์ด๋ฏธ์ง๋ฅผ ์ค์งํ๊ณ , ์ญ์ ์ํจ๋ค.
- ๊ทธ๋ฆฌ๊ณ ๋์ปค ํ๋ธ์ ์๋ ์ ์ด๋ฏธ์ง๋ฅผ ๋ฐ์ run ํ๋ค.
- Spring ์๋ฒ๊ฐ ๋์ปค ์ปจํ ์ด๋๋ก AWS์ ๋ฐฐํฌ๋๋ค.
๐คต๐ป Jenkins Pipeline ์์ฑ
- ์๋ก์ด Item ์์ฑ
- ํ์ดํ ๋ผ์ธ์ ์์ฑํ๋ค. item ์ด๋ฆ์ ํด๋น ๋ง์ดํฌ๋ก ์๋น์ค์ ์ด๋ฆ์ ์ ๋ ฅํ๋ค.
๐คต๐ป Jenkins file ์์ฑ
pipeline {
agent any
environment {
DOCKER = 'sudo docker'
}
stages {
stage('Clone Repository') {
steps {
checkout scm
echo 'Checkout Scm'
}
}
stage('Build image') {
steps {
sh 'ls -al'
dir('[๋๋ ํ ๋ฆฌ๋ช
]) {
sh 'ls -al'
sh 'chmod +x ./gradlew'
sh './gradlew build'
sh 'docker build -t [docker hub ๊ณ์ ]/[docker ์ด๋ฏธ์ง ์ด๋ฆ] .'
}
echo 'Build image...'
}
}
stage('Remove Previous image') {
steps {
script {
try {
h 'docker stop [docker ์ด๋ฏธ์ง ์ด๋ฆ]'
sh 'docker rm [docker ์ด๋ฏธ์ง ์ด๋ฆ]'
} catch (e) {
echo 'fail to stop and remove container'
}
}
}
}
stage('Run New image') {
steps {
sh 'docker run --name [docker hub ๊ณ์ ]/[docker ์ด๋ฏธ์ง ์ด๋ฆ] -d -p [ํฌํธ๋ฒํธ]:[ํฌํธ๋ฒํธ] [docker hub ๊ณ์ ]/[docker ์ด๋ฏธ์ง ์ด๋ฆ]'
echo 'Run New member image'
}
}
}
}
๐คต๐ป SCM ์ค์
Jenkins script๋ฅผ ์์ฑํด์ push ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ์ฝ๋๋ก ํ ๊ฒ์ด๋ฏ๋ก Definition์ Pipeline script์์ Pipeline script from SCM์ผ๋ก ๋ณ๊ฒฝํ๋ค.
๊ทธ๋ฆฌ๊ณ Git๊ณผ ์ฐ๋ํ ๊ฒ์ด๋ฏ๋ก SCM์ Git์ผ๋ก ์ ํํ๋ค. ๊ทธ๋ฌ๋ฉด Git ์ฐ๋์ ์ค์ ํ๋ ํญ๋ชฉ๋ค์ด ์ถ๊ฐ๋ก ๋ณด์ธ๋ค.
Repository URL ์ ๋ ฅ
Git ํ๋ก์ ํธ์ URL์ ์ ๋ ฅํ๋ค.
๐ฆ GibLab Access Token ์์ฑ
Git ํ๋ก์ ํธ์ Access Token ์ ์์ฑํ์ง ์์๋ค๋ฉด ์๋์ ๊ฐ์ด Failed to connect to repository๊ฐ ๋ฌ๋ค. GitLab ํ๋ก์ ํธ์ ๊ฐ์ Access Token์ ์ค์ ํด์ค์ผ ํ๋ค.
GitLab ํ๋ก์ ํธ์์ Settings > Access Toekn ์ ๋ค์ด๊ฐ์ ํ ํฐ์ ์์ฑํด์ค๋ค.
(์ต์ด 1ํ๋ง ์ค์ ํด์ฃผ๋ฉด ๋๋ค. ์ด๋ฏธ ํ ํฐ์ ์์ฑํ๋ค๋ฉด ๊ฑด๋๋ฐ์ด๋ ๋๋ค.)
๐คต๐ป SCM ์ค์
Credientials ์ค์ ํ๊ธฐ
๋ค์ Jenkins์ SCM ์ค์ ์ผ๋ก ๋์์์ Credientials์์ ๋ด GitLab ๊ณ์ ๊ณผ ์ฐ๋ํด์ค์ผ ํ๋ค. ์ด๋ฏธ ์ถ๊ฐ๋ฅผ ํ๋ค๋ฉด ๋ด ๊ณ์ ์ ์ ํํ๋ฉด ๋์ง๋ง, ๋ด ๊ณ์ ์ด ๋ฑ๋ก๋์ด ์์ง ์๋ค๋ฉด Add > Jenkins๋ฅผ ํด๋ฆญํด ์ถ๊ฐํด์ค๋ค.
Username์ ๋ด Gitlab ๊ณ์ ์ ์ ๋ ฅํด์ฃผ๊ณ , Password์ Gitlab ๊ณ์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํด์ค๋ค. ๊ทธ๋ฌ๋ฉด ์ถ๊ฐ๊ฐ ๋๊ณ , ์ถ๊ฐ๋ ๊ณ์ ์ Credientials๋ก ์ ํํด์ฃผ๋ฉด ๋๋ค.
Branches to Build ์ค์
webhook์ ๊ฑธ branch๋ฅผ ์ ๋ ฅํด์ค๋ค.
Script Path ์ ๋ ฅํ๊ธฐ
Repository ๋ด์์ Jenkinsfile์ด ์์นํ ๊ฒฝ๋ก๋ฅผ ์ ๋ ฅํด์ค๋ค.
๐คต๐ป Jenkins์์ Webhook ์ค์
GitLab Plugin ์ค์น
Dashboard > Jenkins ๊ด๋ฆฌ > Plugin ๊ด๋ฆฌ > Available Plugin์ ๋ค์ด๊ฐ๋ค.
๊ฒ์์ฐฝ์ gitlab์ ๊ฒ์ํด ์๋ ๋์ค๋ ํ๋ฌ๊ทธ์ธ์ ์ค์นํด์ฃผ๋ฉด ๋๋ค.
Build Trigger ์ค์
๋ค์ Jenkins pipeline์ ์ค์ ํ๋ ๋ถ๋ถ์ผ๋ก ๋์์์ Build Trigger๋ฅผ ์ค์ ํด์ค๋ค.
Build when a change is pushed to GitLab ํด๋ฆญ
(์ด๋, ์ฒดํฌํ๋ฉด ๋์ค๋ URL์ ๋ณต์ฌํ๋ค. GitLab์ผ๋ก ๊ฐ์ Webhook์ ์ฐ๊ฒฐํ ๋ ์ฐ์ธ๋ค.)
Secret token ์์ฑํ๊ธฐ
๊ณ ๊ธ > Secret token > Generate ์ ํด๋ฆญํ๋ค. (Secret token ๋ณต์ฌํด๋๋ค. GitLab์ผ๋ก ๊ฐ์ Webhook์ ์ฐ๊ฒฐํ ๋ ์ฐ์ธ๋ค.)
๐ฆ GibLab์์ Webhook ์ค์
ํ๋ก์ ํธ > Settings > Webhooks ๋ก ๋ค์ด๊ฐ๋ค. ์๋ ์ฌํญ์ ์ ๋ ฅํ๊ณ Add webhook์ ํ๋ค.
- URL : ์ด์ ์ Jenkins์์ Build Trigger์ ํด๋ฆญํ์ ๋ ์์ ๋์จ URL ์ ๋ ฅ
- Secret token : ๊ณ ๊ธ > Secret token > Generate ํ์ ๋ ๋์จ token ์ ๋ ฅ
- Trigger : Webhook Trigger๋ฅผ ๊ฑธ ๋ธ๋์น๋ฅผ ์ ๋ ฅํ๋ค.
๐ ๊ฒฐ๊ณผ
GibLab Webhook
ํ๋ก์ ํธ์ ์ค์ ๋ Webhook์ ๋ณผ ์ ์๋ค. Test๋ฅผ ํตํด ์ง์ Push ์ด๋ฒคํธ๋ฅผ ์ค ์๋ ์๋ค.
Jenkins ํ์ดํ๋ผ์ธ ๋ณ CI/CD ์ฑ๊ณต ํ์ธ
ํ์ดํ๋ผ์ธ์์ CI/CD Stage ํ์ธ
Docker ์ปจํ ์ด๋ ํ์ธ
ํ์ฌ ๋ฐฐํฌ์ค์ธ ์๋น์ค๋ฅผ ํ์ธํ ์ ์๋ค.
docker ps