Jenkins のビルド情報の自動設定

今日は Jenkins についての小ネタを書きます。

先日、とある時間のかかるジョブのビルド開幕直後に、そのビルドの表示名と説明をセットするにはどうしたらよいかという相談がありましたので、自分なりによさそうな方法を考えてみました。

Jenkins のビルドの表示名 (displayName) と説明 (description) は各ビルドごとに設定可能な文字列情報です。次のように Web UI で変更することができるようになっています。

これらを自動設定するための Jenkins プラグインはいくつかありますが (たとえば Build Name Setter PluginDescription Setter Plugin )、あまり複雑な設定はできないし、ログから正規表現で切り出すとか面倒だし、なによりビルドが終了しないと設定されなかったりするし、ということで今回の目的には合わないようです。

たぶん一番で簡単で柔軟性のある方法は、ビルドスクリプト中からさきほど見た Web UI 経由でこれらの情報を更新してしまうことでしょう。Unix シェルスクリプトで定番ツールの curl を使えば次のように書けます。

curl -s ${BUILD_URL}configSubmit -X POST \
--data-urlencode "json={\"displayName\":"#$BUILD_NUMBER ほげほげ\", \"description\":\"あいうえお\nかきくけこ\"}"

このように各ビルドの /configSubmitURLPOST メソッドで displayNamedescription を含む JSON オブジェクトの文字列を渡してやればそれが設定されます。

なおダブルクォートのエスケープが多くて大変なときは、次のようにヒアドキュメントとパイプを活用すると見やすくなります。

cat <<EOF |
{"displayName":"#$BUILD_NUMBER ほげほげ", "description":"あいうえお\nかきくけこ"}
EOF
curl -s ${BUILD_URL}configSubmit -X POST --data-urlencode json@-

ユーザの認証がない Jenkins ならこれだけで OK です。認証つきの Jenkins の場合は curl に HTTP Basic 認証をさせる必要があります。

cat <<EOF |
{"displayName":"#$BUILD_NUMBER ほげほげ", "description":"あいうえお\nかきくけこ"}
EOF
curl -u yaegashi:secret -s ${BUILD_URL}configSubmit -X POST --data-urlencode json@-

このように curl に -u ユーザ名:パスワード を渡してもよいのですが、実際のパスワードそのものを使うのはあまりよろしくないので、通常はそのユーザのランダムな API トークンを代わりに使います。

cat <<EOF |
{"displayName":"#$BUILD_NUMBER ほげほげ", "description":"あいうえお\nかきくけこ"}
EOF
curl -u yaegashi:d359d268c0c22e1677adc47bfa675dab -s ${BUILD_URL}configSubmit -X POST --data-urlencode json@-

API トークンの文字列は Jenkins のユーザの設定で参照・変更ができます。

今回の方法を応用すると、ビルドの表示名や説明をスクリプト中で動的に生成したり、ビルドの進行にあわせて何度も書き換えたりといったこともできるようになります。いろいろ活用してみてください。

また Web UI をアクセスする手法はいわゆる Jenkins REST API などとしてドキュメント化されたものではありませんが、基本的には同じことをしています。詳しくは次のドキュメントを参照してください。

2012/12/14 17:27:00 JST