tutorial example español currentbuild jenkins jenkins-pipeline

example - ¿Cómo bloquear múltiples etapas del oleoducto declarativo de Jenkins?



jenkins pipeline tutorial español (4)

Quiero ejecutar varias etapas dentro de un bloqueo dentro de una tubería declarativa de Jenkins:

pipeline { agent any stages { lock(resource: ''myResource'') { stage(''Stage 1'') { steps { echo "my first step" } } stage(''Stage 2'') { steps { echo "my second step" } } } } }

Obtuve el siguiente error:

Started by user anonymous org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: WorkflowScript: 10: Expected a stage @ line 10, column 9. lock(resource: ''myResource'') { ^ WorkflowScript: 10: Stage does not have a name @ line 10, column 9. lock(resource: ''myResource'') { ^ WorkflowScript: 10: Nothing to execute within stage "null" @ line 10, column 9. lock(resource: ''myResource'') { ^ 3 errors at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310) at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1085) at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:603) at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:581) at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:558) at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298) at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268) at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688) at groovy.lang.GroovyShell.parse(GroovyShell.java:700) at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:116) at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:430) at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:393) at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:257) at hudson.model.ResourceController.execute(ResourceController.java:97) at hudson.model.Executor.run(Executor.java:405) Finished: FAILURE

¿Cuál es el problema aquí? La documentation establece explícitamente:

lock se puede usar para envolver múltiples etapas en una sola unidad de concurrencia


Debe tenerse en cuenta que puede bloquear todas las etapas en una tubería utilizando la opción de bloqueo:

pipeline { agent any options { lock resource: ''shared_resource_lock'' } stages { stage(''will_already_be_locked'') { steps { echo "I am locked before I enter the stage!" } } stage(''will_also_be_locked'') { steps { echo "I am still locked!" } } } }


El problema es que, a pesar del hecho de que las canalizaciones declarativas estaban técnicamente disponibles en la versión beta en septiembre de 2016 , la publicación del blog a la que hace referencia (desde octubre) está documentando tuberías con guiones, no declarativa (no dice mucho, así que creo que dolor). Los recursos bloqueables no se han incorporado como un paso declarativo de la tubería de una manera que permitiría la característica que está buscando todavía.

Tu puedes hacer:

pipeline { agent { label ''docker'' } stages { stage(''one'') { steps { lock(''something'') { echo ''stage one'' } } } } }

Pero no puedes hacer:

pipeline { agent { label ''docker'' } stages { lock(''something'') { stage(''one'') { steps { echo ''stage one'' } } stage(''two'') { steps { echo ''stage two'' } } } } }

Y no puedes hacer:

pipeline { agent { label ''docker'' } stages { stage(''one'') { lock(''something'') { steps { echo ''stage one'' } } } } }

Podría usar una tubería con guión para este caso de uso.


Esto ha sido arreglado.

Ahora puede bloquear múltiples etapas agrupándolas en una etapa principal, de esta manera:

stage(''Parent'') { options { lock(''something'') } stages { stage(''one'') { ... } stage(''two'') { ... } } }

(No olvides que necesitas el complemento de recursos bloqueables )


Si el canal solo utiliza el recurso, también podría deshabilitar las construcciones simultáneas:

pipeline { agent any options { disableConcurrentBuilds() } stages { stage(''will_already_be_locked'') { steps { echo "I am locked before I enter the stage!" } } stage(''will_also_be_locked'') { steps { echo "I am still locked!" } } } }