もりはやメモφ(・ω・ )

ITとか読書感想文とか

Jenkinsfileでchoiceの選択値を複数の変数に分割して利用する

こんにちは、今日は歴史的な日ですが私はJenkinsfileと戯れています。*1
最近はCIやCDはGitHub ActionsやAWS Code兄弟に任せていますが、人間が入力値を選択して特定のジョブを実行するようなケースでJenkinsの出番がしばしばあります。

今回、選んだ値から複数のパラメータを取得したいケースがあり、少々てこずったのでメモしておきます。

やりたかったこと

Jenkinsで

  • ユーザにはリストから一つだけ値を選択させたい
  • 一つの値には複数の意味を持たせたい
    • ex)接続するDBと、使用するユーザー

参考画面

カレーとラーメンを食べるとして、家か外かを選択するサンプルジョブです。

表にすると以下の組み合わせがあります。*2

場所 メニュー
おうち カレー
おうち ラーメン
外食 カレー
外食 ラーメン

以下のようにJenkinsの画面を開くとリストが提示されるので、ユーザは選択をします。

f:id:morihaya:20201108231337p:plain
ジョブのトップ

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

f:id:morihaya:20201108231424p:plain
組み合わせ一覧

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

f:id:morihaya:20201108231604p:plain
結果

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}"
                '''
            }
        }
    }
}

参考になったのはこちらの記事です、ありがとうございます。

stackoverflow.com

余談

やりたいことはできたのですが、これがベストプラクティスとはとても思えず、良いやり方があったらアップデートしたいです。。

*1:2020-11-08 46代目のアメリカの大統領がジョー・バイデン氏に決まった

*2:いずれも私の大好物です

*3:Groovy知らなさすぎ問題