
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
してあげたらうまくいくのかも。