はじめに
GitHubでJenkinsのPipeline scriptを管理している中で、
共通処理なんかをまとめて呼び出したくなったので色々調べたり実行したりした内容のまとめ
環境・前提
- Jenkins 2.235.5
- SCMはgit(GitHub)
- パイプラインの記述はDecrarative Pipeline
- ここに記載したコード等は仮で記述しているので動作確認はしていません
ディレクトリ構成
repository-root
└─jenkins-pipeline
├─main.groovy
└─partials
├─fuji.groovy
└─kiku.groovy
- jenkins-pipeline配下にスクリプトを配置している
-
jenkins-pipeline/main.groovy
をScript Pathに指定している
main.groovyから別のscriptを読み込む
- script内で
load
を行うだけでOK - 読み込まれる対象のスクリプトは最後に
return this
を記述 - 途中でworkspace内のブランチ変更などが行われたときにエラーにならないように事前に読み込んでおくのが良さそう
-
pwd()
はジョブのworkspaceが返却される- e.g.) makai-jobの場合
/path/to/jenkins/workspace/makai-job
- e.g.) makai-jobの場合
jenkins-pipeline/main.groovy
pipeline {
agent any
stages {
stage('Initialize') {
steps {
script {
fuji = load "${pwd()}/jenkins-pipeline/partials/fuji.groovy"
kiku = load "${pwd()}/jenkins-pipeline/partials/kiku.groovy"
}
}
}
stage('exec fuji') {
steps {
script {
fuji.say()
fuji.sing("Lemon")
}
}
}
stage('exec kiku') {
steps {
script {
kiku.say()
}
}
}
}
}
jenkins-pipeline/partials/fuji.groovy
def say() {
echo "I'm fuji aoi!"
}
def sing(String title) {
script {
print "Sing th ${title}"
}
}
return this
jenkins-pipeline/partials/kiku.groovy
def say() {
script {
print "I'm kikunojo!"
}
}
return this
おわりに
はまったのはgit branchの切り替え前にスクリプトをロードしておかないと対象のブランチの状態によってはスクリプトが存在せずにFile Not Foundになってしまうところ。
解決してみればそりゃそうだって感じですけど挙動を知っていないとこういうところでハマってしまいますね……
もっと良い方法などあれがご指摘いただけると助かります。