[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
๋ฐ์ํ