CI-CD

Jenkins - Approval Stage 구현

Operation CWAL 2021. 3. 5. 17:10

빌드 및 테스트 완료 후, Production 환경에 업데이트 된 버전을 배포하기 전에 사용자의 별도의 승인을 요청하는 케이스를 생각할 수 있다.

 

우선 승인 요청이 발생했다는 사실을 Email, Slack, Jira 등으로 사용자에게 전달한 뒤,  파이프라인을 일시중지한 상태에서 진행/중단 입력을 기다리는게 이 동작의 핵심이다. 이번 시간엔 이메일을 보내고 사용자의 승인을 기다리는 시나리오로 진행해보자.

 

Email Extension

우선 이메일을 보내기 위해 Email Extension 플러그인이 필요하다. 아직 설치하지 않은 경우, Jenkins Plugin Manager를 통해 쉽게 추가할 수 있다.

설치가 완료됐다면, 해당 플러그인의 SMTP 서버를 세팅해야 한다. 'Jenkins 관리' > '시스템 설정' > 'Extended E-mail Notification' 메뉴에서 설정 가능하다. 보통은 사내에 위치한 SMTP 서버 정보를 입력하면 되지만, 이번 실습은 집에 구축한 테스트 환경이므로 Gmail 서버로 대신한다. Gmail을 SMTP 서버로 사용하는 방법에 대해선 링크를 참고하기 바란다.

 

 

다음은 본격적으로 Pipeline을 정의할 차례다. 아래와 같이 Jenkinsfile을 작성하였다.

pipeline {
    agent any
    stages {
        stage('Checkout') {
            steps {
                script {
                    echo 'Checkout'
                }
            }
        }
        stage('Build') {
            steps {
                script {
                    echo 'Build'
                }
            }
        }
        stage('Test') {
            steps {
                script {
                    echo 'Test'
                }
            }
        }
        stage('Approve') {
            steps {
                emailext mimeType: 'text/html',
                 subject: "[Jenkins] Approval Request from ${currentBuild.fullDisplayName}",
                 to: "cure4itches@gmail.com",
                 body: '''<a href="${BUILD_URL}input">Please check this approval request.</a>'''
                
                script {
                    def userInput = input id: 'userInput',
                                        message: 'Deploy to production?', 
                                        submitterParameter: 'submitter',
                                        submitter: 'admin',
                                        parameters: [
                                            [$class: 'TextParameterDefinition', defaultValue: '1.0', description: 'Image Tag', name: 'tag'],
                                            [$class: 'TextParameterDefinition', defaultValue: 'BAR', description: 'Environment', name: 'FOO']
                                        ]

                    echo ("Env: "+userInput['tag'])
                    echo ("Target: "+userInput['FOO'])
                    echo ("submitted by: "+userInput['submitter'])
                }
            }
        }
        stage('Deploy') {
            steps {
                script {
                    echo 'Deploy'
                }
            }
        }
    }
}

 

해당 파이프라인을 빌드할 경우, 아래와 같이 Approve 스테이지에서 일시중지된 상태에서 아래와 같은 팝업이 발생한다.

그리고 메일함을 열어보니 아래와 같은 이메일이 Jenkins로부터 발송되었다.

이메일 본문의 링크를 선택, Jenkins로 이동하면 아래와 같은 메뉴를 확인할 수 있다.

사용자가 원하는 Input 값을 입력 후 Proceed를 누르면 나머지 Stage(ex: Deploy)를 진행하며, Abort를 선택할 경우 현재 빌드는 즉시 중단된다. 아래는 Proceed를 선택했을 때의 로그 메시지이다.

이제 위 Jenkinsfile 스크립트를 활용하여, 파이프라인마다 사용자에게 알림 전송 후 반응을 기다리는 스테이지를 추가할 수 있다.

 

참고

Pipeline: Input Step

Is there a way to insert a manual approval for Build pipeline 1.5.8 version in jenkins 2

'CI-CD' 카테고리의 다른 글

Argo Workflows - (2) Core Concepts  (0) 2021.07.04
Argo Workflows - (1) Introduction  (0) 2021.07.01
Jenkins - Container 기반 Agent  (0) 2021.03.03
Jenkins Pipeline  (0) 2021.03.01
kustomize를 활용한 Manifest 관리  (0) 2021.02.24