Jenkins で実行中のバッチが,何かしらの原因によって無限ループのような状態に陥ったときに,デフォルトだとタイムアウトのような機構はなく,そのままの状態を維持してしまう.基本的にはバッチ内部で制御するべきだと思うけど,予期せぬ状態になる可能性はあるので,Jenkins 側でタイムアウトの設定ができたら良いなと思って Build-timeout Plugin を検証してみた.
- Build-timeout Plugin - Jenkins - Jenkins Wiki
- GitHub - jenkinsci/build-timeout-plugin: 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 が入っていた.確かにデフォルトで入っていて良いようなプラグインだと思う.
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%」の中から選ぶことができる
設定例
「一定の経過時間」を設定例を以下に載せる.なお「タイムアウト時間の保存先」を設定しておくと,タイムアウト時間を環境変数から取れるようになる.ただし,単位が違って「ミリ秒」なので注意する必要がある.
まとめ
- Jenkins を使うときは,ジョブにタイムアウトを設定しておくと安心できる場合がある
- 最近の Jenkins だと Install suggested plugins に Build-timeout Plugin が入っている
- 計5種類のタイムアウト設定があるので,ジョブの特性によって選ぶことができる