जेनकींस पाइपलाइन नौकरी के भीतर सभी `env` संपत्तियों की सूची कैसे करें?


105

जेनकींस 2.1 निर्माण पाइपलाइन को देखते हुए, जेनकींस एक envचर को इंजेक्ट करता है node{}। उदाहरण के लिए,BRANCH_NAME साथ पहुँचा जा सकता है

node {
    echo ${env.BRANCH_NAME}
    ...

मैं सभी को प्रतिध्वनित करना चाहता हूं env जेनकींस पाइपलाइन के भीतर गुणों

... यह देखते हुए कि मुझे नहीं पता समय से पहले सभी गुणों को ।

मुझे जैसे कोड की तलाश है

node {
    for(e in env){
        echo e + " is " + ${e}
    }
    ...

जो कुछ इस तरह गूंज जाएगा

 BRANCH_NAME is myBranch2
 CHANGE_ID is 44
 ...

env एक नक्शा है। क्या आपने सामान्य पुनरावृत्ति की कोशिश की? जैसे - env.each {प्रिंटल इट}
जयन

3
का डुप्लिकेट की तरह लग रहा stackoverflow.com/questions/36836806/...
करज़िस्तोफ Krasoń

3
Afaik env सिर्फ पर्यावरण चरों को एनकैप्सुलेट करता है। मुझे नहीं लगता कि आप इसके माध्यम से लूप कर सकते हैं। विंडोज़ पर 'sh env' को linux / 'bat set' पर आज़माएँ।
डोमिनिक गेबार्ट

1
@Renato @Jayan मेरी टिप्पणी के अनुसार, env.each { name, value -> println "Name: $name -> Value $value" }प्रिंट करता है Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee -> Value null
जेम्सटॉमासून 1979

1
@ JamesThomasMoon1979 ऐसा इसलिए है क्योंकि पाइप लाइन ग्रूवी क्लोजर को तोड़ती है। यदि आप इसे पुराने-जावा स्टाइल (जो है new ClassName() { ... }) को सही करते हैं, तो यह काम करना चाहिए। या आप इसे टैग की गई विधि पर चलाते हैं @NonCPS, तो क्लोजर उस के अंदर भी काम करेगा।
डैनियल सी। सोबरल

जवाबों:


87

एक और, अधिक संक्षिप्त तरीका:

node {
    echo sh(returnStdout: true, script: 'env')
    // ...
}

सीएफ https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#code-sh-code-shell-script


21
विंडोज के shसाथ batऔर envसाथ बदलें set
jmkgreen

1
"श" मामले के लिए मैं 'env' का उपयोग करता हूँ सॉर्ट 'क्योंकि यह मुझे पागल बनाता है कि यह कुंजी द्वारा आदेश नहीं दिया गया है।
जेफ हट्टन

80

घोषणात्मक पाइपलाइन के लिए जेनकिंस प्रलेखन के अनुसार :

sh 'printenv'

जेनकींस स्क्रिप्टेड पाइपलाइन के लिए :

echo sh(script: 'env|sort', returnStdout: true)

ऊपर भी सुविधा के लिए अपने env vars।


1
printenvसिर्फ एक शेल कमांड है जो पर्यावरण को प्रिंट करता है, जेनकिंस के लिए कुछ भी विशिष्ट नहीं है। तर्कों के बिना यह तर्कों के बराबर है env। मुझे पूरा यकीन है कि sh 'printenv | sort'यह डीसीएल या स्क्रिप्टेड पाइपलाइन में काम करेगा।
simon.watts

sh 'printenv | sort'जेनकींस घोषणात्मक पाइपलाइन के लिए परीक्षण और वास्तव में काम करता है; fwiw sh 'env | sort'भी काम करता है (दोनों ने जेनकिंस वेर पर परीक्षण किया। 2.46.1)। मैंने मूल रूप से उल्लेख किया है sh 'printenv'क्योंकि यह आधिकारिक जेनकिंस प्रलेखन में संदर्भित किया गया था।
वाटेकेका

1
यदि आप रिटर्न खो देते हैं। सत्य: तो आपको प्रतिध्वनि की आवश्यकता नहीं है; यह केवल मुद्रण है जो शेल स्क्रिप्ट पहले से ही मुद्रित है।
एड रान्डेल

26

निम्नलिखित कार्य:

@NonCPS
def printParams() {
  env.getEnvironment().each { name, value -> println "Name: $name -> Value $value" }
}
printParams()

ध्यान दें कि यह संभवतः पहले निष्पादन पर विफल हो जाएगा और आपको जेनकींस सैंडबॉक्स में चलने के लिए विभिन्न ग्रूवी विधियों की आवश्यकता होगी। यह "जेनकींस / इन-प्रोसेस स्क्रिप्ट अनुमोदन का प्रबंधन" किया जाता है

सूची में मुझे शामिल किया गया है:

  • BUILD_DISPLAY_NAME
  • BUILD_ID
  • निर्माण संख्या
  • BUILD_TAG
  • BUILD_URL
  • CLASSPATH
  • HUDSON_HOME
  • HUDSON_SERVER_COOKIE
  • HUDSON_URL
  • JENKINS_HOME
  • JENKINS_SERVER_COOKIE
  • JENKINS_URL
  • JOB_BASE_NAME
  • कार्य नाम
  • JOB_URL

1
यह काम नहीं करता है:java.lang.UnsupportedOperationException: each on a CPS-transformed closure is not yet supported
ऑक्टेवियन

5
क्या आपने इसे शामिल करना सुनिश्चित किया @NonCPS?
जो सी।

1
यह सबसे अच्छा जवाब है क्योंकि यह एक नोड ब्लॉक के बाहर काम करेगा । इस लिए आपका बहुत - बहुत धन्यवाद।
Gi0rgi0s

15

आप चरण sh/ batचरण का उपयोग करके परिणाम पूरा कर सकते हैं और readFile:

node {
    sh 'env > env.txt'
    readFile('env.txt').split("\r?\n").each {
        println it
    }
}

दुर्भाग्य env.getEnvironment()से पर्यावरण चर का बहुत सीमित नक्शा देता है।


1
sh 'env > env.txt'अच्छी तरह से काम करता है और शेल प्रक्रिया द्वारा बनाए गए पर्यावरण चर शामिल हैं। env.getEnvironment()केवल जेनकिंस पर्यावरण चर दिखाता है जो कि sh 'env'तकनीक में देखा गया एक सबसेट है । साथ ही, इसे स्क्रिप्ट सुरक्षा अनुमोदन की आवश्यकता है method org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction getEnvironmentenv.each { name, value -> println "Name: $name -> Value $value" }@Renato @Jayan द्वारा सिफारिश की केवल प्रिंट Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee -> Value null
जेम्सटॉमसमास

नाइस !!! सभी env var को प्रिंट करने में सक्षम होने के कारण मुझे पता चला कि जेनकिन्स 2 में एक JOB_BASE_NAME संस्करण सेट है, जिसमें नौकरी का नाम उस फ़ोल्डर को शामिल करता है जिसमें वह रहता है।
बिल आयु

एक संस्करण जो विंडोज़ पर काम करता है वह भी भयानक होगा :)
बास हैमर

खिड़कियों के संस्करण के लिए @ बाम हैमर "बैट" द्वारा "श" को बदलने की कोशिश करते हैं
सेबेस्टियन

2
मुझे एक त्रुटि java.lang.UnsupportedOperationException देता है: सार्वजनिक स्थैतिक java.lang.Object org.codehaus.groovy.runtime.DefaultGroovyMethod.each (java.lang.Object, groovy.lang.Closure) को CPS- ट्रांसफ़र बंद कर रहा है। अभी तक समर्थित (JENKINS-26481); एक @NonCPS विधि में इनकैप्सुलेट करें, या जावा-स्टाइल लूप का उपयोग करें
बेन मैथ्यूज

12

यह सारी जटिलता क्यों?

sh 'env'

आपको क्या चाहिए (अंडर * निक्स)


इसे निष्पादित करने के लिए नोड ब्लॉक की आवश्यकता होती है। मेरे उपयोग-मामले के लिए मुझे यह संसाधित करने की आवश्यकता है कि नोड के पास क्या वातावरण होगा और फिर कुछ मानदंडों के आधार पर नोड को स्पिन किया जाएगा।
बिल वार्नर

10

यहां एक त्वरित स्क्रिप्ट है जिसे आप सभी पर्यावरण चर को सूचीबद्ध करने के लिए पाइपलाइन कार्य के रूप में जोड़ सकते हैं:

node {
    echo(env.getEnvironment().collect({environmentVariable ->  "${environmentVariable.key} = ${environmentVariable.value}"}).join("\n"))
    echo(System.getenv().collect({environmentVariable ->  "${environmentVariable.key} = ${environmentVariable.value}"}).join("\n"))
}

यह सिस्टम और जेनकिंस चर दोनों को सूचीबद्ध करेगा।


9

सभी पर्यावरण चर को सूचीबद्ध करने का क्रॉस-प्लेटफ़ॉर्म तरीका:

if (isUnix()) {
    sh env
}
else {
    bat set
}

7

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

प्रिंट खराब:

sh 'echo `env`'

प्रिंट खराब:

sh 'env > env.txt'
for (String i : readFile('env.txt').split("\r?\n")) {
    println i
}

प्रिंट अच्छी तरह से:

sh 'env > env.txt'
sh 'cat env.txt'

अच्छी तरह से प्रिंट: (@mjfroehlich द्वारा उल्लिखित)

echo sh(script: 'env', returnStdout: true)

3

ऊपर दिए गए उत्तर, अब नई पाइपलाइन सिंटैक्स के कारण प्राचीन हैं। नीचे पर्यावरण चर को प्रिंट करता है।

script {
        sh 'env > env.txt'
        String[] envs = readFile('env.txt').split("\r?\n")

        for(String vars: envs){
            println(vars)
        }
    }

1
1. आपको इसे स्क्रिप्ट ब्लॉक में रखना होगा। 2. वे ov ग्रूवी स्टाइल ’लूप की सराहना कर रहे हैं।
एडी

forएक बंद के साथ भी एक के बिना समस्याओं का कारण होगा @NonCPSएनोटेशन।
drewish

2

शुद्ध ग्रूवी समाधान है कि वैश्विक पढ़ envचर सभी वातावरण चर मुद्रित नहीं है (उदाहरण के लिए वे चर से याद कर रहे हैं environmentब्लॉक से, withEnvसंदर्भ ओएस से मशीन विशिष्ट चर का सबसे और)। शेल चरणों का उपयोग करना अधिक पूर्ण सेट प्राप्त करना संभव है, लेकिन इसके लिए एक nodeसंदर्भ की आवश्यकता होती है , जो हमेशा नहीं चाहता है।

यहां एक समाधान है जो getContextवर्तमान संदर्भ के लिए पाइपलाइन मापदंडों सहित पर्यावरण चर का पूरा सेट पुनर्प्राप्त करने और मुद्रित करने के लिए कदम का उपयोग करता है।

कैविएट: ग्रूवी सैंडबॉक्स में काम नहीं करता है। यद्यपि आप इसे किसी विश्वसनीय साझा लाइब्रेरी से उपयोग कर सकते हैं।

def envAll = getContext( hudson.EnvVars )
echo envAll.collect{ k, v -> "$k = $v" }.join('\n')

1

यदि आप वास्तव में envसिर्फ सूची में लूप करना चाहते हैं:

def envs = sh(returnStdout: true, script: 'env').split('\n')
envs.each { name  ->
    println "Name: $name"
}

0

प्रश्न में उल्लिखित आउटपुट प्राप्त करने का दूसरा तरीका:

envtext= "printenv".execute().text
envtext.split('\n').each
{   envvar=it.split("=")
    println envvar[0]+" is "+envvar[1]
}

मानदंड से मेल खाते हुए env vars के सबसेट के साथ नक्शा बनाने के लिए इसे आसानी से बढ़ाया जा सकता है:

envdict=[:]
envtext= "printenv".execute().text
envtext.split('\n').each
{   envvar=it.split("=")
    if (envvar[0].startsWith("GERRIT_"))
        envdict.put(envvar[0],envvar[1])
}    
envdict.each{println it.key+" is "+it.value}

0

मुझे लगता है कि आपको एक स्क्रिप्ट के रूप में इसकी आवश्यकता थी, लेकिन अगर कोई और सिर्फ जेनकिंस जीयूआई के माध्यम से एक नज़र रखना चाहता है, तो वह सूची हर बिल्ड के प्रासंगिक बाएं मेनू में "पर्यावरण चर" अनुभाग का चयन करके पाई जा सकती है परियोजना का चयन करें = > बिल्ड बिल्ड => पर्यावरण चर का चयन करें

यहां छवि विवरण दर्ज करें


2
यह हमेशा उपलब्ध नहीं है।
shuckc

1
मुझे नहीं लगता कि यह जेनकिंसफाइल्स के लिए बिल्कुल भी उपलब्ध है। स्क्रीनशॉट एक फ्रीस्टाइल बिल्ड की तरह दिखता है।
जैकब बोचेंस्की


-1

आप अपने जेनकींस उदाहरण से सभी चर प्राप्त कर सकते हैं। बस यात्रा करें:

  • $ {Jenkins_host} /env-vars.html
  • $ {Jenkins_host} / पाइपलाइन-वाक्य रचना / वैश्विक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.