[Jenkins] Declarative Pipelineの書き方サンプル
Jenkins PipelineというJenkins 2.0から追加されたジョブの種類があり、その記法にはScripted PipelineとDeclarative Pipelineの2種類がある。
Scripted Pipelineは全てGroovyで記述する。シェルで処理を書いていた感じに近い。自由度は高いが保守に難がある。
Declarative PipelineはScripted Pipelineより新しい記法で、DSL的な記法となっている。各処理を区分けして書けるので可読性が高く、保守に向く。
scriptブロックを使えばGroovyを記述できる。
Declarative Pipelineの方がスクリプトの可読性が高い、JenkinsのStage View上でビルドステータスがstage毎にわかる、共用リポジトリの排他ロック管理に向くなど利点が多いので可能ならこちらで記述したい。
スクリプト大枠
@Library('repository') _
pipeline {
// パイプラインをどの環境で実行するか。(nodeやdocker-imageなど)。anyは指定なし。
agent any
// 環境変数定義。同一パイプライン内のどのstageからでも利用できる。
environment {
ENV_TOP="0"
}
stages {
// 処理を行う。
stage('stage-1') {
// 環境変数定義。現在のstage内でのみ利用できる。
environment {
ENV_STAGE="0"
}
steps {
script {
}
}
}
stage('stage-2') {
steps {
}
}
}
// stagesの処理が終わった後に実行される。
post {
aborted {
}
failure {
}
success {
}
}
}
Jenkins Shared Library
各ジョブで使う共通設定・処理をGit等で管理し、それを読み込むことができる。 (リポジトリのディレクトリ構成は規定に従う必要がある)
Jenkins Shared Libraryを使うにはJenkinsでライブラリを読み込むための設定を行っておく必要がある。
-> Jenkinsの管理 >システムの設定 内の Global Pipeline Libraries
リポジトリはブランチ、タグ、コミット、ハッシュを指定することが可能。
@Library('repository') _
stage / steps / script
// currentBuild.result を設定しただけでは、値を設定したstage以降のstageも実行されてしまう。
// 以降のstageの実行をスキップしてpostセクションに進むためには error-syntaxを使う手がある。
currentBuild.result = "ABORTED"
error "an error occurred."
shブロック
// 終了コードを取得する
RESULT_STATUS_CODE = sh(
returnStatus: true,
script: './echo_foo_bar.sh'
)
// 標準出力を文字列で取得する
// 末尾の改行文字を削除するために基本的に.trim()を呼んでおくと良い。
RESULT_STD_OUT = sh(
returnStdout: true,
script: ''' echo "foo bar" '''
).trim()
// 数字にしたい場合は scriptブロック内でキャストすれば良い。
Integer.parseInt(RESULT_STD_OUT)
// #### scriptの指定について ####
// スクリプトファイルを指定する。
script: './echo_foo_bar.sh'
// シェルスクリプトをヒアドキュメントで書く。
// 環境変数は展開される。
script: """
echo "${ENV_TOP}"
"""
script: '''
echo "${ENV_TOP}"
'''
// $/と$/を使う。
// 環境変数は展開される。
// Groovy上ではバックスラッシュがエスケープ文字とならない記法らしい。
// Jenkinsのスクリプトエディタ上で文字列中のスクリプトが文字列扱いでなく色分けされる。
script: $/
echo "${ENV_TOP}"
$/
// スクリプトが長い場合は文字列を変数に代入し、scriptにその変数を指定すると見栄えが良い。
echo_script = $/
echo "foo bar"
$/
RESULT_STD_OUT = sh(
returnStdout: true,
script: echo_script
).trim()
post
postセクション以前に設定したcurrentBuild.resultの値で実行するブロックを分けられる。
currentBuild.result = "ABORTED"
currentBuild.result = "FAILURE"
currentBuild.result = "SUCCESS"
post {
aborted {
}
failure {
}
success {
}
}
[reference]
Running multiple steps | Jenkins
Pipeline: Nodes and Processes | Jenkins
jenkinsのpipeline入門(jenkinsfile) | SIer だけど技術やりたいブログ
【Jenkins】declarative pipeline サンプル集 | Qiita
【Jenkins】Declarative Pipeline入門 | Qiita
Jenkinsfileでexit codeでビルドステータス分けたい | Qiita
Jenkinsfileの書き方 (Jenkins Pipeline) | Qiita
pipelineでシェルスクリプトの終了コードを取得する方法を調べてみた | ヒトリ歩き
Jenkins で定期実行!cron の書き方 | Neo's World
[はじめようApache Groovy] #05 - Groovyの文字列 | なるーらぼ
@Fieldかわいいよ@Field | uehaj's blog
Jenkins Shared Librariesの活用事例の紹介 | DeNA Testing Blog
Jenkins Shared Libraryで快適 Jenkins 生活? | Qiita