こんにちは、今日は歴史的な日ですが私は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}" ''' } } } }
参考になったのはこちらの記事です、ありがとうございます。
余談
やりたいことはできたのですが、これがベストプラクティスとはとても思えず、良いやり方があったらアップデートしたいです。。