(12) Jenkins Pipeline (기초부터 Blue/Green 까지)

2025. 6. 14. 22:56·🌱 인프런/⚓ 쿠버네티스 어나더 클래스 (지상편)

⚓ 쿠버네티스 어나더 클래스 (지상편) - 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 배포시 고려해야할 요소

  1. Blue-Green 배포를 고려한 Deployment 네이밍 필요
  2. Blue-Green 배포를 위한 추가 레이블 및 셀렉터 필요

 

  1. Green Deployment 생성
    1. 테스트를 위한 Service 생성
    2. 새 서비스는 Green Pod 에 연결되도록 설정
  2. Service 의 Selector (blue-green-no) 를 2로 변경하여 트래픽을 Green 으로 전환
    1. Selector 가 변경되면 트래픽이 전환된다
    2. Green 배포가 문제가 없다고 판단되면 → 3
  3. Blue Deployment, Green Service 삭제 및 관련 모든 리소스의 레이블 정보 변경 (version)
    1. 공통 리소스에도 버전 정보 변경
    2. 모든 리소스를 챙기기엔 어려움 → Helm 사용
  4. Rollback
    1. 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
'🌱 인프런/⚓ 쿠버네티스 어나더 클래스 (지상편)' 카테고리의 다른 글
  • [미션5] 컨테이너 이미지 사례 실습
  • (13) Helm 과 Kustomize - 1 (Helm vs Kustomize, Helm 배포)
  • (11) 배포를 시작하기 전에 반드시 알아야 할 것들
  • (10) 손쉽게 데브옵스 환경을 구축하는 방법
말린
말린
  • 말린
    개발새발
    말린
  • 전체
    오늘
    어제
    • 분류 전체보기 (58)
      • 👩🏻‍💻 알고리즘 (17)
        • 백준 (17)
      • ✒️ 글또 10기 (6)
      • 🗃️ 데이터베이스 (5)
      • ☕️ 자바 (1)
      • 🌱 인프런 (28)
        • ⚓ 쿠버네티스 어나더 클래스 (지상편) (22)
        • ☕️ 김영한의 실전 자바 - 중급 1편 (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
말린
(12) Jenkins Pipeline (기초부터 Blue/Green 까지)
상단으로

티스토리툴바