Jenkins - 3 ( Jenkins Pipeline 및 Jenkins CI )

HD.Y·2024년 2월 26일
0

미니 팀 프로젝트

목록 보기
3/3
post-thumbnail

🐸 데브옵스 프로젝트를 진행하며 작성한 코드 정리 ( Test 코드 제외 )

  • 💡프론트엔드 Jenkins file
pipeline {
    agent any
    
    // ✅ 파이프라인의 실행 단계 정의
    stages {

        // 1. 깃 클론❗
        stage('git clone') {
                steps {
                        git branch: 'main', url: 'https://github.com/hyungdoyou/devops'
                }
        }

        // 2. 프로젝트에 필요한 패키지 설치❗
        stage('Install Dependencies') {
            steps {
                script {
                    sh 'npm install'
                }
            }
        }
        
        // 3. 기존에 생성되어 있는 dist 폴더 삭제❗
        stage('Delete Exist file') {
            steps {
                script {
                    sh 'rm -rf /var/lib/jenkins/workspace/k8s-frontend/dist'
                }
            }
        }

        // 4. 새로운 프로젝트 빌드❗
        stage('Build') {
            steps {
                script {
                    sh 'npm run build'
                }
            }
        }

        // 5. Docker 빌드❗
        stage('Docker Build') {
            steps {
                script {
                    sh 'docker build --tag hyungdoyou/fe:3.$BUILD_NUMBER .'
                }
            }
            post {
                // Docker 빌드 성공 시 슬랙 채널 ( #테스트 ) 로 성공 알림 발송❗
                success {
                    slackSend(
                        channel: '#테스트', 
                        color: 'good', 
                        message: "Docker image hyungdoyou/fe:3.${BUILD_NUMBER} build success.", 
                        teamDomain: 'jenkins-alert-hq', 
                        tokenCredentialId: 'slack-jenkins-token')
                }
                // Docker 빌드 실패 시 슬랙 채널 ( #테스트 ) 로 실패 알림 발송❗
                failure {
                    slackSend(
                        channel: '#테스트', 
                        color: 'danger', 
                        message: "Docker image hyungdoyou/fe:3.${BUILD_NUMBER} build failed.", 
                        teamDomain: 'jenkins-alert-hq', 
                        tokenCredentialId: 'slack-jenkins-token')
                }
            }
        }

        // 6. Docker Push❗
        stage('Docker Push') {
            steps {
                script {
                    // Docker 로그인❗
                    withCredentials([usernamePassword(credentialsId: 'docker_credentials', usernameVariable: 'DOCKER_EMAIL', passwordVariable: 'DOCKER_PASSWORD')]) {
                        sh "docker login -u ${DOCKER_EMAIL} -p ${DOCKER_PASSWORD}"
                    }
                    // Docker Push❗
                    sh 'docker push hyungdoyou/fe:3.$BUILD_NUMBER'
                }
            }
            post {
                // Docker Push 성공 시 슬랙 채널 ( #테스트 ) 로 성공 알림 발송❗
                success {
                    slackSend(
                        channel: '#테스트', 
                        color: 'good', 
                        message: "Docker image hyungdoyou/fe:3.${BUILD_NUMBER} push success.", 
                        teamDomain: 'jenkins-alert-hq', 
                        tokenCredentialId: 'slack-jenkins-token')
                }
                // Docker Push 실패 시 슬랙 채널 ( #테스트 ) 로 실패 알림 발송❗
                failure {
                    slackSend(
                        channel: '#테스트', 
                        color: 'danger', 
                        message: "Docker image hyungdoyou/fe:3.${BUILD_NUMBER} push failed.", 
                        teamDomain: 'jenkins-alert-hq', 
                        tokenCredentialId: 'slack-jenkins-token')
                }
            }
        }
        // 7. SSH 전송❗
        stage('SSH transfer') {
            steps {
                // SSH 전송 플러그인 사용
                sshPublisher(
                    // 오류 발생 시 진행을 멈춤
                    continueOnError: false,
                    // 오류 발생 시 파이프라인을 실패시킴
                    failOnError: true,
                    // 전송자 목록
                    publishers: [
                        // SSH 전송 설명
                        sshPublisherDesc(
                            // SSH 서버 설정 이름 지정 ( master 노드 )
                            configName: "k8s-master",
                            // 자세한 출력 모드 활성화
                            verbose: true,
                            transfers: [
                                sshTransfer(
                                    // 전송할 파일 지정
                                    sourceFiles: "frontend-deployment.yml",
                                    // 원격 디렉토리 지정 ( 원격서버로 파일을 전송할 위치 )
                                    remoteDirectory: "/root/",
                                    // 전송 후 야멜 파일의 VERSION을 파이프라인 빌드 숫자로 변경
                                    // backend-deployment 야멜 파일 실행
                                    execCommand: '''
                                        sed -i "s/VERSION/$BUILD_ID/g" /root/frontend-deployment.yml
                                        kubectl apply -f /root/frontend-deployment.yml
                                    '''
                                )
                            ]
                        )
                    ]
                )
            }
            post {
                // SSH Transfer 성공 시 슬랙 채널 ( #테스트 ) 로 성공 알림 발송❗
                success {
                    slackSend(
                        channel: '#테스트', 
                        color: 'good', 
                        message: "frontend-deployment.yml transfer success.", 
                        teamDomain: 'jenkins-alert-hq', 
                        tokenCredentialId: 'slack-jenkins-token')
                }
                // SSH Transfer 실패 시 슬랙 채널 ( #테스트 ) 로 실패 알림 발송❗
                failure {
                    slackSend(
                        channel: '#테스트', 
                        color: 'danger', 
                        message: "frontend-deployment.yml transfer failed.", 
                        teamDomain: 'jenkins-alert-hq', 
                        tokenCredentialId: 'slack-jenkins-token')
                }
            }
        }
        // 8. 슬랙 알림❗
        stage('Slack Notification') {
            steps {
                script {
                    // 파이프라인 단계가 끝나고 슬랙으로 최종 알림 발송
                    slackSend(channel: '#젠킨스알림', message: "Build version : ${env.BUILD_NUMBER} is finally successful!", teamDomain: 'hooks.slack.com', token: '/services/T06KN5J31HD/B06L8GV2MTL/15TDN2G6g6FfFaq1cgRqrZ5j')
                    slackSend(
                        channel: '#테스트', 
                        color: 'good',
                        message: "Build version : ${env.BUILD_NUMBER} is finally successful!", 
                        teamDomain: 'jenkins-alert-hq', 
                        tokenCredentialId: 'slack-jenkins-token'
                        )
                }
            }
        }
    }
}

  • 💡백엔드 Jenkins file
pipeline {
    agent any
    
    // 파이프라인 실행에 필요한 도구로 maven 지정❗
    tools {
        maven "maven-3.9.5"
    }

    // 파이프라인의 실행 단계 정의❗
    stages {

        // 1. 깃 클론❗
        stage('git clone') {
            steps {
                git branch: 'main', url: 'https://github.com/hyungdoyou/devops-backend'
            }
        }
        
        // 2. maven 빌드❗
        stage('Build') { 
            steps {
                sh 'mvn -B -DskipTests clean package' 
            }
        }

        // 3. Docker 빌드❗
        stage('Docker Build') {
            steps {
                script {
                    // 도커 이미지 : hyungdoyou/be:2.[빌드 숫자]
                    sh 'docker build --tag hyungdoyou/be:2.$BUILD_NUMBER .'
                }
            }
            post {
                // Docker 빌드 성공 시 슬랙 채널 ( #테스트 ) 로 성공 알림 발송❗
                success {
                    slackSend(
                        channel: '#테스트', 
                        color: 'good', 
                        message: "Docker image hyungdoyou/be:2.${BUILD_NUMBER} build success.", 
                        teamDomain: 'jenkins-alert-hq', 
                        tokenCredentialId: 'slack-jenkins-token')
                }

                // Docker 빌드 실패 시 슬랙 채널 ( #테스트 ) 로 실패 알림 발송❗
                failure {
                    slackSend(
                        channel: '#테스트', 
                        color: 'danger', 
                        message: "Docker image hyungdoyou/be:2.${BUILD_NUMBER} build failed.", 
                        teamDomain: 'jenkins-alert-hq', 
                        tokenCredentialId: 'slack-jenkins-token')
                }
            }
        }

        // 4. Docker Push❗
        stage('Docker Push') {
            steps {
                script {
                    // Docker 로그인
                    withCredentials([usernamePassword(credentialsId: 'docker_credentials', usernameVariable: 'DOCKER_EMAIL', passwordVariable: 'DOCKER_PASSWORD')]) {
                        sh "docker login -u ${DOCKER_EMAIL} -p ${DOCKER_PASSWORD}"
                    }
                    // Docker Push❗
                    sh 'docker push hyungdoyou/be:2.$BUILD_NUMBER'
                }
            }
            post {
                // Docker Push 성공 시 슬랙 채널 ( #테스트 ) 로 성공 알림 발송❗
                success {
                    slackSend(
                        channel: '#테스트', 
                        color: 'good', 
                        message: "Docker image hyungdoyou/fe:3.${BUILD_NUMBER} push success.", 
                        teamDomain: 'jenkins-alert-hq', 
                        tokenCredentialId: 'slack-jenkins-token')
                }
                // Docker Push 실패 시 슬랙 채널 ( #테스트 ) 로 실패 알림 발송❗
                failure {
                    slackSend(
                        channel: '#테스트', 
                        color: 'danger', 
                        message: "Docker image hyungdoyou/fe:3.${BUILD_NUMBER} push failed.", 
                        teamDomain: 'jenkins-alert-hq', 
                        tokenCredentialId: 'slack-jenkins-token')
                }
            }
        }

        // 5. SSH 전송❗
        stage('SSH transfer') {
            steps {
                // SSH 전송 플러그인 사용
                sshPublisher(
                    // 오류 발생 시 진행을 멈춤
                    continueOnError: false, 
                    // 오류 발생 시 파이프라인을 실패시킴
                    failOnError: true,
                    // 전송자 목록
                    publishers: [
                        // SSH 전송 설명
                        sshPublisherDesc(
                            // SSH 서버 설정 이름 지정 ( master 노드 )
                            configName: "k8s-master",
                            // 자세한 출력 모드 활성화
                            verbose: true,
                            transfers: [
                                sshTransfer(
                                    // 전송할 파일 지정
                                    sourceFiles: "backend-deployment.yml",
                                    // 원격 디렉토리 지정 ( 원격서버로 파일을 전송할 위치 )
                                    remoteDirectory: "/root/",
                                    // 전송 후 야멜 파일의 VERSION을 파이프라인 빌드 숫자로 변경
                                    // backend-deployment 야멜 파일 실행
                                    execCommand: '''
                                        sed -i "s/VERSION/$BUILD_ID/g" /root/backend-deployment.yml
                                        kubectl apply -f /root/backend-deployment.yml
                                    '''
                                )
                            ]
                        )
                    ]
                )
            }
            post {
                // SSH Transfer 성공 시 슬랙 채널 ( #테스트 ) 로 성공 알림 발송❗
                success {
                    slackSend(
                        channel: '#테스트', 
                        color: 'good', 
                        message: "frontend-deployment.yml transfer success.", 
                        teamDomain: 'jenkins-alert-hq', 
                        tokenCredentialId: 'slack-jenkins-token')
                }
                // SSH Transfer 실패 시 슬랙 채널 ( #테스트 ) 로 실패 알림 발송❗
                failure {
                    slackSend(
                        channel: '#테스트', 
                        color: 'danger', 
                        message: "frontend-deployment.yml transfer failed.", 
                        teamDomain: 'jenkins-alert-hq', 
                        tokenCredentialId: 'slack-jenkins-token')
                }
            }
        }
        // 6. 슬랙 알림❗
        stage('Slack Notification') {
            steps {
                script {
                    // 파이프라인 단계가 끝나고 슬랙으로 최종 알림 발송
                    slackSend(
                        channel: '#테스트', 
                        color: 'good',
                        message: "Build version : ${env.BUILD_NUMBER} is finally successful!", 
                        teamDomain: 'jenkins-alert-hq', 
                        tokenCredentialId: 'slack-jenkins-token'
                        )
                }
            }
        }
    }
}

🐮 Jenkins CI를 이용한 Slack 알람 발송

1. Slack 채널 오른쪽 클릭 ➡ 채널 세부정보 보기 ➡ 통합 ➡ 앱추가 클릭


2. Jenkins CI 앱 추가 클릭


3. 채널 선택 후 Jenkins CI 통합 앱 추가 클릭


4. 3단계의 "팀 하위 도메인" 과 "통합 토큰 자격 증명 ID" 를 적어두고 저장한다.


5. Jenkins 대시보드에서 Jenkins 관리의 Plugins 클릭


6. Slack Notification 플러그인을 설치한다.


7. Jenkins 관리의 Credentials에서 "Add Credentials"를 클릭한다.
 ➡ Secret text 선택 후 Secret 에는 위에서 발급받은 토큰 자격 증명 ID를 입력한다.


8. Jenkins file 에서 아래와 같이 슬랙 알람 발송 코드를 작성한다.

                    slackSend(
                        channel: '#젠킨스알림',  // 슬랙 채널 명
                        color: 'good', // good, warn, danger 등이 있다.
                        message: "Build version : ${env.BUILD_NUMBER} is finally successful!", 
                        teamDomain: 'jenkins-XXXX-XX', // Jenkins CI 추가 시 3단계에서 저장해놨던 것
                        tokenCredentialId: 'test'  // 위에서 생성한 Credentials 이름
                        )
profile
Backend Developer

0개의 댓글