नमस्कार चरण में लिखी गई 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
}
}
}
}
मैं मूल्यों तक पहुंच सकता हूं लेकिन इसे बदल नहीं सकता, क्या दायरा केवल पावरहेल तक ही सीमित है?
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
}