こんにちは、今日は歴史的な日ですが私はJenkinsfileと戯れています。*1
最近はCIやCDはGitHub ActionsやAWS Code兄弟に任せていますが、人間が入力値を選択して特定のジョブを実行するようなケースでJenkinsの出番がしばしばあります。
今回、選んだ値から複数のパラメータを取得したいケースがあり、少々てこずったのでメモしておきます。
やりたかったこと
Jenkinsで
- ユーザにはリストから一つだけ値を選択させたい
- 一つの値には複数の意味を持たせたい
- ex)接続するDBと、使用するユーザー
参考画面
カレーとラーメンを食べるとして、家か外かを選択するサンプルジョブです。
表にすると以下の組み合わせがあります。*2
| 場所 | メニュー |
|---|---|
| おうち | カレー |
| おうち | ラーメン |
| 外食 | カレー |
| 外食 | ラーメン |
以下のようにJenkinsの画面を開くとリストが提示されるので、ユーザは選択をします。

リストを開くと組み合わせ一覧が表示されます。

外食:ラーメン を選択したとして、以下のように表示されます。
ここでのポイントは、場所とメニューが分割されて表示できていることです。

Jenkinsfileのコード
こうなりました。JenkinsfileはGroovyであるためsplitが使えることは予想していたのですが VALUE0 = "${VALUES.split( ':' )[0]}" の書き方になかなかたどり着けませんでした。*3
pipeline {
agent any
parameters {
choice(name: 'VALUES', choices: ['おうち:カレー','おうち:ラーメン','外食:カレー','外食:ラーメン'], description: '場所とメニューの組み合わせを:区切りで指定')
}
environment {
VALUE0 = "${VALUES.split( ':' )[0]}"
VALUE1 = "${VALUES.split( ':' )[1]}"
}
stages {
stage('run') {
steps {
sh '''
echo "場所: ${VALUE0} , メニュー: ${VALUE1}"
'''
}
}
}
}
参考になったのはこちらの記事です、ありがとうございます。
余談
やりたいことはできたのですが、これがベストプラクティスとはとても思えず、良いやり方があったらアップデートしたいです。。