2014年10月6日月曜日

[Jenkins] Build-timeout Plugin の「最後のログ出力からの経過時間」が便利

Build-timeout Plugin は文字通りビルドにタイムアウトの設定ができるプラグインです。
こちらの Version 1.13 からタイムアウトの判定方法に「最後のログ出力からの経過時間」が追加されました。
これがかなりいい感じです!

これまでの判定方法には
  • Absolute
  • Elastic
  • Likely stuck
がありました。

Absolute
Absolute は、絶対時間でビルド開始からの経過時間でタイムアウトする設定です。
これは、少なくともビルド成功時にかかる時間以上の時間に設定しないといけません。このため、成功時に10時間かからジョブの場合、ジョブ開始直後に問題が発生した場合でも最低10時間は待たなければいけません。これは大変無駄なことです。

Elastic
つぎに Elastic は、直近の成功ビルドの平均時間からタイムアウト時間を算出する設定です。平均時間の 150%~400% (50刻み)を設定できます。
これは一見良さそうなのですが、実行ノードが毎回異なり、さらにスレーブのマシンスペックに差があると、実行時間にばらつきが出てしまい一番遅い環境に合わせて多めにタイムアウト値を設定しなければいけなくなります。
Absolute の時と同様にジョブの実行時間が長い場合、それだけ無駄な時間が増えます。また、実行時間が短い場合、今度はマージンが少なくなりタイムアウトしなくても大丈夫な場合でもタイムアウトしてしまう、ということがありました。

Likely stuck
最後に Likely stuck の場合は、滞留している可能性が高いならば中止する設定です。この判断は Jenkins の API が判断しています。
http://javadoc.jenkins-ci.org/hudson/model/Executor.html#isLikelyStuck()
Returns true if the current build is likely stuck.
This is a heuristics based approach, but if the build is suspiciously taking for a long time, this method returns true.
この設定は使ったことがないのですが、コードを見た感じでは推定時間がある場合はその10倍(?)、なければ24時間でタイムアウトするようです。間違っていたらすみませんm(__)m
CodeNav for Github 便利だわー)
なんにせよ、この設定も無駄に長く待ってしまう感じがします。

最後のログ出力からの経過時間
新しい判定方法の「最後のログ出力からの経過時間」では、「ログ出力が停滞して○○秒後にタイムアウトする」という設定ができます。
ビルドでもテストでも大抵の場合ログ出力はあると思います。
また、ログが出ているところまでは正常なので、そこから停滞した時間の設定はそんなに多くなくて大丈夫なはずです。よって、この判定方法は他の方法よりも無駄を少なくすることができるでしょう。(当然ログが適宜出力されることを想定してます)

ビルドが長時間停滞して困っている方は一度プラグインの導入・判定方法の見直しをしてはいかかがでしょうか?

0 件のコメント:

コメントを投稿