티스토리 뷰

파이프라인 문법은 2가지가 있는데 Declarative 방식을 사용 하였습니다

 

젠킨스 설치법,인증생성 방법등 기초적인 내용은 생략 합니다

 

AWS ECR 인증과 github인증은 젠킨스내에 이미 있어야 합니다(credential)

 

슬랙 알람을 사용하려면 슬랙 설정을 해야 합니다

 

아래 파이프라인중 {{}} 안에 내용은 사용자의 맞게 수정하여야 합니다

 

레포는 빌드할 이미지가 있는 소스레포, ArgoCD에서 사용하는 배포용 manifest레포 2가지가 있다고 가정 합니다

 

pipeline {
 environment {
 registry = "{{ECR주소}}/{{레포이름(이미지)}}"
 registryCredential = '{{erc인증용credential}}'
 dockerImage = ''
}
  
  agent any
  stages {
    stage('Cloning Git') {
      steps {
        slackSend (channel: '#{{슬랙채널}}', color: '#00FF00', message: "${env.JOB_NAME}앱의 CI 과정이 시작되었습니다 \n Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})")
        git([url: '{{소스레포지토리의주소}}', branch: '{{브랜치이름}}', credentialsId: '{{깃접속에필요한credential}}'])
          }
            }
    stage('Building Image') {
      steps{
        script {
          dockerImage = docker.build registry + ":$BUILD_NUMBER"
    }
        }
            }
    stage('Testing') {
        steps{
         script {
            dockerImage.inside {
            sh 'node --version'
            }
            }
        }
    }
stage('Push Image') {
    steps{
        script {
        docker.withRegistry( '{{ECR주소}}', registryCredential ) {
        dockerImage.push()
    }
        }
            }
                }
stage('Cleaning Up') {
steps{
sh "docker rmi $registry:$BUILD_NUMBER"
                }
            }
    stage('Deploy') {
    steps{
                    sh 'set +x'
                    sh 'export GIT_SSH_COMMAND="ssh -oStrictHostKeyChecking=no"'
                    sh '{{아르고CD배포용레포주소}} || true'
                    sh "sed -i 's/{{레포이름(이미지)}}:.*\$/{{레포이름(이미지)}}:${env.BUILD_NUMBER}/g' {{deployment의경로}}/deployment.yaml"
                    dir ("{{레포경로}}") {
                        sh 'git add {{레포이름(이미지)}}/deployment.yaml'
                        sh "git commit -m 'updated the image tag to ${env.BUILD_NUMBER}'"
                        sh 'git push'
                        deleteDir()
                }
            }
        }
            
  }   
            
    post {
        success {
            slackSend (channel: '#{{슬랙채널}}', color: '#00FF00', message: "빌드 완료 \n ${env.JOB_NAME}앱의 CI 과정이 성공적으로 끝났습니다 \n Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})")
        }
        failure {
            slackSend (channel: '#{{슬랙채널}}', color: '#00FF00', message: "빌드가 실패하였습니다 \n ${env.JOB_NAME}앱의 젠킨스 콘솔을 확인해주세요 \n Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})")
        }
    }
}

아래는 상세 설명입니다

 

 

먼저 파이프라인의 시작 env 입니다

 

pipeline {
 environment {
 registry = "{{ECR주소}}/{{레포이름(이미지)}}"
 registryCredential = '{{erc인증용credential}}'
 dockerImage = ''
}

 

파이프라인에서 사용할 변수를 지정하여 줍니다

 

registry의 경우 ecr이면 {{계정}}.dkr.ecr.ap-northeast-2.amazonaws.com 이며

이미지는 test-app 식입니다

 

위 예제라면 registry에는 {{계정}}.dkr.ecr.ap-northeast-2.amazonaws.com/test-app 이라고 적어주시면 됩니다

 

registryCredential 부분은 ecr인증용 credential 이름을 적어주면 되고 젠킨스 메뉴 credential에서 ecr권한이 있는 계정의 AWS KEY를 이용한 credential을 생성하여 해당 credential이름을 적어주심 됩니다

 

 

 

스테이지 시작입니다

 

    stage('Cloning Git') {
      steps {
        slackSend (channel: '#{{슬랙채널}}', color: '#00FF00', message: "${env.JOB_NAME}앱의 CI 과정이 시작되었습니다 \n Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})")
        git([url: '{{소스레포지토리의주소}}', branch: '{{브랜치이름}}', credentialsId: '{{깃접속에필요한credential}}'])
          }
            }

소스 레포지토리의 git clone을 제일 먼저 수행합니다. 수행하면서 slack채널에 CI과정이 시작되었다고 알립니다

 

slackSend기능을 이용하기 위해서는 젠킨스에 플러그인과 적절한 slack설정이 필요 합니다

 

슬랙 알람 이후에 소스레포를 내려 받습니다 url에 레포주소를, branch는 사용할브랜치(ex, master,develop 등) 을 적어주시고

 

credentialsId에는 github접속시 사용할 credential이름을 적어줍니다 이 cred역시 마찬가지로 사전에 젠킨스에서 생성하여야 합니다

 

 

빌드와 테스트 PUSH과정

 

    stage('Building Image') {
      steps{
        script {
          dockerImage = docker.build registry + ":$BUILD_NUMBER"
    }
        }
            }
    stage('Testing') {
        steps{
         script {
            dockerImage.inside {
            sh 'node --version'
            }
            }
        }
    }
    stage('Push Image') {
    steps{
        script {
        docker.withRegistry( '{{ECR주소}}', registryCredential ) {
        dockerImage.push()
    }

내려받은 레포지토리안에 있는 Dockerfile로 docker build를 수행합니다 처음 설정한 registry 이름과 :빌드 넘버로 이미지가 빌드 되어집니다

 

테스팅 부분은 임의로 넣은것이니 필요하면 수정하여 사용하세요

 

테스트까지 마쳤으면 ECR로 빌드된 이미지를 PUSH 합니다

 

Clean UP과 배포용 Repo의 이미지 태그 변경 작업

 

이제 새로운 버전을 가진 앱이 ECR에 업데이트 되었으므로 배포용 repo에 해당앱의 deployment파일에 이미지 넘버를 수정하는 작업을 수행 합니다

 

stage('Cleaning Up') {
steps{
sh "docker rmi $registry:$BUILD_NUMBER"
                }
            }
    stage('Deploy') {
    steps{
                    sh 'set +x'
                    sh 'export GIT_SSH_COMMAND="ssh -oStrictHostKeyChecking=no"'
                    sh '{{아르고CD배포용레포주소}} || true'
                    sh "sed -i 's/{{레포이름(이미지)}}:.*\$/{{레포이름(이미지)}}:${env.BUILD_NUMBER}/g' {{deployment의경로}}/deployment.yaml"
                    dir ("{{레포경로}}") {
                        sh 'git add {{레포이름(이미지)}}/deployment.yaml'
                        sh "git commit -m 'updated the image tag to ${env.BUILD_NUMBER}'"
                        sh 'git push'
                        deleteDir()
                }
            }
        }
            
  }

 

Cleanup 스테이지는 방금 생성된 이미지를 로컬에서 삭제 합니다

 

deploy과정에서는 소스레포가 아닌 배포용 레포를 내려받고

 

배포용 레포의 해당앱 deployment.yaml 내 이미지 버전 이름을 빌드넘버로 sed를 이용하여 수정, 이후 git push로 커밋합니다

 

커밋이후에는 ArgoCD를 통해 deploy됩니다

 

 

마지막으로 post(알람) 입니다

 

    post {
        success {
            slackSend (channel: '#{{슬랙채널}}', color: '#00FF00', message: "빌드 완료 \n ${env.JOB_NAME}앱의 CI 과정이 성공적으로 끝났습니다 \n Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})")
        }
        failure {
            slackSend (channel: '#{{슬랙채널}}', color: '#00FF00', message: "빌드가 실패하였습니다 \n ${env.JOB_NAME}앱의 젠킨스 콘솔을 확인해주세요 \n Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})")
        }
    }
}

파이프라인 성공시 빌드완료 메시지를, 실패시 실패 메시지를 슬랙에 남깁니다

 

 

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함