해당 글은 일프로 님의 인프런 강의 쿠버네티스 어나더 클래스 (지상편) - Sprint 1, 2의 내용을 정리한 글입니다.
해당 글에 사용된 내용, 사진 및 그림은 모두 강의와 강의 자료에 포함된 내용입니다.
pipeline {
agent any
// 전역적으로 JDK 및 gradle 설정
tools {
gradle 'gradle-7.6.1'
jdk 'jdk-17'
}
// 환경 변수
environment {
DOCKERHUB_USERNAME = '<username>'
GITHUB_URL = 'https://github.com/<username>/kubernetes-anotherclass-sprint2.git'
// deployment.yaml -> image: 1pro/api-tester:v1.0.0
// 실습 넘버링 - (수정x)
CLASS_NUM = '2211'
}
stages {
stage('Source Build') {
steps {
// 소스파일 체크아웃
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"
script{
if (DOCKERHUB_USERNAME == "1pro") {
echo "docker push ${DOCKERHUB_USERNAME}/api-tester:v1.0.0"
} else {
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"
}
}
}
}
while true; do curl http://192.168.56.30:32213/version; sleep 1; echo ''; done;
pipeline {
agent any
environment {
// 본인의 username으로 하실 분은 수정해주세요.
GITHUB_URL = 'https://github.com/k8s-1pro/kubernetes-anotherclass-sprint2.git'
// 실습 넘버링
CLASS_NUM = '2213'
}
stages {
stage('릴리즈파일 체크아웃') {
steps {
checkout scmGit(branches: [[name: '*/main']],
extensions: [[$class: 'SparseCheckoutPaths',
sparseCheckoutPaths: [[path: "/${CLASS_NUM}"]]]],
userRemoteConfigs: [[url: "${GITHUB_URL}"]])
}
}
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"
}
}
stage('배포 시작') {
steps {
input message: '수동배포 시작', ok: "Yes"
}
}
stage('쿠버네티스 Green배포') {
steps {
sh "kubectl apply -f ./${CLASS_NUM}/deploy/k8s/green/deployment.yaml"
sh "kubectl apply -f ./${CLASS_NUM}/deploy/k8s/green/service.yaml"
}
}
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\"}}}'"
}
}
}
}
stage('롤백 확인') {
steps {
script {
returnValue = input message: 'Blue 롤백?', parameters: [choice(choices: ['done', 'rollback'], name: 'IS_ROLLBACk')]
if (returnValue == "done") {
sh "kubectl delete -f ./${CLASS_NUM}/deploy/k8s/blue/deployment.yaml"
sh "kubectl delete -f ./${CLASS_NUM}/deploy/k8s/green/service.yaml"
sh "kubectl patch -n anotherclass-221 svc api-tester -p '{\"metadata\": {\"labels\": {\"version\": \"2.0.0\"}}}'"
sh "kubectl patch -n anotherclass-221 cm api-tester-properties -p '{\"metadata\": {\"labels\": {\"version\": \"2.0.0\"}}}'"
sh "kubectl patch -n anotherclass-221 secret api-tester-postgresql -p '{\"metadata\": {\"labels\": {\"version\": \"2.0.0\"}}}'"
}
if (returnValue == "rollback") {
sh "kubectl patch -n anotherclass-221 svc api-tester -p '{\"spec\": {\"selector\": {\"blue-green-no\": \"1\"}}}'"
}
}
}
}
}
}
while true; do curl http://192.168.56.30:32214/version; sleep 1; echo ''; done;
pipeline {
agent any
environment {
// 본인의 username으로 하실 분은 수정해주세요.
GITHUB_URL = 'https://github.com/k8s-1pro/kubernetes-anotherclass-sprint2.git'
// 실습 넘버링
CLASS_NUM = '2214'
}
stages {
stage('릴리즈파일 체크아웃') {
steps {
checkout scmGit(branches: [[name: '*/main']],
extensions: [[$class: 'SparseCheckoutPaths',
sparseCheckoutPaths: [[path: "/${CLASS_NUM}"]]]],
userRemoteConfigs: [[url: "${GITHUB_URL}"]])
}
}
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"
}
}
stage('자동배포 시작') {
steps {
input message: '자동배포 시작', ok: "Yes"
}
}
stage('쿠버네티스 Green배포') {
steps {
sh "kubectl apply -f ./${CLASS_NUM}/deploy/k8s/green/deployment.yaml"
}
}
stage('Green 배포 확인중') {
steps {
script {
def returnValue
while (returnValue != "true true"){
returnValue = sh(returnStdout: true, encoding: 'UTF-8', script: "kubectl get -n anotherclass-221 pods -l instance='api-tester-2214',blue-green-no='2' -o jsonpath='{.items[*].status.containerStatuses[*].ready}'")
echo "${returnValue}"
sleep 5
}
}
}
}
stage('Green 전환 완료') {
steps {
sh "kubectl patch -n anotherclass-221 svc api-tester-2214 -p '{\"spec\": {\"selector\": {\"blue-green-no\": \"2\"}}}'"
}
}
stage('Blue 삭제') {
steps {
sh "kubectl delete -f ./${CLASS_NUM}/deploy/k8s/blue/deployment.yaml"
sh "kubectl patch -n anotherclass-221 svc api-tester-2214 -p '{\"metadata\": {\"labels\": {\"version\": \"2.0.0\"}}}'"
sh "kubectl patch -n anotherclass-221 cm api-tester-2214-properties -p '{\"metadata\": {\"labels\": {\"version\": \"2.0.0\"}}}'"
sh "kubectl patch -n anotherclass-221 secret api-tester-2214-postgresql -p '{\"metadata\": {\"labels\": {\"version\": \"2.0.0\"}}}'"
}
}
}
}