Jenkins ジョブにタイムアウトを設定できる Build-timeout Plugin を試した

Jenkins で実行中のバッチが,何かしらの原因によって無限ループのような状態に陥ったときに,デフォルトだとタイムアウトのような機構はなく,そのままの状態を維持してしまう.基本的にはバッチ内部で制御するべきだと思うけど,予期せぬ状態になる可能性はあるので,Jenkins 側でタイムアウトの設定ができたら良いなと思って Build-timeout Plugin を検証してみた.

最近のバージョンだと Install suggested plugins に入っている

運用している Jenkins 2.30 の Install suggested plugins に Build-timeout Plugin は入っていなかったけど,今回検証環境として Jenkins 2.73 を構築してみたら,Install suggested plugins に Build-timeout Plugin が入っていた.確かにデフォルトで入っていて良いようなプラグインだと思う.

f:id:kakku22:20171106235037p:plain

Docker で Jenkins をカジュアルに構築する

Docker を使えば,面倒な手順もなくカジュアルに Jenkins を起動できるので本当に便利.以下のコマンドで起動すれば http://localhost:8080/ でアクセスすることができる.

# Jenkins を起動する
$ docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts
 
# コンテナ ID を確認して initialAdminPassword を確認しておく
$ docker ps
$ docker exec -it xxxxxxxxxxxx cat /var/jenkins_home/secrets/initialAdminPassword

タイムアウト設定

Build-timeout Plugin では,計5種類のタイムアウト設定の中から選ぶことができる.どの設定も意図が異なるため,バッチの特性に応じて適切に選ぶ必要がある.個人的にどのように使うかをまとめてみた.

  • 一定の経過時間
    • 「タイムアウト(分)」を指定して,それまでにジョブが終わらなければ,タイムアウトになる
    • 確実に異常であると判断できる時間があれば,使えそう
    • ただし,定期的に実行時間がスパイクするようなバッチの場合,より大きなタイムアウトを設定する必要がある
  • デッドライン
    • 例えば「業務的に朝9時までに終わらせる必要がある」など,時間的なデッドラインがある場合に使える
  • ビルドの予測最大時間との比較
    • カスタマイズできる設定はなく,プラグイン側で「過去の実行結果と比べて極端に長い」と判断できる場合に,タイムアウトになる
    • 実装を読んでみないと,どういうロジックなのかはわからないけど,実行時間が一定に保たれるジョブなどは相性が良さそう
  • 最後のログの出力からの経過時間
    • 「タイムアウト(秒)」を指定して,ジョブのコンソールログが出なくなった時間で,タイムアウトになる
    • ジョブの中で INFO ログなどを定期的に出す前提であれば,使えそう
  • 過去のビルド時間との比較
    • 「過去の成功ビルド」の平均時間よりも「長くなっている」場合,タイムアウトになる
    • 「過去何回か」を設定することもできる
    • 「長くなっている」を判断する設定として「150% / 200% / 250% / 300% / 350% / 400%」の中から選ぶことができる

設定例

「一定の経過時間」を設定例を以下に載せる.なお「タイムアウト時間の保存先」を設定しておくと,タイムアウト時間を環境変数から取れるようになる.ただし,単位が違って「ミリ秒」なので注意する必要がある.

f:id:kakku22:20171106235110p:plain

まとめ

  • Jenkins を使うときは,ジョブにタイムアウトを設定しておくと安心できる場合がある
  • 最近の Jenkins だと Install suggested plugins に Build-timeout Plugin が入っている
  • 計5種類のタイムアウト設定があるので,ジョブの特性によって選ぶことができる