如何为 Jenkins 管道中的失败阶段实施重试选项?
How do I implement a retry option for failed stages in Jenkins pipelines?
我有一个包含多个阶段的 Jenkinsfile,其中一个实际上是另一个作业(部署作业),在某些情况下可能会失败。
我知道我可以使用 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
这个要点(不是我的)是我在尝试实现此功能时发现的更好的选择之一。 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;
}
}
}
}
}
最多重试 2 次并等待 60 秒输入的示例用法。
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 enterprise 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'
}
}
我有一个包含多个阶段的 Jenkinsfile,其中一个实际上是另一个作业(部署作业),在某些情况下可能会失败。
我知道我可以使用 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
这个要点(不是我的)是我在尝试实现此功能时发现的更好的选择之一。 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;
}
}
}
}
}
最多重试 2 次并等待 60 秒输入的示例用法。
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 enterprise 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'
}
}