複数のステージを持つJenkinsfileがあり、そのうちの1つは実際には別のジョブ(展開ジョブ)であり、場合によっては失敗する可能性があります。
Jenkinsfileを使用してプロンプトを作成できることは知っていますが、このジョブの再試行メカニズムを実装する方法は実際にはわかりません。
あなたはそれを行うために再試行と入力を組み合わせることができるはずです
stage('deploy-test') {
try {
build 'yourJob'
} catch(error) {
echo "First build failed, let's retry if accepted"
retry(2) {
input "Retry the job ?"
build 'yourJob'
}
}
}
誰も検証しない場合に終了させたい場合は、入力にタイムアウトを使用することもできます。役に立つかもしれないwaitUntilもありますが、まだ使用していません
編集:WaitUntilは間違いなく最高のようです、あなたはそれで少し遊ぶべきですが、そのようなものはきれいです:
stage('deploy-test') {
waitUntil {
try {
build 'yourJob'
} catch(error) {
input "Retry the job ?"
false
}
}
}
ちなみに、ここにはすべての手順のドキュメントがあります https://jenkins.io/doc/pipeline/steps
このGist(私のものではない)は、この機能を実装しようとするときに見つけた優れたオプションの1つでした。 https://Gist.github.com/beercan1989/b66b7643b48434f5bdf7e1c87094acb9
必要に応じて再試行または中止した共有ライブラリのメソッドに変更しました。また、最大再試行を追加し、タイムアウト変数を作成して、必要なジョブまたはステージに応じて変更できるようにしました。
package com.foo.bar.jenkins
def class PipelineHelper {
def steps
PipelineHelper(steps) {
this.steps = steps
}
void retryOrAbort(final Closure<?> action, int maxAttempts, int timeoutSeconds, final int count = 0) {
steps.echo "Trying action, attempt count is: ${count}"
try {
action.call();
} catch (final exception) {
steps.echo "${exception.toString()}"
steps.timeout(time: timeoutSeconds, unit: 'SECONDS') {
def userChoice = false
try {
userChoice = steps.input(message: 'Retry?', ok: 'Ok', parameters: [
[$class: 'BooleanParameterDefinition', defaultValue: true, description: '', name: 'Check to retry from failed stage']])
} catch (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException e) {
userChoice = false
}
if (userChoice) {
if (count <= maxAttempts) {
steps.echo "Retrying from failed stage."
return retryOrAbort(action, maxAttempts, timeoutMinutes, count + 1)
} else {
steps.echo "Max attempts reached. Will not retry."
throw exception
}
} else {
steps.echo 'Aborting'
throw exception;
}
}
}
}
}
60秒の入力を待機する最大2回の再試行の使用例。
def pipelineHelper = new PipelineHelper(this)
stage ('Retry Example'){
pipelineHelper.retryOrAbort({
node{
echo 'Here is an example'
throw new RuntimeException('This example will fail.')
}
}, 2, 60)
}
入力を待ってもエグゼキューターがブロックされないように、クロージャー内にノードを配置することを忘れないでください。
有料のjenkinsエンタープライズをお持ちの場合、Cloudbeesにはこれをより適切に処理できるCheckpointプラグインがありますが、オープンソースJenkinsのリリースは予定されていません( JENKINS-33846 )。
ナイスインクリメンタルウェイトを使用したこれ
stage('deploy-test') {
def retryAttempt = 0
retry(2) {
if (retryAttempt > 0) {
sleep(1000 * 2 + 2000 * retryAttempt)
}
retryAttempt = retryAttempt + 1
input "Retry the job ?"
build 'yourJob'
}
}