tutorial scripted scm examples example groovy jenkins-workflow jenkins-pipeline jenkinsfile

groovy - scm - scripted pipeline examples



¿Cómo implemento una opción de reintento para etapas fallidas en las tuberías de Jenkins? (3)

Tengo un archivo Jenkins con varias etapas y una de ellas es, de hecho, otro trabajo (el de implementación) que puede fallar en algunos casos.

Sé que puedo hacer avisos usando Jenkinsfile, pero realmente no sé cómo implementar un mecanismo de reintento para este trabajo.

Quiero poder hacer clic en la etapa fallida y elegir volver a intentarlo.


Debería poder combinar reintento + entrada para hacer eso Algo así

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'' } } }

también puede usar el tiempo de espera para la entrada si desea que termine si nadie valida. También hay waitUntil que puede ser útil pero aún no lo he usado

Editar: WaitUntil parece definitivamente el mejor, deberías jugar un poco, pero algo así es más limpio:

stage(''deploy-test'') { waitUntil { try { build ''yourJob'' } catch(error) { input "Retry the job ?" false } } }

Por cierto, hay documentos todos los pasos aquí https://jenkins.io/doc/pipeline/steps


Esta esencia (no la mía) fue una de las mejores opciones que encontré al intentar implementar esta funcionalidad también. https://gist.github.com/beercan1989/b66b7643b48434f5bdf7e1c87094acb9

Lo cambié a un método en una biblioteca compartida que simplemente reintentó o canceló mis necesidades. También agregué un máximo de reintentos e hice que el tiempo de espera fuera variable para que pudiéramos cambiarlo dependiendo del trabajo o etapa que lo necesite.

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; } } } } }

Ejemplo de uso con un máximo de 2 reintentos que esperan 60 segundos para la entrada.

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) }

Solo recuerde colocar nodos dentro del cierre para que esperar una entrada no bloquee a un ejecutor.

Si tiene la empresa jenkins paga, Cloudbees tiene un complemento Checkpoint que puede manejarlo mejor, pero no está previsto que se lance para Jenkins de código abierto ( JENKINS-33846 ).


Este con una buena espera incremental

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'' } }