CI/CD - Jenkins & docker 2

letthem·2025년 3월 25일

LG CNS AM CAMP 1기

목록 보기
39/42
post-thumbnail

My-Fourth-Pipeline

  • CI/CD 배포 파이프 (자동화 배포/무중단 배포)
  • Jenkins Pipeline 생성 (Groovy)

Step 1) https://github.com/joneconsulting/cicd-web-project 에서 코드 가져와서 빌드

Step 2) 빌드 된 결과물을 docker-server로 전송

Step 3) docker-server에 전송 된 빌드 결과물(hello-world.war)을 이미지 생성

pipeline {
    agent any;
    
    tools {
        maven 'maven3.8.8'
    }
    
    stages {
        stage('git clone') {
            steps {
                git branch: 'main', url: 'https://github.com/joneconsulting/cicd-web-project';
            }
        }
        
        stage('build') {
            steps {
               sh '''
                echo build start
                mvn clean compile package -DskipTests=true
                ''';
            }
        }
        
        stage('transfer') {
            steps {
                sshPublisher(publishers: [
                    sshPublisherDesc(configName: 'docker-server', 
                                    transfers: [sshTransfer(
                                        cleanRemote: false, excludes: '', execCommand: '', 
                                        execTimeout: 600000, flatten: false, makeEmptyDirs: false, 
                                        noDefaultExcludes: false, patternSeparator: '[, ]+', 
                                        remoteDirectory: '.', remoteDirectorySDF: false, 
                                        removePrefix: 'target', sourceFiles: 'target/*.war')], 
                                        usePromotionTimestamp: false, useWorkspaceInPromotion: false, 
                                        verbose: false)])
            }
        }
        
        stage('image build') {
            steps {
                sshPublisher(publishers: [
                    sshPublisherDesc(configName: 'docker-server', 
                                    transfers: [sshTransfer(
                                        cleanRemote: false, excludes: '', 
                                        execCommand: 'docker build --tag hello-world:test1.0 -f Dockerfile .', 
                                        execTimeout: 600000, flatten: false, makeEmptyDirs: false, 
                                        noDefaultExcludes: false, patternSeparator: '[, ]+', 
                                        remoteDirectory: '.', remoteDirectorySDF: false, 
                                        removePrefix: 'target', sourceFiles: 'target/*.war')], 
                                        usePromotionTimestamp: false, useWorkspaceInPromotion: false, 
                                        verbose: true)])
            }
        }
    }
}

복잡하다. Jenkins에서 제공해주는 걸로 더 편하게 사용해보자

💫 My-Pipeline-Params (매개변수와 함께 빌드)

pipeline {
  agent none
  tools {
      maven "maven3.8.8"
  }
  stages {
    stage('Maven Install') {
      agent any
      when {
        expression { params.MAVEN_BUILD == true }
      }
      steps {
        git branch: 'main', url: 'https://github.com/joneconsulting/cicd-web-project'
        sh 'mvn clean compile package -DskipTests=true'
      }
    }
    stage('Docker Image Build') {
      agent any
      when {
        expression { params.DOCKER_BUILD == true }
      }
      steps {
          script {
            if (params.DOCKER_IMAGE_TAG != "") {
                echo "[docker image tag is not null]"
                imageTag = params.DOCKER_IMAGE_TAG
            } else {
                echo "[docker image tag is null]"
                imageTag = env.BUILD_NUMBER
            }
          }
                    
          // sh 'docker build -t edowon0623/cicd-web-project:$BUILD_NUMBER .'
          // sh 'docker build -t edowon0623/cicd-web-project:' + imageTag + ' .'
          echo 'docker build -t edowon0623/cicd-web-project:' + imageTag + ' .'
      }
    }
    // stage('Docker Push') {
    //   agent any
    //   when {
    //     expression { params.DOCKER_PUSH == true }
    //   }
    //   steps {
    //     withDockerRegistry(credentialsId: 'harbor-user', url: 'https://192.168.0.41') {
    //       sh 'docker push 192.168.0.41/devops/cicd-web-project:$BUILD_NUMBER'
    //     }
    //   }
    // }
  }
}

when이면 step을 진행하라
when: 분기문
params: 가변 데이터
참이면 빌드 O 거짓이면 빌드 X
동적으로 imageTag명 변경할 일이 없어짐! good

jenkins server에서 docker build 해야하니 echo로 바꿈

매개변수 추가




console output

build-를 붙여보자

echo 대신 execCommand에 파라미터 넣어보기 🔽

pipeline {
  agent none
  tools {
      maven "maven3.8.8"
  }
  stages {
    stage('Maven Install') {
      agent any
      when {
        expression { params.MAVEN_BUILD == true }
      }
      steps {
        git branch: 'main', url: 'https://github.com/joneconsulting/cicd-web-project'
        sh 'mvn clean compile package -DskipTests=true'
      }
    }
    stage('Docker Image Build') {
      agent any
      when {
        expression { params.DOCKER_BUILD == true }
      }
      steps {
          script {
            if (params.DOCKER_IMAGE_TAG != "") {
                echo "[docker image tag is not null]"
                imageTag = params.DOCKER_IMAGE_TAG
            } else {
                echo "[docker image tag is null]"
                imageTag = env.BUILD_NUMBER
            }
          }
                    
          // sh 'docker build -t edowon0623/cicd-web-project:$BUILD_NUMBER .'
          // sh 'docker build -t edowon0623/cicd-web-project:' + imageTag + ' .'
          // echo 'docker build -t edowon0623/cicd-web-project:build-' + imageTag + ' .'
          sshPublisher(publishers: [
                    sshPublisherDesc(configName: 'docker-server', 
                                    transfers: [sshTransfer(
                                        cleanRemote: false, excludes: '',
                                        execCommand: 'docker build --tag hello-world:' + imageTag + ' -f Dockerfile .', 
                                        execTimeout: 600000, flatten: false, makeEmptyDirs: false, 
                                        noDefaultExcludes: false, patternSeparator: '[, ]+', 
                                        remoteDirectory: '.', remoteDirectorySDF: false, 
                                        removePrefix: 'target', sourceFiles: 'target/*.war')], 
                                        usePromotionTimestamp: false, useWorkspaceInPromotion: false, 
                                        verbose: false)])
      }
    }
    // stage('Docker Push') {
    //   agent any
    //   when {
    //     expression { params.DOCKER_PUSH == true }
    //   }
    //   steps {
    //     withDockerRegistry(credentialsId: 'harbor-user', url: 'https://192.168.0.41') {
    //       sh 'docker push 192.168.0.41/devops/cicd-web-project:$BUILD_NUMBER'
    //     }
    //   }
    // }
  }
}

5 Deployment Strategies

배포 전략

cf) https://dev.classmethod.jp/articles/ci-cd-deployment-strategies-kr/

1️⃣ Big Bang Deployment (빅뱅 배포)

설명: 한 번에 전체 시스템을 새로운 버전으로 교체하는 방식

장점: 단순하고 빠르게 배포 가능

단점: 실패 시 전체 서비스 중단 위험 큼, 롤백 어려움

예시: 밤 12시에 전체 서비스 업데이트 후 새 버전 적용

2️⃣ Rolling Deployment (롤링 배포)

설명: 서버나 인스턴스를 하나씩 순차적으로 새 버전으로 교체하는 방식

장점: 서비스 중단 최소화, 점진적 배포

단점: 배포 도중 구버전과 신버전이 공존 (호환성 이슈 가능)

예시: 10대 서버 중 2대씩 교체하면서 순차적으로 배포

3️⃣ Blue-Green Deployment (블루-그린 배포)

설명: Blue(현재 운영 중)와 Green(새 버전) 두 개의 환경을 두고, 배포 후 트래픽을 Green으로 전환

장점: 빠른 롤백 가능, 배포 후 테스트 용이

단점: 두 개의 완전한 인프라 필요 (비용 증가)

예시: 새 버전 검증 후 트래픽을 Green 환경으로 스위칭

4️⃣ Canary Deployment (카나리아 배포)

설명: 소수의 사용자에게만 새 버전을 먼저 배포 후 문제가 없으면 전체 배포

장점: 실사용자 대상 안정성 검증, 점진적 확대 가능

단점: 트래픽 분배 및 모니터링 시스템 필요

예시: 전체 유저 중 5%만 새 버전 사용 → 이상 없으면 100% 확대

0개의 댓글