ETC.
[Jenkins] ํ์ดํ๋ผ์ธ(Pipeline) ๋ฌธ๋ฒ
carsumin
2025. 10. 12. 12:06
ํ์ดํ๋ผ์ธ์ ์ข ๋ฅ
- ํ์ค์ Declarative Pipeline
| ๊ตฌ๋ถ | Declarative Pipeline | Scripted Pipeline |
| ๋ฌธ๋ฒ | ๊ตฌ์กฐํ๋ DSL (์ถ์ฒ ๋ฐฉ์) | Groovy ๊ธฐ๋ฐ ์์ ๋ ๋์ |
| ๊ฐ๋ ์ฑ | ๋์ | ๋ฎ์ |
| ์ ํ | ์ ์ฐํ (Declarative) | ๋ช ๋ นํ (Imperative) |
| ํ์ผ ํ์ | Jenkinsfile | Jenkinsfile |
| ๋ํ ๊ตฌ๋ฌธ | pipeline { ... } | node { ... } |
Declarative Pipeline ๊ธฐ๋ณธ ๊ตฌ์กฐ
pipeline {
agent any // ์คํํ ๋
ธ๋ (any: ๋ชจ๋ ๋
ธ๋์์ ์คํ ๊ฐ๋ฅ)
environment { // ํ๊ฒฝ ๋ณ์ ์ค์
JAVA_HOME = '/usr/lib/jvm/java-11'
PATH = "${JAVA_HOME}/bin:${env.PATH}"
}
options { // ๋น๋ ์ต์
timeout(time: 30, unit: 'MINUTES')
buildDiscarder(logRotator(numToKeepStr: '10'))
}
stages { // ๋น๋ ๋จ๊ณ ์ ์
stage('Checkout') {
steps {
echo "Git ์ ์ฅ์์์ ์์ค์ฝ๋ ๊ฐ์ ธ์ค๊ธฐ"
checkout scm
}
}
stage('Build') {
steps {
echo "๋น๋ ์ค..."
sh 'mvn clean package -DskipTests'
}
}
stage('Test') {
steps {
echo "ํ
์คํธ ์คํ"
sh 'mvn test'
}
}
stage('Deploy') {
steps {
echo "์๋ฒ์ ๋ฐฐํฌ ์ค..."
sh './deploy.sh'
}
}
}
post { // ๋น๋ ํ ์ฒ๋ฆฌ
always {
echo "๋น๋ ์ข
๋ฃ ํ ํญ์ ์คํ"
}
success {
echo "โ
๋น๋ ์ฑ๊ณต"
}
failure {
echo "โ ๋น๋ ์คํจ"
}
}
}
์ฃผ์ ๊ตฌ๋ฌธ
- pipeline {} : Declarative ํ์ดํ๋ผ์ธ์ ๋ฃจํธ ๋ธ๋ก
- agent any : ํ์ดํ๋ผ์ธ ์คํํ Jenkins ๋ ธ๋ ์ง์ (label, docker, none ๋ฑ ๊ฐ๋ฅ)
- stages {} / stage('name') : ์ฌ๋ฌ ๋จ๊ณ ์ ์ (๋น๋, ํ ์คํธ, ๋ฐฐํฌ ๋ฑ)
- steps {} : ๊ฐ ๋จ๊ณ์์ ์ํํ ๋ช ๋ น์ด ๋ชฉ๋ก
- environment {} : ํ์ดํ๋ผ์ธ ์ ์ญ ํ๊ฒฝ ๋ณ์ ์ค์
- options {} : ํ์์์, ๋น๋ ์ ์ง ๊ฐ์ ๋ฑ ํ์ดํ๋ผ์ธ ์ต์ ์ง์
- post {} : ๋น๋ ์ฑ๊ณต, ์คํจ, ํญ์ ์คํ ์ ์ฒ๋ฆฌ ๋ก์ง ์ง์
- when {} : ์กฐ๊ฑด๋ถ ์คํ
์์ฃผ ์ฌ์ฉํ๋ ๊ณ ๊ธ๋ฌธ๋ฒ
- ํน์ ๋ธ๋์น์์๋ง ์คํํ๊ธฐ
stage('Deploy') {
when {
branch 'main'
}
steps {
echo "๋ฐฐํฌ ์คํ"
}
}
- ์ฌ์ฉ์ ์ ๋ ฅ ๋๊ธฐ
stage('Approval') {
steps {
input message: '๋ฐฐํฌ๋ฅผ ์งํํ์๊ฒ ์ต๋๊น?', ok: '๋ฐฐํฌ ์งํ'
}
}
- ๋ณ๋ ฌ ์คํ (parallel)
stage('Parallel Test') {
parallel {
stage('Unit Tests') {
steps {
sh 'mvn test'
}
}
stage('Integration Tests') {
steps {
sh 'mvn verify'
}
}
}
}
- ๋งคํธ๋ฆญ์ค ๋น๋ (Matrix)
matrix {
axes {
axis {
name 'JAVA_VERSION'
values '8', '11'
}
axis {
name 'OS'
values 'ubuntu', 'centos'
}
}
stages {
stage('Build') {
steps {
echo "Building on ${OS} with Java ${JAVA_VERSION}"
}
}
}
}
- ํ์ผ ์กด์ฌ ์ฌ๋ถ ์กฐ๊ฑด ์คํ
stage('Optional Step') {
when {
expression { fileExists('Dockerfile') }
}
steps {
echo "Dockerfile ์กด์ฌ — Docker ๋น๋ ์คํ"
sh 'docker build -t myapp .'
}
}
Scripted Pipeline ์์ (Groovy ๊ธฐ๋ฐ)
- Scripted ๋ฐฉ์์ Groovy ๋ฌธ๋ฒ์ ๊ฑฐ์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์์ด ๋ณต์กํ ์กฐ๊ฑด๋ฌธ, ๋ฐ๋ณต๋ฌธ, ์๋ฌ์ฒ๋ฆฌ ๋ก์ง์ ์ธ๋ฐํ๊ฒ ์ ์ด ๊ฐ๋ฅ
node {
stage('Checkout') {
checkout scm
}
stage('Build') {
try {
sh 'mvn clean package'
} catch (err) {
echo "Build failed: ${err}"
currentBuild.result = 'FAILURE'
}
}
stage('Deploy') {
if (env.BRANCH_NAME == 'main') {
sh './deploy.sh'
} else {
echo "๋ฐฐํฌ ์คํต (๋ธ๋์น: ${env.BRANCH_NAME})"
}
}
}
Jenkins ํ๊ฒฝ ๋ณ์
- env.BUILD_NUMBER - ๋น๋ ๋ฒํธ
- env.BRANCH_NAME - ํ์ฌ ๋ธ๋์น ์ด๋ฆ
- env.JOB_NAME - Jenkins Job ์ด๋ฆ
- env.WORKSPACE - Jenkins ์์ ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก
- env.GIT_COMMIT - ํ์ฌ GIT ์ปค๋ฐ ํด์
- env.BUILD_URL - Jenkins ๋น๋ URL
- params.PARAM_NAME - ์ฌ์ฉ์ ์ ์ ํ๋ผ๋ฏธํฐ ์ ๊ทผ ์ ์ฌ์ฉ