[DevOps] Jenkins Github Multi Branch Pipe Line ๊ตฌ์„ฑ

2022. 9. 1. 02:42ใ†System ์ž‘์—…์‹ค/DevOps

728x90
๋ฐ˜์‘ํ˜•




๐Ÿ—‚ ๋ชฉ์ฐจ

โ— [Synology NAS] ๋‚˜๋งŒ์˜ GitHub ๋งŒ๋“ค๊ธฐ - Git Server์™€  Gitea ์„ค์น˜
โ— [Synology NAS] ๋‚˜๋งŒ์˜ Jenkins ๋งŒ๋“ค๊ธฐ 
โ—[DevOps] GitHub์™€ Jenkins ์—ฐ๊ฒฐ  
โ— [DevOps] Jenkins Build ๋‚ด์šฉ Slack ์œผ๋กœ ์•Œ๋ฆผ ๋ฐ›๊ธฐ
 
โ— [DevOps] Jenkins Github Multi Branch Pipe Line ๊ตฌ์„ฑ

 




๐Ÿš€ Github push ์‹œ ์ž๋™ Build ๋ฐฐํฌ

    ๐Ÿ”ฝ  Webhook ์ƒ์„ฑ

        ๐Ÿ“ฆ Github ์ž‘์—…

์ตœ์ดˆ ๋Œ€์ƒ Repository์— N๊ฐœ์˜ Branch๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

 

 

Git Flow Branch ๊ด€๋ฆฌ ์ „๋žต์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ํŠน์ • Branch์— ๋Œ€ํ•ด push๋‚˜, Pull Request๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ๋งˆ๋‹ค, Test์™€ Build๋ฅผ ์ ์šฉํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.



์ตœ์ดˆ ๋Œ€์ƒ Repository์— Settings์— ๋“ค์–ด๊ฐ€ ์ค๋‹ˆ๋‹ค.



Webhook์„ ๋งŒ๋“ค์–ด ๋ณด๋„๋ก ํ• ๊ฒŒ์š”.




์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์ ์€ payload URL์— github-webhook ๋’ค์— ๊ผญ / ์ด๊ฑธ ๋ถ™ํ˜€์ค˜์•ผ ์ •์ƒ ์—ฐ๊ฒฐ ๋œ๋‹ค๋Š” ์ ์ด์—์š”.



์ด๋ ‡๊ฒŒ ์ดˆ๋ก์ƒ‰ Check ๋ชจ์–‘์ด ๋‚˜์™€์•ผ ์ •์ƒ์ž…๋‹ˆ๋‹ค.



์œ„์™€ ๊ฐ™์ด ์„ค์ •ํ•˜๊ณ , Add Webhook์„ ๋ˆŒ๋Ÿฌ์ค๋‹ˆ๋‹ค.



๋ฐ˜์‘ํ˜•

 

 

    ๐Ÿ”ฝ  Jenkins

        ๐Ÿ“ฆ Jenkins ์„ค์ •

์ตœ์ดˆ ์ƒˆ๋กœ์šด Item์„ ๋ˆŒ๋Ÿฌ ์ค๋‹ˆ๋‹ค.



Item์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๊ณ , Multibranch Pipeline์„ ์„ ํƒํ•œ ๋’ค OK๋ฅผ ๋ˆŒ๋Ÿฌ์ค๋‹ˆ๋‹ค.




์œ„์™€ ๊ฐ™์ด GitHub๋ฅผ ์„ ํƒํ•ด ์ฃผ์„ธ์š”.



Add Button์„ ๋ˆ„๋ฅธ ๋’ค ์œ„์—์„œ ์ž…๋ ฅํ•œ Item ์ด๋ฆ„์„ ์„ ํƒํ•ด ์ฃผ์„ธ์š”.



Kind๋Š” Username with Password๋กœ ์„ ํƒํ•˜์—ฌ ์ค๋‹ˆ๋‹ค.




Username : github NickName
Password Github Access Token (๋ฐœ๊ธ‰ ๋ฐ›๋Š” ๋ฐฉ๋ฒ•)


์œ„์˜ ๋‚ด์šฉ์„ ์ž…๋ ฅํ•œ ๋’ค Add๋ฅผ ๋ˆŒ๋Ÿฌ์ค๋‹ˆ๋‹ค.



์œ„์—์„œ ๋งŒ๋“  ๊ณ„์ •์„ Credentials์—์„œ ์„ ํƒํ•ด ์ฃผ๊ณ , Repository HTTPS URL์€ ์—ฐ๋™ ์‹œํ‚ฌ Github Repository Https ์ฃผ์†Œ๋ฅผ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋’ค Validate Button์„ ๋ˆŒ๋Ÿฌ ์ •์ƒ ์—ฐ๊ฒฐ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ ํ•ฉ๋‹ˆ๋‹ค.


pipeline {
    agent any

    environment {
        PATH = "/opt/gradle/gradle-6.8/bin:$PATH"
        SLACK_CHANNEL = '#jenkins'
        TEAM_DOMAIN = 'black-postoffice'
        TOKEN_CREDENTIAL_ID = 'junghyungil-Slack'

    }

    stages {

        stage('Start') {
            steps {
                slackSend (channel: SLACK_CHANNEL, color: '#FFFF00', message: "STARTED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})", teamDomain: TEAM_DOMAIN, tokenCredentialId: TOKEN_CREDENTIAL_ID )
            }
        }

        stage('Git Checkout') {
            steps {
                checkout scm
                echo 'Git Checkout Success!'
            }
        }
		
        // Build๋ผ๋Š” ์ด๋ฆ„์˜ ์Šคํ…Œ์ด์ง€ ๋ธ”๋ก ์ƒ์„ฑ ๋’ค
        stage('Build') {
            steps {
                script {
                        try{
                            // Build๋œ File์„ ์ง€์› ๋‹ค๊ฐ€ ๋‹ค์‹œ ์ƒˆ๋กœ์šด Build ์‹คํ–‰ ๋ช…๋ น์–ด(gradle clean build)
                            // ์ž์‹ ์ด ์ž‘์„ฑํ•œ Test Code ์™ธ์— ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ž‘์„ฑํ•œ Test Code์— ๊ด€ํ•ด Build ์‹œ Test Skip (--exclude-task test)
                            sh 'gradle clean build --exclude-task test'
                            echo 'Build Success!'
                        } catch (e) {
                            sh 'echo Build Fail'
                        }
                }
            }
        }

        stage('Test') {
            steps {
                script {
                    try {
                    sh 'gradle test'
                    echo 'Test Success!'
                    } catch(e) {
                        sh 'echo Test Fail'
                    }
                }
            }
        }

    }

  post {
    success {
         slackSend (channel: SLACK_CHANNEL, color: '#00FF00', message: "SUCCESSFUL: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})", teamDomain: TEAM_DOMAIN, tokenCredentialId: TOKEN_CREDENTIAL_ID )
         }

    failure {
         slackSend (channel: SLACK_CHANNEL, color: '#F01717', message: "FAILURE: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})", teamDomain: TEAM_DOMAIN, tokenCredentialId: TOKEN_CREDENTIAL_ID )
         }
    }
}
728x90


Java Spring Project root Directory์— Jenkinsfile-ci๋ฅผ ๋งŒ๋“ค๊ณ , ์œ„์˜ ๊ฐ’์„ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์œ„์˜ Code๋Š” ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” Jenkinsfile ์ž…๋‹ˆ๋‹ค.

Tyr Catch๋กœ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๋ถ€๋ถ„์„ ๊ฐ€๋ ค์„œ ๋™์ž‘ํ•˜๊ฒŒ ํ•ด ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.
(์™„๋ฒฝํ•œ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์ด ์•„๋‹ˆ๋ฏ€๋กœ, ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค)





์œ„์˜ Jenkinsfile์ด ์œ„์น˜ํ•œ ๊ณณ์„ ์ž…๋ ฅํ•ด ์ค๋‹ˆ๋‹ค.

 

 

 

    ๐Ÿ”ฝ  Github

        ๐Ÿ“ฆ Push ํ•ด๋ณด๊ธฐ

 

์œ„์™€ ๊ฐ™์ด Code๋ฅผ ์ž…๋ ฅํ–ˆ์–ด์š”.

 

Github์— Source Code๋ฅผ push ํ•ด๋ณผ๊ฒŒ์š”.









์œ„์™€ ๊ฐ™์ด Branch๋„ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๊ณ , Push๋ฅผ ํ•˜๋ฉด ์ž๋™์œผ๋กœ ์•Œ์•„์„œ Build๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ’ก ์ฐธ๊ณ  ์‚ฌํ•ญ

Jenkins Plugin ์ค‘ blue Ocean์„ ์„ค์น˜ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ข€ ๋” ์ง๊ด€์ ์ธ ํ™”๋ฉด์œผ๋กœ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์–ด์š”.




 

 

 

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•