Jenkinsのパイプラインで retry を使ってジョブを再実行させる

Jenkinsのパイプライン(Pilepine)をさわっていて、ジョブの再実行のあたりがモヤモヤしていたので動きを調べてみた。結論としては、retryブロックはtryブロックに似たような処理をするので、try-catchで囲ったら予期せぬ動きになってしまう。

Retry the body up to N times

Jenkins パイプラインのリトライ(retry)は、失敗した場合、指定した回数だけリトライを実行してくれる(参考:Jenkins Pipleline Basic Steps)。

retry(3) {
// call job
}

上のように書くと、ジョブが失敗した場合に最大あと2回(合計で3回)実行を続けてくれる。不安定になりがちなジョブで設定すれば便利そう。

ただ、それでもジョブの失敗が続き、3回目に失敗すると、そこで例外が投げられてしまう。ということはその例外を捕まえないと、ジョブがそこで止まってしまう。

失敗は失敗で置いておいて、残りのジョブを続けたいときは以下のように書く。サンプルとして、ジョブを2つ実行し、1つ目のジョブ(job 1)だけわざと失敗させている。

https://gist.github.com/daipresents/c7f982ffce9c1bda73b4387d6b1ae3da.js?file=Jenkinsfile

実行ログは以下のようになる。

https://gist.github.com/daipresents/c7f982ffce9c1bda73b4387d6b1ae3da.js?file=ExecutionLog

ログを見てわかるように、Retryingと自動リトライが動いているのがわかる。そして、例外のStackTraceが2回流れているが、3回目は retryブロックの外に投げられているようで、Catchした中でトレースをハンドリングしないと表示されない。さらに、retryで捕捉しきれなかった例外を捕まえているので、「job 2」も実行されている。

ジョブのステータスはcurrentBuild.resultで管理されているので、適切なステータス(SUCCESS or FAILURE)を与えてあげる。

これを理解せずに使っていたときは、retryの中でtry-catchしてしまいretryがうまく機能していなかった。retryの中でtry-catchしたい場合は、catchの中でゴニョゴニョしたあとに、その例外をthrowしてあげたらうまくいくのかも。

広告