2017-05-21 41 views
11

Chcę uruchomić wiele etapów wewnątrz zamka w deklaratywnej Jenkins rurociągu:Jak zablokować wiele etapów deklaratywnego potoku Jenkins?

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

      stage('Stage 2') { 
       steps { 
        echo "my second step" 
       } 
      } 

     } 
    } 
} 

pojawia się następujący błąd:

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 

Jaki jest problem? documentation wyraźnie stwierdza:

lock can be also used to wrap multiple stages into a single concurrency unit

Odpowiedz

8

Problem polega na tym, że pomimo faktu, że deklaratywne rurociągi były technically available in beta in September, 2016, blogu odwołać (od października) jest udokumentowanie skryptów rurociągi, a nie deklaratywne (nie powiedzieć tyle , więc czuję twój ból). Zasoby z blokadą nie zostały wypieczone jako deklaratywny krok potokowy w sposób, który umożliwiałby szukaną funkcję jeszcze.

można zrobić:

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

Ale nie można zrobić:

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

I nie można zrobić:

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

Można użyć skryptów dla rurociągu ten przypadek użycia.

+0

Sprawa jest nadal otwarta: https://issues.jenkins-ci.org/browse/JENKINS-43336 –

+0

Pamiętaj, że blokada wymaga wtyczki z blokadą zasobów: https://plugins.jenkins.io/lockable-resources –

11

Należy zauważyć, że można zablokować wszystkie etapy w rurociągu za pomocą opcji Lock:

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!" 
      } 
     } 
    } 
} 
+0

to działało dla nas. –