2022. 9. 15. 06:27ใSystem ์์ ์ค/DevOps
์ด ๋ด์ฉ์ ์ธํ๋ฐ - Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ ๊ฐ์๋ฅผ ๋ณด๊ณ ์ ๋ฆฌํ ๋ด์ฉ ์
๋๋ค.
ํด๋น ๋ด์ฉ์ Code ๋ด์ฉ์ ์ด ๊ณณ์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
๐ ๋ชฉ์ฐจ
โ [DevOps] Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ - ์๋ํ ๋๊ตฌ์ ์ฌ์ฉ
โ [DevOps] Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ - Jenkins + Infrastructure as Code ์์ ์ฐ๋
โ [DevOps] Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ - Jenkins + Ansible + Kubernetes ์์ ์ฐ๋
โ [DevOps] Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ - Advenced Jenkins ์ฌ์ฉ โ - Pipeline
โ [DevOps] Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ - Advenced Jenkins ์ฌ์ฉ โก - SonarQube
โ [DevOps] Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ - Advenced Jenkins ์ฌ์ฉ โข - Multi Nodes
โ [DevOps] Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ - ์์ฉ ํด๋ผ์ฐ๋ ํ๊ฒฝ์ ๋ฐฐํฌํ๊ธฐ
โ [DevOps] Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ - ๋ถ๋ก
๐ Jenkins ๊ฐ์ง๊ณ ๋๊ธฐ
๐ฝ Pipeline
๐ฆ Delivery Pipeline ์ฌ์ฉ
์ต์ด Jenkins์ Plugin์ ํ๋ ์ค์นํด ์ค๊ฒ์.
์์ Plugin์ ์ค์นํด ์ฃผ์์ด์.
ํด๋น Plugin์ ์ค์นํ๋ฉด ์์ ๊ฐ์ด '์๋ก์ด ๋ทฐ'๋ผ๋ ์น๊ตฌ๊ฐ ์๊ฒจ์.
์ฐ์์ ์ธ ์ธ ๊ฐ์ Project๊ฐ ์์ ๋,
์ฃผ๋ํ๋์ [DevOps] Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ - Jenkins + Ansible + Kubernetes ์์ ์ฐ๋ ์์ '๋น๋ ํ ์กฐ์น'์ ๋ค์ Project๋ฅผ ๊ธฐ๋ํ๊ฒ ์ค์ ํด ์ค์ผ๋ก ์ฐ์์ ์ธ Build๊ฐ ์ผ์ด๋๊ฒ ํ ์ ์๋ค๋ ๊ฑธ ๊ณต๋ถํ์ด์.
์ด๋ฒ์๋ ์์ ๊ฐ์ด ์๋ก์ด ๋ทฐ์์ ์ฒซ๋ฒ์งธ Project๋ฅผ Initial Job์ ๋ฃ์ด์ฃผ์์ด์.
์์ ๊ฐ์ด ์ค์ ์ ํ๊ฒ ๋๋ฉด ์ฐ์์ ์ผ๋ก ์งํ๋๋
Project๋ค์ ์งํ ์ฌํญ์ ์์ ๊ฐ์ด ์๊ฐํ ํ์ฌ ๋ณด๋ค ํธ๋ฆฌํ๊ฒ ์ด์ฉํ ์ ์์ด์.
์ต์ด ์์ ๊ฐ์ด '์๋ก์ด ๋ทฐ'์์ ์ด๋ฆ์ ์ง์ ํด ์ฃผ๊ณ , Delivery Pipeline View๋ฅผ ์ ํํด ์ฃผ์์ด์.
๊ทธ๋ฐ ๋ค Create๋ฅผ ๋๋ฌ์ฃผ์์ต๋๋ค.
๋ฐ์ผ๋ก ์คํฌ๋กค์ ๋ด๋ฆฌ๋ฉด ์์ ๊ฐ์ด Piplines์ Componentes๊ฐ ์๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
'์ถ๊ฐ' ๋ฒํผ์ ๋๋ฌ์ค๋๋ค.
Name์๋ ์์ ๋กญ๊ฒ ์ด๋ฆ์ ์ง์ ํด ์ฃผ๊ณ , Initial Job ์ฆ, ์ต์ด ์ํ๋ Project๋ฅผ ์ ํ์ ํด์ฃผ๋ฉด ๋์.
์ ์ฅ์ ๋๋ฅด๊ณ , ํด๋น ์ฐฝ์ ๋์์ค๋๋ค.
๊ทธ๋ผ ์์ ๊ฐ์ด ํ์ธํ ์ ์์ด์.
๐ฆ Delivery Pipeline Script ์ฌ์ฉํ๊ธฐ
1. Pipe Line Script ์์ฑ ๋ฐฉ์ ๋๊ฐ์ง
1) Declarative
2) Scripted (Groovy + DSL)
2. ์ฐจ์ด์
- ์์ ์ ์ ํจ์ฑ ๊ฒ์ฌ ์ ๋ฌด
- ํน์ Stage ์คํ ๊ฐ๋ฅ ์ฌ๋ถ
- ์ ์ด๋ฌธ
- Option
- ๊ฐ๊ฐ์ Pipe Line์ ์งํํ๋ค๊ฐ ์ด๋ค ์์
์ด ์คํจํ์ ๋, Declarative ๋ฐฉ์์ ๊ทธ ๋ค์ ๋จ๊ณ๋ฅผ ์งํํ์ง ์๊ณ ,
Scripted ๋ฐฉ์์ ๊ทธ ๋ค์ ๋จ๊ณ๋ฅผ ์งํ.
Declarative ๋ฐฉ์
pipeline {
agent any
stage {
steps('build') {
//
}
steps('test') {
//
}
steps('deploy') {
//
}
}
1. agnet : Jenkins Server๋ฅผ ๊ธฐ๋ํ ๋, Master Server์ Slave Server๋ก ๊ตฌ์ฑํ ์ ์๋๋ฐ, ์ด๋ค Server์
Jenkins๋ฅผ ์คํํ ์ง๋ฅผ ์ง์ . any๋ฅผ ์ง์ ํ์ ๋๋ ๊ตฌ์ฑ๋ Server ์ค ์ด๋ค Server๋ ๊ด๊ณ ์์ผ๋
์คํํ๊ฒ ๋ค๋ ์๋ฏธ.
2. Stages : ๊ตฌ์ฑํ๊ณ ์ ํ๋ ๊ฐ๊ฐ์ ๋จ๊ณ์ ๋ํ ๋ด์ฉ์ ์ฝ์
.
1)build: build Stage ์ ์ธ ๋ฐ ํ์์ build Stage์ ํ์ํ ์์
๋ช
๋ น์ด ๋ฑ ์
๋ ฅ.
2)test: test Stage ์ ์ธ ๋ฐ ํ์ test Stage์ ํ์ํ ์์
๋ช
๋ น์ด ๋ฑ ์
๋ ฅ.
3)deploy: deploy Stage ์ ์ธ ๋ฐ ํ์ deploy Stage์ ํ์ํ ์์
๋ช
๋ น์ด ๋ฑ ์
๋ ฅ.
์์ ๊ฐ์ด Jenkinsfile์ ๋ง๋ค์๊ณ , ๊ฐ๋จํ๊ฒ ๊ฐ ๋จ๊ณ๋ณ๋ก ๋ฌธ์์ด์ ์ถ๋ ฅํ๋๋ก ๋ง๋ค์ด ์ฃผ์์ด์.
git์ Push๋ฅผ ํ๋ ์๊ฐ Jenkins๋ฅผ ์๋ํ๊ฒ ๋๊ณ , ์์ ๊ฐ์ด ์์
์ด ์ฑ๊ณตํ ๊ฒ์ ํ์ธ ํ ์ ์์ด์.
3. post : stages ๋จ๊ณ ์ฆ, Build ์์
์ ๋ง์ณค์ ๋, ๊ทธ ์ดํ ์์
์ ๋ํด ๋ช
์
1) always : ์์
์ฑ๊ณต ์ฌ๋ถ์ ๊ด๊ณ ์์ด ํด๋น ๋ด์ฉ ์์
์คํ.
2) success : ์์
์ฑ๊ณต ์ ํด๋น ๋ด์ฉ ์์
์คํ.
3) failure : ์์
์คํจ ์ ํด๋น ๋ด์ฉ ์์
์คํ.
4) unstable : ๋ถ๋ถ ์คํจ ์ ํด๋น ๋ด์ฉ ์์
์คํ.
5) changed : ๋ณ๊ฒฝ๋ ์ฌํญ์ด ์์ ์ ํด๋น ๋ด์ฉ ์์
์คํ.
Deploy ์์
์ด ๋๋๊ณ , Post์ ๋ช
์ํ๋ ์์
์ด ์คํ๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
Scripted ๋ฐฉ์
node {
stage('build') {
//
}
stage('test') {
//
}
stage('deploy') {
//
}
}
๐ฝ Pipeline Sysnax
๐ฆ ์๋ ์์ฑ
์์ ์ฃผ์๋ก ๋ค์ด๊ฐ๋ฉด pipline ๋ฌธ๋ฒ์ ํธ๋ฆฌํ๊ฒ ๋ง๋ค์ด์ค ์ ์๋ ๋๊ตฌ๋ก ์ด๋ํ ์ ์์ด์.
์ฃผ๋ํ๋์ Slack์ ์๋ฆผ์ ๋ณด๋ผ ์ ์๋ ๋ฌธ๋ฒ์ Test๋ก ๊ตฌ์ฑํด ๋ณด์์ด์.
์์ฑ์ด ์๋ฃ๋ ๋ค ํ์ดํ๋ผ์ธ ์คํฌ๋ฆฝํธ ์์ฑ์ ๋๋ฅด๋ฉด ์์ ๊ฐ์ด ์๋์ผ๋ก Script ๋ฌธ์ด ๋์ค๊ฒ ๋์.
์ด๋ฒ์๋ Git Repository์ File๋ค์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ๊ณต๋ถํด ๋ณด์์ด์.
ํด๋น Repository๋ Public์ด๊ธฐ ๋๋ฌธ์ Credential์ ๋ณ๋์ ์ค์ ์ด ํ์์์ง๋ง, Repository๊ฐ Private์ด๋ผ๋ฉด ํด๋น Repository ๊ณ์ ์ ๊ฐ์ ์ ์ํด์ฃผ์ด์ผ ํด์.
Jenkins์ ์๋ก์ด Item์ Pipeline์ผ๋ก ๋ง๋ค์ด์ฃผ์๊ณ , ์์ ๊ฐ์ด Script๋ฅผ ์
๋ ฅํด ์ฃผ์์ด์.
pipeline {
agent any
stages {
stage('Git clone') {
steps {
git 'https://github.com/joneconsulting/jenkins_pipeline_script';
}
}
stage('Compile') {
steps {
echo "Compiled successfully!";
sh './build.sh'
}
}
stage('JUnit') {
steps {
echo "JUnit passed successfully!";
sh './unit.sh'
}
}
stage('Code Analysis') {
steps {
echo "Code Analysis completed successfully!";
sh './quality.sh'
}
}
stage('Deploy') {
steps {
echo "Deployed successfully!";
sh './deploy.sh'
}
}
}
}
์ต์ข
์ ์ผ๋ก ์ฃผ๋ํ๋์ด ์
๋ ฅํ Script ๋ฌธ์ด์์.
์ ์ฅ์ ํ๊ณ , Build๋ฅผ ํด ๋ณด์์ด์.
์์ ๊ฐ์ด Build๊ฐ ์งํ๋๊ณ ์์ด์.
Build๊ฐ ๋ชจ๋ ๋๋ฌ์ด์!
pipeline {
agent any
stages {
stage('Git clone') {
steps {
git 'https://github.com/joneconsulting/jenkins_pipeline_script';
}
}
stage('Compile') {
steps {
echo "Compiled successfully!";
sh './build.sh'
}
}
stage('JUnit') {
steps {
echo "JUnit passed successfully!";
sh './unit.sh'
}
}
stage('Code Analysis') {
steps {
echo "Code Analysis completed successfully!";
sh './quality.sh'
}
}
stage('Deploy') {
steps {
echo "Deployed successfully!";
sh './deploy.sh'
}
}
}
post {
always {
echo "This will always run"
}
success {
echo "This will run when the run finished successfully"
}
failure {
echo "This will run if failed"
}
unstable {
echo "This will run when the run was marked as unstable"
}
changed {
echo "This will run when the state of the pipeline has changed"
}
}
}
์ด๋ฒ์๋ Deploy ์์
์ด ๋ชจ๋ ๋๋๊ณ , ์์
์ํ ์ฌ๋ถ์ ๋ฐ๋ผ ์ด๋ค ์์
์ ์ถ๊ฐ์ ์ผ๋ก ์งํํ ๊ฒ์ธ์ง์ ๋ํ
Script๋ฌธ์ ์ถ๊ฐํด ์ฃผ์์ด์.
์ ์ฅ์ ํ๊ณ , ๋ค์ Build ์์
์ ์๋ํด ๋ณด์์ด์.
Post Actions๋ผ๋ ๋จ๊ณ๊ฐ ์ถ๊ฐ๋์ด ์์
์ด ์งํ๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
๐ฝ Gradle build
pipeline {
agent any
tools {
gradle 'gradle'
}
stages {
stage('Build') {
steps {
echo "Build Started";
try{
sh "gradle clen build -x test -b build.gradle"
} catch (e) {
sh 'echo Build Fail'
}
echo "Build End";
}
}
stage('JUnit Test') {
steps {
echo "JUnit Started";
try {
junit '**/build/test-results/test/*.xml'
} catch (e) {
sh 'echo Test Fail'
}
echo "Test End"
}
}
}
post {
always {
echo 'This will always run'
}
success {
echo 'This will run when the run finished successfully'
}
failure {
echo 'This will run if failed'
}
unstable {
echo 'This will run when the run was marked as unstable'
}
changed {
echo 'This will run when the state of the pipeline has changed'
}
}
}
์ด๋ฒ์๋ Gradle Build๋ฅผ ์ํด ์์ ๊ฐ์ด Jenkinsfile์ ์์ ํด ์ฃผ์์ด์.
๐ฝ Jenkins Pipeline ๊ฐ์ง๊ณ ๋๊ธฐ
๐ฆ Maven build pipeline
์ด๋ฒ์๋ Maven build๋ฅผ Jenkins Pipeline์ ์ถ๊ฐํ๋ฉด์ ๋์๋ณผ๊ฒ์.
Jenkins์์ ์์ ๊ฐ์ด Item์ ๋ง๋ค์ด ์ค๊ฑฐ์์.
pipeline {
agent any
tools {
maven 'Maven3.8.5'
}
stages {
stage('Git Clone') {
steps {
git 'https://github.com/junyharang-coding-study/JunyHarang-Maven-Test-Project'
}
}
stage('Maven Build') {
steps {
sh '''
echo build start
mvn clean compile package -Dskiptests=true
'''
}
}
}
}
์์ ๊ฐ์ด Script ๋ฌธ์ ๋ฃ์ด ์ฃผ์์ด์.
์ฐธ๊ณ ๋ก Script ๋ฌธ ์์ tools์ Build Tool ์ ๋ณด๋ฅผ ๋ฃ์ด์ค์ผ ํ๋๋ฐ, ํ์ฌ maven Tool์ ์ด์ฉํด ๋ณผ ๊ฒ์ด๊ณ ,
Maven์ Version์ ์๋์ ๊ฐ์ด ํ์ธํ ์ ์์ด์.
Maven Build Tool์ ์ด์ฉํด์ ์ด ์ Build ์์
์ ๋ํ ๊ฒฐ๊ณผ๋ฌผ์ ์ญ์ (clean)ํ๊ณ , compile ํ๊ณ , packagingํ ๋ค Unit Test๋ ์งํํ์ง ์๊ธฐ ์ํด -Dskiptests=true Option์ ์ฃผ์์ด์.
์ค์ํ ๊ฒ์ Maven์ Name (Maven3.8.5)์ Script ๋ฌธ์ tools์ Maven ์ ๋ณด๋ฅผ ์ ์ ๋,
๋์ด ๋๊ฐ์ด ์ ์ด์ค์ผ ํ๋ค๋ ์ ์ด์์.
์ ์ฅํ๊ณ , Build๋ฅผ ์งํํด ๋ณผ๊ฒ์.
Build ์์
์ด ์ ์์ ์ผ๋ก ๋๋ฌ์ด์.
๐ฆ Tomcat 9.0์ ๋ฐฐํฌํ๊ธฐ
Script๋ฌธ์ ์์ฑํ๊ธฐ ์ ์ Script ์๋ ์์ฑ ๋์์ ๋ฐ์ ์์ ๊ฐ์ด Tomcat์ Deployํ ๋
Script๋ฌธ์ ๋ง๋ค๊ฒ ํด ์ฃผ์์ด์.
์์์ ๋ง๋ค์๋ Pipeline Projce ๊ตฌ์ฑ์์ 23๋ฒ์งธ ์ค๊ณผ ๊ฐ์ด Deploy ๊ด๋ จ Script ๋ฌธ์ ์ถ๊ฐํด ์ฃผ์์ด์.
๊ทธ๋ฐ ๋ค ์ ์ฅํ ๋ค ๋์์ด์.
Tomcat ์ด๊ธฐ Page์์ Manager App์ ๋๋ฌ ์ฃผ์์ด์.
๊ทธ๋ฆฌ๊ณ , ๊ด๋ฆฌ์ ๊ณ์ ์ ์
๋ ฅ ํด ์ฃผ์์ด์.
์ด ๋ถ๋ถ์ ๋ํด์๋ ์ด ๊ณณ์ ์ค๋น๋ฅผ ํด ๋์์ด์.
์ด ์ ์ Test ํด ๋ณด์๋ /hello-world๊ฐ ๋ณด์ด๊ณ ์์ด์.
์ด๊ฑด ์ญ์ ๋ฅผ ํด ์ฃผ๊ณ ์งํํด ๋ณผ๊ฒ์.
์ฐ์ธก ๋์ '๋ฐฐ์น๋ ๊ฒ์ ์ ๊ฑฐ'๋ฅผ ๋๋ฌ์ฃผ๋ฉด ๋์.
์ ์์ ์ผ๋ก ์ญ์ ๊ฐ ๋ ๊ฒ์ ํ์ธํ์์ด์.
์ด์ Jenkins์์ Build๋ฅผ ์งํํด ๋ณผ ๊ฒ์ด์์.
deploy ๋จ๊ณ๊ฐ ์ถ๊ฐ ๋์๊ณ , ์ ์ ์งํ๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
๐ฆ Docker Container์ ๋ฐฐํฌํ๊ธฐ
์ต์ด Script๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์์ ๊ฐ์ด ์์ฑ์ ํด ์ฃผ์์ด์.
SSH Server๋ ์ด ์ ์ ์์
ํ๋ Docker๋ฅผ ์ค์นํ Container์์.
Generate๋ฅผ ํด์ฃผ๋ ์์ฒญ ๊ธด Script๋ฌธ์ด ๋์์ด์.
์์์ ๋ง๋ค์๋ Pipeline Projce ๊ตฌ์ฑ์์ 29๋ฒ์งธ ์ค๊ณผ ๊ฐ์ด Script๋ฌธ์ ์ถ๊ฐํด ์ฃผ์์ด์.
๊ทธ๋ฆฌ๊ณ , ์ ์ฅ์ ํ๊ณ ๋์ ์ฃผ์์ด์.
์ด์ Build๋ฅผ ์งํํด ๋ณผ๊ฒ์.
Build๊ฐ ์คํจํ์์ด์!
SSH๋ก ์ฐ๊ฒฐํด ์ฃผ์๋ Docker Container์์ Docker Image๋ฅผ ํ์ธํด ๋ณด๋ ์์ ๊ฐ์ด
<NONE> ์ด๋ผ๊ณ ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
์ด๋ ๊ฒ ๋ ์ด์ ๋ Image๋ฅผ ์์ฑํ๋ ๊ณผ์ ์์ war File์ด ๋ณต์ฌ๊ฐ ๋๊ธฐ๋ ํ์์ผ๋, ํด๋น File์ด Image๋ฅผ ์์ฑํ๋ ๊ณผ์ ๊น์ง ์ด์ด์ง์ง ๋ชปํ๊ณ ์ค๋จ ๋์๊ธฐ ๋๋ฌธ์ด์์.
์ผ๋จ hello-world.war File์ ์ญ์ ํด ์ฃผ๋๋ก ํ ๊ฒ์.
๋ฌธ์ ๋ Docker Container์ ์๋ Dockerfile์ด ๋ฌธ์ ์์ด์.
์ฐ๋ฆฌ๋ hello-world.war๋ฅผ ์ ๋ฌํ๋๋ฐ, COPY ์ ์ ๋ณด๋ฉด ./webapp.war๋ผ๊ณ ์ ํ ๊ฒ์ด์์.
์์ ๊ฐ์ด ๋ณ๊ฒฝํด ์ฃผ๊ณ , ๋ค์ Build๋ฅผ ์งํํด ๋ณผ๊ฒ์.
์์
์ด ์ ์์ ์ผ๋ก ์๋ฃ ๋์์ด์!
SSH๋ก ์ฐ๊ฒฐํ๋ Docker Container์์ Docker Image๋ฅผ ํ์ธํด๋ณด๋
์ ์์ ์ผ๋ก Image๊ฐ ๋ง๋ค์ด์ง ๊ฒ์ ํ์ธ ํ ์ ์์ด์.