नमस्कार चरण में लिखी गई Powershell स्क्रिप्ट से जेनकिंस Env चर को अपडेट करने का प्रयास कर रहा है

pipeline {
    agent { label 'master' }
    environment {
        def var1    = "default_value"
        def var2    = "default var 2"
    }
    stages {
        stage ('step-1') {
            steps {
                script { 
                    powershell (returnStdout: true, script: '''
                        ${env:var1} = "changed from powershell"
                        ${env:var2} = "var2 changed from powershell"
                    ''').trim()
                }
            }
        }
        stage ("step-2"){
            steps {
                echo var1
                echo var2
            }
        }
    }
}

मैं मूल्यों तक पहुंच सकता हूं लेकिन इसे बदल नहीं सकता, क्या दायरा केवल पावरहेल तक ही सीमित है?

2
Ganesh 28 जुलाई 2020, 19:15

1 उत्तर

सबसे बढ़िया उत्तर

डिज़ाइन के अनुसार, एक सबशेल अपने पैरेंट शेल के वातावरण को संशोधित नहीं कर सकता है। प्रत्येक powershell, sh, या bat चरण जिसे Jenkinsfile के भीतर कहा जाता है, चाइल्ड प्रोसेस को चलाने के लिए एक नया सबशेल बनाता है। इसलिए, इन चरणों के अंदर घोषित कोई भी पर्यावरण चर जैसे ही चाइल्ड प्रोसेस समाप्त होता है और पाइपलाइन ग्रूवी स्क्रिप्ट के लिए उपलब्ध नहीं होता है, खो जाता है।

वर्तमान में Jenkinsfile में ऐसा करने का एक तरीका है कि आप अपने सबहेल के stdout को ग्रूवी स्क्रिप्ट में ही एक वेरिएबल में असाइन करें।

script {
    env.var1 = powershell(returnStdout: true, script: '<single command>').trim()
}

जाहिर है, इस दृष्टिकोण की गंभीर सीमाएँ हैं क्योंकि आप एक समय में केवल एक ही कमांड चला सकते हैं और वह भी, केवल तभी जब यह एक चर के रूप में उपयोग करने के लिए एक उपयुक्त आउटपुट लौटाएगा।

एक अन्य तरीका यह है कि किसी फ़ाइल में मान लिखें और फिर अपनी पाइपलाइन में पर्यावरण चर को डाउनस्ट्रीम सेट करने के लिए ग्रोवी स्क्रिप्ट का उपयोग करके इन मानों को पढ़ें।

संपादित करें

आपकी टिप्पणी के आधार पर, यदि आपका stdout स्ट्रिंग के रूप में दो अलग-अलग मान देता है, तो आप उन्हें अलग-अलग मानों में पार्स करने का प्रयास कर सकते हैं। उदाहरण के लिए:

script {
    def output = powershell(returnStdout: true, script: '''
        <command1>
        <command2>
    '''
    println(output)
    /*Prints:
    value1
    value2
    */
    env.var1 = output.tokenize('\n')[0].trim()  \\value1
    env.var2 = output.tokenize('\n')[1].trim()  \\value2
}
3
Dibakar Aditya 29 जुलाई 2020, 09:11