2017-05-21 11 views
11

मैं एक कथात्मक जेनकींस पाइप लाइन के भीतर एक ताला अंदर कई चरणों चलाना चाहते हैं:घोषणात्मक जेनकींस पाइपलाइन के कई चरणों को कैसे लॉक करें?

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

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

     } 
    } 
} 

मैं निम्नलिखित त्रुटि मिलती है:

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 

क्या समस्या यहाँ है? documentation स्पष्ट रूप से कहा:

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

उत्तर

8

समस्या यह है कि, तथ्य यह है कि कथात्मक पाइपलाइनों technically available in beta in September, 2016 थे के बावजूद, ब्लॉग पोस्ट आप (अक्टूबर से), कथात्मक नहीं (यह रूप में ज्यादा कहना नहीं है पटकथा पाइपलाइनों का दस्तावेजीकरण है संदर्भ है , इसलिए मुझे तुम्हारा दर्द महसूस होता है)। लॉक करने योग्य संसाधनों को एक घोषणात्मक पाइपलाइन चरण के रूप में बेक नहीं किया गया है जो उस सुविधा को सक्षम करेगा जो आप अभी तक ढूंढ रहे हैं।

आप कर सकते हैं:

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

लेकिन आप ऐसा नहीं कर सकते:

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

और तुम ऐसा नहीं कर सकते:

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

आप के लिए एक पटकथा पाइपलाइन इस्तेमाल कर सकते हैं इस मामले का उपयोग करें।

+0

मुद्दा अभी भी खुला है: https://issues.jenkins-ci.org/browse/जेनकिन्स -43336 –

+0

ध्यान दें कि लॉक को लॉक करने योग्य संसाधन प्लगइन की आवश्यकता है: https://plugins.jenkins.io/lockable-resources –

11

ऐसा नहीं है कि आप लॉक विकल्प का उपयोग कर एक पाइप लाइन में सभी चरणों लॉक कर सकते हैं ध्यान दिया जाना चाहिए:

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

यह हमारे लिए काम करता है। –

संबंधित मुद्दे