(समस्या के बारे में भ्रम को दूर करने का प्रयास करने के लिए मूल पोस्ट से संपादित/अपडेट किया गया)
समस्या यह है: मान जो जेनकिंसफाइल पर्यावरण अनुभाग में सेट हैं, env.getEnvironment() द्वारा लौटाए गए ऑब्जेक्ट में नहीं जोड़े जाते हैं।
प्रश्न यह है: मैं परिवेश अनुभाग में असाइन किए गए मानों सहित संपूर्ण परिवेश का मानचित्र कैसे प्राप्त करूं? क्योंकि env.getEnvironment() ऐसा नहीं करता है।
उदाहरण जेनकिंसफाइल:
pipeline {
agent any
environment {
// this is not included in env.getEnvironment()
ONE = '1'
}
stages {
stage('Init') {
steps {
script {
// this is included in env.getEnvironment()
env['TWO'] = '2'
}
}
}
stage('Test') {
steps {
script {
// get env values as a map (for passing to groovy methods)
def envObject = env.getEnvironment()
// see what env.getEnvironment() looks like
// notice ONE is not present in the output, but TWO is
// ONE is set using ONE = '1' in the environment section above
// TWO is set using env['TWO'] = '2' in the Init stage above
println envObject.toString()
// for good measure loop through the env.getEnvironment() map
// and print any value(s) named ONE or TWO
// only TWO: 2 is output
envObject.each { k,v ->
if (k == 'ONE' || k == 'TWO') {
println "${k}: ${v}"
}
}
// now show that both ONE and TWO are indeed in the environment
// by shelling out and using the env linux command
// this outputs ONE=1 and TWO=2
sh 'env | grep -E "ONE|TWO"'
}
}
}
}
}
आउटपुट (envObject.toString() का आउटपुट प्रासंगिक भाग को छोड़कर ... को छोटा कर दिया गया है):
[Pipeline] {
[Pipeline] withEnv
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Init)
[Pipeline] script
[Pipeline] {
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
[..., TWO:2]
[Pipeline] echo
TWO: 2
[Pipeline] sh
+ env
+ grep -E ONE|TWO
ONE=1
TWO=2
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
नोटिस ONE env.getEnvironment() ऑब्जेक्ट से गायब है, लेकिन TWO मौजूद है।
यह भी ध्यान दें कि एक और दो दोनों वास्तविक वातावरण में सेट हैं और मैं यह नहीं पूछ रहा हूं कि पर्यावरण तक कैसे पहुंचें या env.getEnvironment() द्वारा लौटाए गए मानों के माध्यम से कैसे पुनरावृति करें। मुद्दा यह है कि env.getEnvironment() पर्यावरण में सभी मान वापस नहीं करता है, यह जेनकिंसफाइल के पर्यावरण अनुभाग के अंदर सेट किए गए किसी भी मान को शामिल नहीं करता है।
3 जवाब
मेरे पास आपके लिए "क्यों" उत्तर नहीं है, लेकिन आप रीडप्रॉपर्टीज चरण के माध्यम से env
से आउटपुट को पार्स करके धोखा दे सकते हैं और एक नक्शा प्राप्त कर सकते हैं।
def envMap = readProperties(text: sh(script: 'env', returnStdout: true))
println(envMap.getClass())
println("${envMap}")
मैं env प्राप्त करूंगा और इसे संपत्तियों की मदद से मानचित्र में परिवर्तित करूंगा
pipeline {
agent any
environment {
// this is not included in env.getEnvironment()
ONE = '1'
}
stages {
stage('Init') {
steps {
script {
// this is included in env.getEnvironment()
env['TWO'] = '2'
}
}
}
stage('Test') {
steps {
script {
def envProp = readProperties text: sh (script: "env", returnStdout: true).trim()
Map envMapFromProp = envProp as Map
echo "ONE=${envMapFromProp.ONE}\nTWO=${envMapFromProp.TWO}"
// now show that both ONE and TWO are indeed in the environment
// by shelling out and using the env linux command
// this outputs ONE=1 and TWO=2
sh 'env | grep -E "ONE|TWO"'
}
}
}
}
}
env.getEnvironment()
पद्धति का आउटपुट किसी सूची या मानचित्र को वापस नहीं करेगा, इसलिए each
के साथ पुनरावृति करना मुश्किल है, लेकिन कुछ उपाय हैं जो आप इस काम को करने के लिए कर सकते हैं।
import groovy.json.JsonSlurper
pipeline {
agent any;
environment {
ONE = 1
TWO = 2
}
stages {
stage('debug') {
steps {
script {
def jsonSlurper = new JsonSlurper()
def object = jsonSlurper.parseText(env.getEnvironment().toString())
assert object instanceof Map
object.each { k,v ->
echo "Key: ${k}, Value: ${v}"
}
}
}
}
}
}
नोट - env.getEnvironment().toString()
आपको एक JSON स्ट्रिंग देगा। JOSN स्ट्रिंग को पार्स करते समय अगर ग्रोवी jsonSlurper.parseText
को कोई विशेष वर्ण मिला तो यह एक त्रुटि के माध्यम से होगा
आप env जेनकिन्स एपीआई और एक उपयुक्त विधि खोजें जो या तो एक नक्शा या सूची लौटाए ताकि आप each
का उपयोग कर सकें
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
environment-variables
पर्यावरण चर गतिशील नामित मानों का एक समूह है जो कंप्यूटर पर चलने वाली प्रक्रियाओं को प्रभावित कर सकता है।