(समस्या के बारे में भ्रम को दूर करने का प्रयास करने के लिए मूल पोस्ट से संपादित/अपडेट किया गया)

समस्या यह है: मान जो जेनकिंसफाइल पर्यावरण अनुभाग में सेट हैं, 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() पर्यावरण में सभी मान वापस नहीं करता है, यह जेनकिंसफाइल के पर्यावरण अनुभाग के अंदर सेट किए गए किसी भी मान को शामिल नहीं करता है।

1
Zdenik 17 फरवरी 2021, 03:55

3 जवाब

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

मेरे पास आपके लिए "क्यों" उत्तर नहीं है, लेकिन आप रीडप्रॉपर्टीज चरण के माध्यम से env से आउटपुट को पार्स करके धोखा दे सकते हैं और एक नक्शा प्राप्त कर सकते हैं।

def envMap = readProperties(text: sh(script: 'env', returnStdout: true))
println(envMap.getClass())
println("${envMap}")
1
Greg Biles 19 फरवरी 2021, 20:32

मैं 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"'
            }
        }
    }
}
}
1
Ram Kamath 19 फरवरी 2021, 19:55

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 का उपयोग कर सकें

-1
Samit Kumar Patel 26 फरवरी 2021, 11:51