はじめに
Jenkins Pipeline には node
で始まる Scripted Pipeline と pipeline
で始まる Declarative Pipeline の2種類があります。
Scripted Pipeline で parameters の choice を書こうとしたときにはまったので備忘録です。
parameters
Declarative Pipeline での書き方
Pipeline Syntax (公式ドキュメント)
pipeline {
agent any
parameters {
choice(name: 'CHOICES', choices: ['one', 'two', 'three'], description: '')
}
stages {
stage('echo parameters') {
steps {
echo "CHOICES: ${params.CHOICES}"
}
}
}
}
Scripted Pipeline での書き方
node {
properties([
parameters([
string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: ''),
booleanParam(name: 'DEBUG_BUILD', defaultValue: true, description: '')
])
])
....
}
choice に関する記述はありません。
parameters: choice
Scripted Pipeline でうまくいかない書き方
node {
properties([
parameters([
choice(name: 'CHOICES', choices: ['one', 'two', 'three'], description: ''),
])
])
stage('echo parameters') {
echo "CHOICES: ${params.CHOICES}"
}
}
と書いたところ以下のエラーが発生しました。
java.lang.IllegalArgumentException: Could not instantiate {name=CHOICES, choices=[one, two, three], description=}
for ChoiceParameterDefinition(name: String, choices: String, description: String):
java.lang.ClassCastException: hudson.model.ChoiceParameterDefinition.choices expects
class java.lang.String but received class java.util.ArrayList
Jenkins のバージョンは ver. 2.32.1
とやや古めです。
Scripted Pipeline で動く書き方
Jenkinsfileの書き方 (Jenkins Pipeline) - Qiita を参考にしました。
公式ドキュメントではchoiceの場合、choices: ['one', 'two', 'three']
のようにかけるそうですが、なぜか私の環境ではsyntax errorがでてしまったため、
以下のように\n改行コードを入れることでセレクトボックス入力が可能になりました。
node {
properties([
parameters([
choice(name: 'CHOICES', choices: 'one\ntwo\nthree', description: ''),
])
])
stage('echo parameters') {
echo "CHOICES: ${params.CHOICES}"
}
}
何が原因かは調査していません。
おわりに
現在は Declarative Pipeline が主流だとは思うのですが、同じ Jenkins Pipeline の中に2種類あるので検索しても情報がごちゃ混ぜで欲しい情報に辿り着くのが難しいですね。
Jenkins 自体レガシーになりつつあると思うので早めに GitHub Actions に移行していきたいところです。 GitHub Enterprise にも今年実装予定のようなので期待しています。