Jenkins 파이프라인은 여러 방식으로 구현이 가능하다.
pipeline {
/* insert Declarative Pipeline here */
}
any, none, label, node, docker, dockerfile, kubernetes를 파라미터로 포함할 수 있다.
agent는 pipeline의 최상위에 포함되어야 하며, agent가 none으로 작성되었을 경우 stage에 포함되어야 한다.
ex) docker
agent {
docker {
image 'myregistry.com/node'
label 'my-defined-label'
registryUrl 'https://myregistry.com/'
registryCredentialsId 'myPredefinedCredentialsInJenkins'
}
}
ex) dockerfile
agent {
dockerfile {
filename 'Dockerfile.build'
dir 'build'
label 'my-defined-label'
registryUrl 'https://myregistry.com/'
registryCredentialsId 'myPredefinedCredentialsInJenkins'
}
}
ex) agent가 적용 된 JenkinsFile Sample
pipeline {
agent none
stages {
stage('Example Build') {
agent { docker 'maven:3-alpine' }
steps {
echo 'Hello, Maven'
sh 'mvn --version'
}
}
stage('Example Test') {
agent { docker 'openjdk:8-jre' }
steps {
echo 'Hello, JDK'
sh 'java -version'
}
}
}
}
agent none이 pipeline의 최상위에 정의되어 있을 경우 stage는 각각 agent를 포함하여야 한다.
이 JenkinsFile Sample을 통해 새로 작성된 컨테이너의 pipeline을 정의는데 유용히 사용할 수 있다.
always, changed, fixed, regression, aborted, failure, success, unstable, unsuccessful,와 cleanup 등의 상태를 정의할 수 있다.
일반적으로 post는 pipeline의 끝에 배치한다.
ex) post가 적용 된 JenkinsFile Sample
pipeline {
agent any
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
post {
always {
echo 'I will always say Hello again!'
}
}
}
ex) stages와 steps가 적용 된 JenkinsFile Sample
pipeline {
agent any
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
}
ex) environment가 적용 된 JenkinsFile Sample
pipeline {
agent any
environment {
CC = 'clang'
}
stages {
stage('Example') {
environment {
AN_ACCESS_KEY = credentials('my-prefined-secret-text')
}
steps {
sh 'printenv'
}
}
}
}
options는 pipeline에서 한번만 정의 할 수 있다.
buildDiscarder
ex) options { buildDiscarder(logRotator(numToKeepStr: '1')) }
checkoutToSubdirectory
ex) options { checkoutToSubdirectory('foo') }
disableConcurrentBuilds
ex) options { disableConcurrentBuilds() }
disableResume
ex) options { disableResume() }
newContainerPerStage
overrideIndexTriggers
options { overrideIndexTriggers(true) }
경우에 대해서만 활성화된다.options { overrideIndexTriggers(false) }
이 작업에 대해서만 분기 인덱싱 트리거를 비활성화한다.preserveStashes
ex) options { preserveStashes() }
options { preserveStashes(buildCount: 5) }
에서 stash를 보존 하거나 가장 최근에 완료된 5 개의 빌드에서 stash를 보존하는 용도로 사용.quietPeriod
ex) options { quietPeriod(30) }
retry
ex) options { retry(3) }
skipDefaultCheckout
ex) options { skipDefaultCheckout() }
skipStagesAfterUnstable
ex) options { skipStagesAfterUnstable() }
timeout
ex) options { timeout(time: 1, unit: 'HOURS') }
timestamps
ex) options { timestamps() }
parallelsAlwaysFailFast
ex) options { parallelsAlwaysFailFast() }
ex) options가 적용 된 JenkinsFile Sample
pipeline {
agent any
options {
timeout(time: 1, unit: 'HOURS')
}
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
}
위와 같이 설정할 경우 Jenkins가 파이프라인 실행을 중단 한 후 1시간의 timeout을 설정한다.
string, text, booleanParam, choice, password 등을 정의할 수 있다.
parameters는 pipeline에서 한번만 정의할 수 있다.
ex) parameters가 적용 된 JenkinsFile Sample
pipeline {
agent any
parameters {
string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')
text(name: 'BIOGRAPHY', defaultValue: '', description: 'Enter some information about the person')
booleanParam(name: 'TOGGLE', defaultValue: true, description: 'Toggle this value')
choice(name: 'CHOICE', choices: ['One', 'Two', 'Three'], description: 'Pick something')
password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'Enter a password')
}
stages {
stage('Example') {
steps {
echo "Hello ${params.PERSON}"
echo "Biography: ${params.BIOGRAPHY}"
echo "Toggle: ${params.TOGGLE}"
echo "Choice: ${params.CHOICE}"
echo "Password: ${params.PASSWORD}"
}
}
}
}
pipeline {
agent any
triggers {
cron('H */4 * * 1-5')
}
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
}
agent none으로 지정된 경우 무시된다.
지원되는 도구는 maven, jdk, gradle이 있다.
ex) tools가 적용 된 JenkinsFile Sample
pipeline {
agent any
tools {
maven 'apache-maven-3.0.1'
}
stages {
stage('Example') {
steps {
sh 'mvn --version'
}
}
}
}
tools 이름은 Jenkins 관리의 Global Tool Configuration에서 사전 정의되어 있어야 한다.
사용 가능한 옵션으로는 message, id, ok, submitter, submitterParameter, parameters가 있다.
ex) input이 적용 된 JenkinsFile Sample
pipeline {
agent any
stages {
stage('Example') {
input {
message "Should we continue?"
ok "Yes, we should."
submitter "alice,bob"
parameters {
string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')
}
}
steps {
echo "Hello, ${PERSON}, nice to meet you."
}
}
}
}
Jenkins 파이프라인은 순차적 실행과 평행 실행으로 나눌 수 있다.
ex) 순차적 실행 예제
pipeline {
agent none
stages {
stage('Non-Sequential Stage') {
agent {
label 'for-non-sequential'
}
steps {
echo "On Non-Sequential Stage"
}
}
stage('Sequential') {
agent {
label 'for-sequential'
}
environment {
FOR_SEQUENTIAL = "some-value"
}
stages {
stage('In Sequential 1') {
steps {
echo "In Sequential 1"
}
}
stage('In Sequential 2') {
steps {
echo "In Sequential 2"
}
}
stage('Parallel In Sequential') {
parallel {
stage('In Parallel 1') {
steps {
echo "In Parallel 1"
}
}
stage('In Parallel 2') {
steps {
echo "In Parallel 2"
}
}
}
}
}
}
}
}
ex) 평행 실행 예제
pipeline {
agent any
stages {
stage('Non-Parallel Stage') {
steps {
echo 'This stage will be executed first.'
}
}
stage('Parallel Stage') {
when {
branch 'master'
}
failFast true
parallel {
stage('Branch A') {
agent {
label "for-branch-a"
}
steps {
echo "On Branch A"
}
}
stage('Branch B') {
agent {
label "for-branch-b"
}
steps {
echo "On Branch B"
}
}
stage('Branch C') {
agent {
label "for-branch-c"
}
stages {
stage('Nested 1') {
steps {
echo "In stage Nested 1 within Branch C"
}
}
stage('Nested 2') {
steps {
echo "In stage Nested 2 within Branch C"
}
}
}
}
}
}
}
}
이와 같은 Jenkins Pipeline Syntax를 적절히 활용하여 작성한다면, 보다 효과적이고 빠르면서도 다양한 검증 형태를 거칠 수 있을 것 이다.