โ ์ฟ ๋ฒ๋คํฐ์ค ์ด๋๋ ํด๋์ค (์ง์ํธ) - Spring 1, 2 ์ ๋ฃ๊ณ ์์ฑํ๋ ๋ณต์ต ๋ธ๋ก๊ทธ ์ ๋๋ค.
(1) ์ ํจ์ค ํ์ดํ๋ผ์ธ ๊ธฐ๋ณธ ๊ตฌ์ฑ ๋ฐ ๋ฐฐํฌ ์ธ๋ถํ
Step 1. Jenkins Pipeline ๊ธฐ๋ณธ ๊ตฌ์ฑ ๋ง๋ค๊ธฐ
1-1. ์๋ก์ด item ๋ง๋ค๊ธฐ
- item name ์ ๋ ฅ ๋ฐ Pipeline ์ ํ
1-2. Pipeline Script
pipeline {
agent any
tools {
gradle 'gradle-7.6.1'
jdk 'jdk-17'
}
environment {
DOCKERHUB_USERNAME = "soyeon207"
GITHUB_USERNAME = "soyeon207"
// ์๋ ๋ถ๋ถ ์์ (x)
GITHUB_URL = "https://github.com/${GITHUB_USERNAME}/kubernetes-anotherclass-sprint2.git"
CLASS_NUM = '2211'
}
stages {
stage('Source Build') {
steps {
// ์์คํ์ผ ์ฒดํฌ์์ (Source Repo๋ ๋ณ๊ฒฝ์์ด ๊ทธ๋๋ก ์ฌ์ฉ)
git branch: 'main', url: 'https://github.com/k8s-1pro/kubernetes-anotherclass-api-tester.git'
// ์์ค ๋น๋
// 755๊ถํ ํ์ (์๋์ฐ์์ Git์ผ๋ก ์์ค ์
๋ก๋์ ๊ถํ์ 644)
sh "chmod +x ./gradlew"
sh "gradle clean build"
}
}
stage('Container Build') {
steps {
// ๋ฆด๋ฆฌ์ฆํ์ผ ์ฒดํฌ์์
checkout scmGit(branches: [[name: '*/main']],
extensions: [[$class: 'SparseCheckoutPaths',
sparseCheckoutPaths: [[path: "/${CLASS_NUM}"]]]],
userRemoteConfigs: [[url: "${GITHUB_URL}"]])
// jar ํ์ผ ๋ณต์ฌ
sh "cp ./build/libs/app-0.0.1-SNAPSHOT.jar ./${CLASS_NUM}/build/docker/app-0.0.1-SNAPSHOT.jar"
// ์ปจํ
์ด๋ ๋น๋ ๋ฐ ์
๋ก๋
sh "docker build -t ${DOCKERHUB_USERNAME}/api-tester:v1.0.0 ./${CLASS_NUM}/build/docker"
// ์์๊ณผ ๋ฌ๋ฆฌ if๋ฌธ์ด ์์ด์ง๊ณ ํญ์ ๋ณธ์ธ์ Docker Hub์์ ๋น๋๊ฐ ๋๋๋ก ์์ ๋จ
sh "docker push ${DOCKERHUB_USERNAME}/api-tester:v1.0.0"
}
}
stage('K8S Deploy') {
steps {
// ์ฟ ๋ฒ๋คํฐ์ค ๋ฐฐํฌ
sh "kubectl apply -f ./${CLASS_NUM}/deploy/k8s/namespace.yaml"
sh "kubectl apply -f ./${CLASS_NUM}/deploy/k8s/configmap.yaml"
sh "kubectl apply -f ./${CLASS_NUM}/deploy/k8s/secret.yaml"
sh "kubectl apply -f ./${CLASS_NUM}/deploy/k8s/service.yaml"
sh "kubectl apply -f ./${CLASS_NUM}/deploy/k8s/deployment.yaml"
}
}
}
}
1-3. [์ง๊ธ ๋น๋] ์คํ ํ Stage View ๊ฒฐ๊ณผ ํ์ธ
1-4. Jenkins Pipeline ๊ตฌ์กฐ ์ดํด
- stage ๊ฐ ๊ฐ๊ฐ์ ํ์ดํ๋ผ์ธ
- agent any
- ์ปจํ ์ด๋ ์คํ, Dockerfile ๋น๋, Yaml ๋ฐฐํฌ ๋ฅผ ํ ์ ์๋๋ฐ ๊ฐ๊ฐ Agent ํํ๋ก ์ ๊ณต
- ์ด ํ์ดํ๋ผ์ธ์ ์ด๋ค Agent ๋ฅผ ๋ฃ์ด๋ ๋๋ค๋ผ๊ณ ์ค์
- ์์ ๊ฐ์ ํ์์ ์ ํจ์ค๋ฅผ master, slave ๋ก ๋๋ ์ ์ค์นํ์ ๋ slave ์์ ์คํฌ๋ฆฝํธ๋ฅผ ๋๋ฆฌ๊ฒ ๋ค๋ ์๋ฏธ
- ํ ๋ฒ์ ์ฌ๋ฌ script ๋ฅผ ๋๋ฆด๋ ค๊ณ ํ ๋ node ๋ฅผ ๋ถ์ฐ์ํค๊ธฐ ์ํด์ ์ฌ์ฉ
Step 2. Github ์ฐ๊ฒฐ ๋ฐ ํ์ดํ๋ผ์ธ ์ธ๋ถํ
2-1. item name ์ ๋ ฅ ๋ฐ Pipeline ์ ํ
2-2. Pipeline ์ค์
General > GitHub project
Advanced Project Options > Pipeline
- SCM : Source Code Management
- Path : 2212 : 2212 ํด๋๋ฅผ ์ฌ์ฉ
- 2212/Jenkinsfile : 2212 ํด๋์ Jenkinsfile ํ์ผ์ ์ฌ์ฉ
2-3. ์ง๊ธ ๋น๋ ์คํ
ERROR: [ํ๋ผ๋ฏธํฐ์ ํจ๊ป ๋น๋]์ GITHUB_USERNAME๋ฅผ ๋ณธ์ธ์ username์ผ๋ก ์ ๋ ฅํด ์ฃผ์ธ์! ๋งค๋ฒ ์ ๋ ฅ์ด ๋ฒ๊ฑฐ๋กญ๋ค๋ฉด Jenkinsfile์์ parameters์ ์ ๋ ฅ ํญ๋ชฉ์ ์ญ์ ํ์๊ณ environment์ ์ ์ญ๊ฐ์ ๋ฃ์ ํ ํด๋น ์กฐ๊ฑด๋ฌธ์ ์ญ์ ํด ์ฃผ์ธ์. Finished: FAILURE
https://github.com/soyeon207/kubernetes-anotherclass-sprint2/blob/main/2212/Jenkinsfile
kubernetes-anotherclass-sprint2/2212/Jenkinsfile at main · soyeon207/kubernetes-anotherclass-sprint2
[โ์ฟ ๋ฒ๋คํฐ์ค ์ด๋๋ ํด๋์ค (์ง์ํธ) - ๐Sprint2]. Contribute to soyeon207/kubernetes-anotherclass-sprint2 development by creating an account on GitHub.
github.com
→ Jenkinsfile ์์ Username ํ์ธ stage ์์ DOCKERHUB_USERNAME ์ด๋ GITHUB_USERNAME๊ฐ ์์ผ๋ฉด ์๋ฌ ๋ฐ์ํ๋๋ก ๋์ด ์์
2-4. ํ๋ผ๋ฏธํฐ์ ํจ๊ป ๋น๋
Step 3. Blue/Green ๋ฐฐํฌ ๋ง๋ค๊ธฐ ๋ฐ ํน์ง ์ค์ต
3-1. item name ์ ๋ ฅ ๋ฐ Pipeline ์ ํ
- item name : 2213-jenkins_pipeline-step3
- Copy from : 2212-jenkins_pipeline-step2
3-2. Additional Behaviours ๋ฐ Script Path ์์
3-3. ์ฑ ๋น๋
Blue ๋ฐฐํฌ ์ [App Version] : Api Tester v1.0.0
๋ฐฐํฌ ์์์ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ฆฌ๋ฉด ์๋๋ฐฐํฌ ์์ ๊ฐ๋ฅ
์ฟ ๋ฒ๋คํฐ์ค Green ๋ฐฐํฌ๊ฐ ์๋ฃ๋๋ฉด ์๋ก์ด ํ๋๊ฐ ๋จ๊ณ V2 Service ํธ์ถ ๊ฐ๋ฅ
Green ์ ํ → ํธ๋ํฝ์ด ๋ฐ๋ก v2.0.0 ์ผ๋ก ๋ณ๊ฒฝ
๋ชจ๋ํฐ๋ง ํ ๋กค๋ฐฑ๋ฒํผ์ผ๋ก v1 ์ผ๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅ
4. Blue/Green ์๋ ๋ฐฐํฌ script ๋ง๋ค๊ธฐ
4-1. item name ์ ๋ ฅ ๋ฐ Pipeline ์ ํ
- item name : 2213-jenkins_pipeline-step4
- Copy from : 2212-jenkins_pipeline-step3
4-2. Additional Behaviours ๋ฐ Script Path ์์
- 2214
- 2214/Jenkinsfile
4-3. ์๋๋ฐฐํฌ ์์
- Pod ๊ฐ Ready ์ํ๊ฐ ๋๋ฉด ํธ๋ํฝ์ด ์ ํ๋๋ค
(2) Blue/Green ๋ฐฐํฌ์ ๊ณ ๋ คํด์ผํ ์์
- Blue-Green ๋ฐฐํฌ๋ฅผ ๊ณ ๋ คํ Deployment ๋ค์ด๋ฐ ํ์
- Blue-Green ๋ฐฐํฌ๋ฅผ ์ํ ์ถ๊ฐ ๋ ์ด๋ธ ๋ฐ ์ ๋ ํฐ ํ์
- Green Deployment ์์ฑ
- ํ ์คํธ๋ฅผ ์ํ Service ์์ฑ
- ์ ์๋น์ค๋ Green Pod ์ ์ฐ๊ฒฐ๋๋๋ก ์ค์
- Service ์ Selector (blue-green-no) ๋ฅผ 2๋ก ๋ณ๊ฒฝํ์ฌ ํธ๋ํฝ์ Green ์ผ๋ก ์ ํ
- Selector ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ํธ๋ํฝ์ด ์ ํ๋๋ค
- Green ๋ฐฐํฌ๊ฐ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ํ๋จ๋๋ฉด → 3
- Blue Deployment, Green Service ์ญ์ ๋ฐ ๊ด๋ จ ๋ชจ๋ ๋ฆฌ์์ค์ ๋ ์ด๋ธ ์ ๋ณด ๋ณ๊ฒฝ (version)
- ๊ณตํต ๋ฆฌ์์ค์๋ ๋ฒ์ ์ ๋ณด ๋ณ๊ฒฝ
- ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ์ฑ๊ธฐ๊ธฐ์ ์ด๋ ค์ → Helm ์ฌ์ฉ
- Rollback
- blue-green-no ๋ฅผ ๋ณ๊ฒฝํด์ฃผ๋ฉด ๋๋ค
stage('์ฟ ๋ฒ๋คํฐ์ค Blue๋ฐฐํฌ') {
steps {
sh "kubectl apply -f ./${CLASS_NUM}/deploy/k8s/blue/namespace.yaml"
sh "kubectl apply -f ./${CLASS_NUM}/deploy/k8s/blue/configmap.yaml"
sh "kubectl apply -f ./${CLASS_NUM}/deploy/k8s/blue/secret.yaml"
sh "kubectl apply -f ./${CLASS_NUM}/deploy/k8s/blue/service.yaml"
sh "kubectl apply -f ./${CLASS_NUM}/deploy/k8s/blue/deployment.yaml"
}
}
- ์ฟ ๋ฒ๋คํฐ์ค์ Blue ๋ฐฐํฌ๋ฅผ ์ค์ ํด ๋๋ ๋ถ๋ถ
- apply ๋ก ๋ฆฌ์์ค ์์ฑ
- create ๋ ์์ง๋ง create ๋ ๋ช ๋ น์ด๋ฅผ ๋ ๋ฆฌ๊ณ ๊ธฐ์กด์ ๋ฆฌ์์ค๊ฐ ์์ผ๋ฉด ์คํจ๋ฅผ ํ๋ค
- apply ๋ ์์ผ๋ฉด ์ ๋ฐ์ดํธ
stage('๋ฐฐํฌ ์์') {
steps {
input message: '์๋๋ฐฐํฌ ์์', ok: "Yes"
}
}
- ์๋ ๋ฐฐํฌ๋ฅผ ํ ์ง ๋ฉ์ธ์ง ๋ฐ์ค๋ฅผ ๋ง๋๋ ์ฝ๋
- ๋ค์์คํ ์ผ๋ก ๋์ด๊ฐ๋ ์ญํ
stage('์ ํ์ฌ๋ถ ํ์ธ') {
steps {
script {
returnValue = input message: 'Green ์ ํ?', ok: "Yes", parameters: [booleanParam(defaultValue: true, name: 'IS_SWITCHED')]
if (returnValue) {
sh "kubectl patch -n anotherclass-221 svc api-tester -p '{\"spec\": {\"selector\": {\"blue-green-no\": \"2\"}}}'"
}
}
}
}
- patch ๋ ์์ ํ๋ผ๋ ๋ช ๋ น์ด
- -p ์์ฑ์ ์ค์ ํน์ ์์ฑ๋ง ๋ณ๊ฒฝํด์ผํ ๋ ์ฌ์ฉ
์ด๋ฏธ์ง ์ถ์ฒ URL : https://inf.run/k7mF
'๐ฑ ์ธํ๋ฐ > โ ์ฟ ๋ฒ๋คํฐ์ค ์ด๋๋ ํด๋์ค (์ง์ํธ)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฏธ์ 5] ์ปจํ ์ด๋ ์ด๋ฏธ์ง ์ฌ๋ก ์ค์ต (1) | 2025.06.16 |
---|---|
(13) Helm ๊ณผ Kustomize - 1 (Helm vs Kustomize, Helm ๋ฐฐํฌ) (1) | 2025.06.15 |
(11) ๋ฐฐํฌ๋ฅผ ์์ํ๊ธฐ ์ ์ ๋ฐ๋์ ์์์ผ ํ ๊ฒ๋ค (2) | 2025.06.11 |
(10) ์์ฝ๊ฒ ๋ฐ๋ธ์ต์ค ํ๊ฒฝ์ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ (2) | 2025.06.10 |
(9) ๋ฐ๋ธ์ต์ค ํ๋ฐฉ ์ ๋ฆฌ (8) | 2025.06.09 |