जेनकिंस: पाइपलाइन चरण में परिवर्तन को परिभाषित नहीं कर सकता


106

मैं एक घोषणात्मक जेनकींस पाइपलाइन स्क्रिप्ट बनाने की कोशिश कर रहा हूं, लेकिन सरल चर घोषणा के साथ समस्या है।

यहाँ मेरी स्क्रिप्ट है:

pipeline {
   agent none
   stages {
       stage("first") {
           def foo = "foo" // fails with "WorkflowScript: 5: Expected a step @ line 5, column 13."
           sh "echo ${foo}"
       }
   }
}

हालाँकि, मुझे यह त्रुटि मिली:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 5: Expected a step @ line 5, column 13.
           def foo = "foo"
           ^

मैं जेनकिंस 2.7.4 और पाइपलाइन 2.4 पर हूं।

जवाबों:


101

जेनकिंस पाइपलाइन के लिए घोषणात्मक मॉडल में सिंटैक्स का एक सीमित उपसमूह है जो इसे stageब्लॉकों में अनुमति देता है - अधिक जानकारी के लिए सिंटैक्स गाइड देखें । आप script { ... }ब्लॉक में अपने कदमों को लपेटकर उस प्रतिबंध को बायपास कर सकते हैं , लेकिन परिणामस्वरूप, आप scriptब्लॉक के भीतर सिंटैक्स, मापदंडों आदि का सत्यापन खो देंगे ।


5
क्या होगा यदि मैं स्क्रिप्ट ब्लॉक के बाहर उस चर का उपयोग करना चाहता हूं?
Jan Steinke

3
स्क्रिप्ट ब्लॉक के बाहर चर का उपयोग करने के लिए इस stackoverflow.com/questions/43879733/… पर
सेंथिल ए कुमार

56

मुझे लगता है कि त्रुटि निर्दिष्ट लाइन से नहीं बल्कि पहली 3 लाइनों से आ रही है। इसके बजाय यह प्रयास करें:

node {
   stage("first") {
     def foo = "foo"
     sh "echo ${foo}"
   }
}

मुझे लगता है कि आपके पास कुछ अतिरिक्त लाइनें थीं जो मान्य नहीं हैं ...

संपादित करें

अवक्षेपक पाइपलाइन मॉडल प्रलेखन से , ऐसा लगता है कि आपको environmentअपने चरों को घोषित करने के लिए एक घोषणा खंड का उपयोग करना होगा, जैसे:

pipeline {
   environment {
     FOO = "foo"
   }

   agent none
   stages {
       stage("first") {
           sh "echo ${FOO}"
       }
   }
}

1
आप एक पर्यावरण ब्लॉक को एक चरण में भी जोड़ सकते हैं (जैसे कि यदि आपका चर पहले चरण में किया गया कुछ पर निर्भर करता है)।
तेरज़ा टोम्कोवा

34

@ Pom12, @abayer से सहमत हैं। उत्तर को पूरा करने के लिए आपको स्क्रिप्ट ब्लॉक जोड़ने की आवश्यकता है

कुछ इस तरह की कोशिश करो:

pipeline {
    agent any
    environment {
        ENV_NAME = "${env.BRANCH_NAME}"
    }

    // ----------------

    stages {
        stage('Build Container') {
            steps {
                echo 'Building Container..'

                script {
                    if (ENVIRONMENT_NAME == 'development') {
                        ENV_NAME = 'Development'
                    } else if (ENVIRONMENT_NAME == 'release') {
                        ENV_NAME = 'Production'
                    }
                }
                echo 'Building Branch: ' + env.BRANCH_NAME
                echo 'Build Number: ' + env.BUILD_NUMBER
                echo 'Building Environment: ' + ENV_NAME

                echo "Running your service with environemnt ${ENV_NAME} now"
            }
        }
    }
}

4
ध्यान दें कि यह उदाहरण मानता है कि जेनकींस के लिए पहले से ही एक परिभाषित पर्यावरण चर "ENVIRONMENT_NAME" है।
अल्बर्टो

1
क्या स्क्रिप्ट ब्लॉक पर्यावरण मूल्यों को बदल सकता है?
पिचब्लैक 408

हां, आप डी स्क्रिप्ट ब्लॉक के अंदर पर्यावरण मूल्य को बदल सकते हैं।
NicoPaez

8

जेनकिंस 2.138.3 में दो अलग-अलग प्रकार की पाइपलाइन हैं।

घोषणा और स्क्रिप्टेड पाइपलाइन।

"घोषणात्मक पाइपलाइन पाइपलाइन डीएसएल का एक नया विस्तार है (यह मूल रूप से केवल एक कदम के साथ एक पाइपलाइन स्क्रिप्ट है, तर्कों के साथ एक पाइपलाइन कदम (निर्देश कहा जाता है), इन निर्देशों को एक विशिष्ट वाक्यविन्यास का पालन करना चाहिए। इस नए प्रारूप की बात यह है कि अधिक सख्त है और इसलिए उन नई पाइपलाइनों के लिए आसान होना चाहिए, ग्राफिकल एडिटिंग के लिए अनुमति देता है और बहुत कुछ। स्क्रिप्टेड पाइपलाइन उन्नत आवश्यकताओं के लिए कमबैक है। "

जेनकींस पाइपलाइन: एजेंट बनाम नोड?

यहां एक घोषणात्मक पाइपलाइन में पर्यावरण और वैश्विक चर का उपयोग करने का एक उदाहरण है। मैं जो बता सकता हूं कि वे सेट होने के बाद पर्यावरण स्थिर हैं।

def  browser = 'Unknown'

pipeline {
    agent any
    environment {
    //Use Pipeline Utility Steps plugin to read information from pom.xml into env variables
    IMAGE = readMavenPom().getArtifactId()
    VERSION = readMavenPom().getVersion()


    }
    stages {
        stage('Example') {
            steps {
                script {
                    browser = sh(returnStdout: true, script: 'echo Chrome')
                }
            }
        }
        stage('SNAPSHOT') {
                when {
                    expression { 
                        return !env.JOB_NAME.equals("PROD") && !env.VERSION.contains("RELEASE")
                    }
                }
                steps {
                    echo "SNAPSHOT"
                    echo "${browser}"
                }
            }
            stage('RELEASE') {
                when {
                    expression { 
                        return !env.JOB_NAME.equals("TEST") && !env.VERSION.contains("RELEASE")
                    }
                }
                steps {
                    echo "RELEASE"
                    echo "${browser}"
                }
            }
    }//end of stages 
}//end of pipeline

उपरोक्त कोड से मुझे निम्नलिखित त्रुटि मिलती है: [पाइपलाइन] पाइपलाइन की शुरुआत [पाइपलाइन] readMavenPom [पाइपलाइन] पाइपलाइन की समाप्ति। एक कदम है कि इस प्रदान करता है के साथ कोड, जैसे: नोड
19 'mancocapac

नहीं, यह काम किया है। यह एक घोषणात्मक पाइपलाइन है। एजेंट का मतलब है कि यह किसी भी नोड पर काम कर सकता है
पिचब्लैक 408

@ पिचब्लैक 408, आप सही हैं मेरे पास मेरी पाइपलाइन के शीर्ष पर [एजेंट कोई नहीं] था। निश्चित नहीं है कि आपके कहने का क्या मतलब है: पर्यावरण स्थिर होने के बाद वे सेट होते हैं? उन्हें स्क्रिप्ट के अंदर बदला जा सकता है, जैसे स्क्रिप्ट {IMAGE = "newVal}
mancocapac

उदाहरण, IMAGE को देखें। यह परिवर्तनशील नहीं है जो पाइपलाइनों द्वारा बदला जा सकता है या होना चाहिए। यह मेरी समझ है कि इसे पर्यावरण के हिस्से के रूप में परिभाषा के बाद एक स्थिर मूल्य के रूप में माना जाना चाहिए।
पिचब्लैक 408

0

आप एक घोषणात्मक पाइपलाइन का उपयोग कर रहे हैं जिसमें ग्रूवी कोड को निष्पादित करने के लिए एक स्क्रिप्ट-चरण की आवश्यकता होती है । यह स्क्रिप्टेड पाइपलाइन की तुलना में बहुत बड़ा अंतर है जहां यह आवश्यक नहीं है।

आधिकारिक दस्तावेज निम्नलिखित कहते हैं:

स्क्रिप्ट स्टेप स्क्रिप्टेड पाइपलाइन का एक ब्लॉक लेता है और घोषणा करता है कि घोषणा की पाइपलाइन में।

pipeline {
   agent none
   stages {
       stage("first") {
           script {
               def foo = "foo" 
               sh "echo ${foo}"
           }
       }
   }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.