मैं घोषणात्मक जेनकींस पाइपलाइन में चरणों के बीच चर कैसे पार करूं?


83

मैं घोषणात्मक पाइपलाइन में चरणों के बीच चर कैसे पार कर सकता हूं?

एक स्क्रिप्टेड पाइपलाइन में, मैं इकट्ठा करता हूं प्रक्रिया एक अस्थायी फ़ाइल पर लिखना है, फिर फ़ाइल को एक चर में पढ़ें।

मैं घोषणात्मक पाइपलाइन में यह कैसे कर सकता हूं?

उदाहरण के लिए, मैं एक शेल एक्शन द्वारा बनाए गए वैरिएबल के आधार पर एक अलग नौकरी के निर्माण को ट्रिगर करना चाहता हूं।

stage("stage 1") {
    steps {
        sh "do_something > var.txt"
        // I want to get var.txt into VAR
    }
}
stage("stage 2") {
    steps {
        build job: "job2", parameters[string(name: "var", value: "${VAR})]
    }
}

लिखने और पढ़ने के भाग के लिए, शश / अस्थिर btw है।
sebkraemer

1
पर्यावरण चर का उपयोग करने के बारे में क्या है , जो वैश्विक चर की तरह काम करता है?
विवेके

जवाबों:


99

यदि आप एक फ़ाइल का उपयोग करना चाहते हैं (चूंकि एक स्क्रिप्ट वह चीज़ है जो आपके लिए आवश्यक मूल्य पैदा करती है), तो आप readFileनीचे दिए गए अनुसार उपयोग कर सकते हैं । यदि नहीं, तो नीचे दिए गए विकल्प के shसाथ उपयोग scriptकरें:

// Define a groovy global variable, myVar.
// A local, def myVar = 'initial_value', didn't work for me.
// Your mileage may vary.
// Defining the variable here maybe adds a bit of clarity,
// showing that it is intended to be used across multiple stages.
myVar = 'initial_value'

pipeline {
  agent { label 'docker' }
  stages {
    stage('one') {
      steps {
        echo "${myVar}" // prints 'initial_value'
        sh 'echo hotness > myfile.txt'
        script {
          // OPTION 1: set variable by reading from file.
          // FYI, trim removes leading and trailing whitespace from the string
          myVar = readFile('myfile.txt').trim()

          // OPTION 2: set variable by grabbing output from script
          myVar = sh(script: 'echo hotness', returnStdout: true).trim()
        }
        echo "${myVar}" // prints 'hotness'
      }
    }
    stage('two') {
      steps {
        echo "${myVar}" // prints 'hotness'
      }
    }
    // this stage is skipped due to the when expression, so nothing is printed
    stage('three') {
      when {
        expression { myVar != 'hotness' }
      }
      steps {
        echo "three: ${myVar}"
      }
    }
  }
}

1
यदि आप फ़ाइल के शीर्ष पर अपना कॉन्फ़िगर करना चाहते हैं, तो आप def myVarइसे केवल बाद में उपयोग कर सकते हैं और उपयोग कर सकते हैं echo ${myVar};)
bastianwegge

4
बहुत बुराई दर्ज करने और अवांछित डिस्को बनाने के लिए भी लिखना नहीं है?
डर्कोस

4
आप सही हैं @Dirkos लेकिन फ़ाइल रीड / राइट को शामिल किए बिना जो कुछ भी अनुरोध किया गया था, उसे प्राप्त करने का एक बेहतर तरीका है। इस उत्तर को देखें stackoverflow.com/a/43881731/1053510
user1053510

1
मैं अपनी टिप्पणी को दूसरे उत्तर से हटा रहा हूं, लेकिन मैं withEnvदूसरे चरण में एक आवरण का उपयोग करने की सिफारिश करूंगा , ताकि आप के संदर्भ में चर का उपयोग कर सकें sh। अन्यथा, यह एक रिक्त स्ट्रिंग मुद्रित करेगा। कम से कम यह जेनकिंस 2.124 के साथ करता है।
सर्जियो

1
जब तक आप समानांतर चरण से पहले चर सेट करते हैं (ऊपर उदाहरण में, चरण "तीन" वह जगह है जहां आपको उस काम को करना होगा जहां आपको समानांतर में करने की ज़रूरत है) का उपयोग करने के लिए @ConradB यहां ठीक काम करना चाहिए।
बर्नटेक

17

बस:

  pipeline {
        parameters {
            string(name: 'custom_var', defaultValue: '')
        }

        stage("make param global") {
             steps {
               tmp_param =  sh (script: 'most amazing shell command', returnStdout: true).trim()
               env.custom_var = tmp_param
              }
        }
        stage("test if param was saved") {
            steps {
              echo "${env.custom_var}"
            }
        }
  }

@KatieS द्वारा बताए गए दस्तावेज़ के अनुसार, पैरामीटर {} ब्लॉक में परिभाषित पैरामीटर $ {params.custom_var} के रूप में एक्सेस किए जाते हैं न कि $ {env.custom_var}। दोनों काम करते हैं लेकिन एक अलग चर है जिसमें विभिन्न मूल्य हो सकते हैं। लेकिन पैरामीटर के साथ आपका समाधान {} ब्लॉक मेरे लिए $ {params.custom_var} के माध्यम से उन तक पहुंचने के लिए ठीक काम करता है
मार्टिन

4
मैं गलत था। पैरामीटर {} उपयोग किए गए मापदंडों के लिए उपयोग किए जाते हैं और अपरिवर्तनीय लगते हैं, उन्हें पाइपलाइन में सेट करने की कोशिश कर रहे हैं (मापदंडों में उन्हें डिफ़ॉल्ट मान असाइन करने के लिए {}) बिना किसी त्रुटि संदेश के चरण को विफल कर देगा। तो env.custom_var जाने का रास्ता है। इस स्थिति में पैरामीटर {} ब्लॉक छोड़ा जा सकता है।
मार्टिन

यह कई जेनकींस फ़ाइल में काम करता है। मैं जो करने की कोशिश कर रहा हूं वह बिल्ड से रेपो पर नवीनतम प्रतिबद्ध पर पारित कर रहा है। जेनकिंसफाइल से लेकर तैनाती तक।जेनेक्सफाइल?
गुरप्रीत सिंह 10

वैसे भी मापदंडों में $ {कार्यक्षेत्र} जैसा कुछ डालने के लिए? स्ट्रिंग की तरह (नाम: 'custom_var', defaultValue: "$ {कार्यक्षेत्र} / a")
yuxh

2
यकीन नहीं है कि यह कैसे काम करेगा। मुझे नहीं लगता कि आप "स्क्रिप्ट" चरण का उपयोग किए बिना सीधे "चरण" ब्लॉक के अंदर एक चर सेट कर सकते हैं।
अर्नब

6

मुझे भी इसी तरह की समस्या थी क्योंकि मैं चाहता था कि एक विशिष्ट पाइपलाइन वैरिएबल प्रदान करे और कई अन्य इस वैरिएबल को प्राप्त करने के लिए इसका उपयोग करें।

मैंने अपना एक सेट-एनव-वैरिएबल पाइपलाइन बनाया

script
{
    env.my_dev_version = "0.0.4-SNAPSHOT"
    env.my_qa_version  = "0.0.4-SNAPSHOT"
    env.my_pp_version  = "0.0.2"
    env.my_prd_version = "0.0.2"
    echo " My versions  [DEV:${env.my_dev_version}] [QA:${env.my_qa_version}] [PP:${env.my_pp_version}] [PRD:${env.my_prd_version}]"
}

मैं इन वेरिएबल्स को एक अन्य पाइपलाइन में अपने सेट-एन-वैरिएबल-टेस्ट में पुन: उपयोग कर सकता हूं

script 
{
    env.dev_version = "NOT DEFINED DEV"
    env.qa_version  = "NOT DEFINED QA"
    env.pp_version  = "NOT DEFINED PP"
    env.prd_version = "NOT DEFINED PRD"
}

stage('inject variables') {

    echo "PRE DEV version = ${env.dev_version}"
    script 
    {
       def variables = build job: 'my-set-env-variables'
       def vars = variables.getBuildVariables()
      //println "found variables" + vars
      env.dev_version = vars.my_dev_version
      env.qa_version  = vars.my_qa_version
      env.pp_version  = vars.my_pp_version
      env.prd_version = vars.my_prd_version
    }
}

stage('next job') {
    echo "NEXT JOB DEV version = ${env.dev_version}"
    echo "NEXT JOB QA version = ${env.qa_version}"
    echo "NEXT JOB PP version = ${env.pp_version}"
    echo "NEXT JOB PRD version = ${env.prd_version}"

}


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.