Jenkinsの環境変数BUILD_IDは消えた

以前のエントリ「Jenkinsの環境変数のバグにはまる」で取り上げたJenkinsの環境変数BUILD_IDのバグをウォッチしていたのだけど、結局、修正されないことに決まってしまった。下記に理由が載っている。

Assuming the maintainer of the Zentimestamp plugin is responsive (I do not follow it), this should be simple to implement there, and provide more flexibility anyway. (The old BUILD_ID lacked millisecond resolution, whereas Jenkins now supports >1 build of a given project per second, making timestamps in that format nonunique; and also used the server’s current timezone, leading to subtle problems during DST changes or when simply moving servers.)

[JENKINS-26520] Environment Variables BUILD_ID and BUILD_NUMBER now return the same value - Jenkins JIRA

理由は分かるのだけど、突然の方針変更に失望を隠せないのは他の方も同様のようだ。

i'm very disapointed to see this new message ! won't fix ...

[JENKINS-26520] Environment Variables BUILD_ID and BUILD_NUMBER now return the same value - Jenkins JIRA

2015/4/12にリリースされたver1.609にて対応済みというステータスになっており、サイトに掲載されているドキュメントも新しい説明に更新されている。

What's new in 1.609 (2015/04/12)
Documentation for $BUILD_ID did not reflect current reality (issue 26520)

Changelog

BUILD_ID The current build id, such as "2005-08-22_23-59-59" (YYYY-MM-DD_hh-mm-ss, defunct since version 1.597)

Building a software project - Jenkins - Jenkins Wiki

暫定的な解決策は、上記のバグレポートのコメントに載っているように、EnvInjectプラグインを導入して下記のgroovyスクリプトを使うことだ。これにより、BUILD_IDは従来通りの形式で使うことが出来る。

return [BUILD_ID:currentBuild.getTime().format("yyyy-MM-dd_HH-mm-ss")]

手元の環境ではJenkinsのジョブをRubyで書くことが多いのだけど、その際の開発途中で「Jenkins外で動作する時も、Jenkins内で動作する時と同じ環境変数BUILD_IDを参照したい」ことがあるので、実は下記のような処理が入っていて影響を受けない処理も有る。

ENV['BUILD_ID'] = Time.now.strftime("%Y-%m-%d_%H-%M-%S")

もっとも、BUILD_IDはもはや意味を成さないし、下手に残しておくと誤解を招く恐れもある。今後の長期的なメンテナンスも考慮すれば、BUILD_TIMESTAMPなど他の変数へ置き換える必要がありそうだ。