क्या पाइपलाइन में sh DSL कमांड से स्टैडआउट को कैप्चर करना संभव है


92

उदाहरण के लिए:

var output=sh "echo foo";
echo "output=$output";

मुझे मिलेगा:

output=0

इसलिए, जाहिर तौर पर मुझे स्टडआउट के बजाय निकास कोड मिलता है। क्या पाइपलाइन को वैरिएबल चर में पकड़ना संभव है, जैसे कि मुझे मिल सकता है: output=foo मेरे परिणाम के रूप में?

जवाबों:


227

अब , shकदम का समर्थन करता है लौटने stdout पैरामीटर की आपूर्ति करके returnStdout

// These should all be performed at the point where you've
// checked out your sources on the slave. A 'git' executable
// must be available.
// Most typical, if you're not cloning into a sub directory
gitCommit = sh(returnStdout: true, script: 'git rev-parse HEAD').trim()
// short SHA, possibly better for chat notifications, etc.
shortCommit = gitCommit.take(6)

इस उदाहरण को देखें ।


10
.trim()इस उत्तर के भाग पर ध्यान दें , अन्यथा आपको पंक्ति के अंत में एक नया चरित्र मिल सकता है
विल मुन्न

2
अपील सीधे सीधे एक छोटी हैश प्राप्त --shortकरने के लिए rev-parseकर सकते हैं
लियोन

सुनिश्चित नहीं है कि क्या विफलता हुई, लेकिन मुझे आउटपुट को स्ट्रिंग में भी बदलना पड़ाgitCommit = sh(returnStdout: true, script: 'git rev-parse HEAD').toString().trim()
बालकृष्ण

नमस्ते, क्या '.take (6)' के लिए खड़ा है?
Vano

1
@Vano जो ग्रूवी पद्धति को संदर्भित करता है (), जिसे इस मामले में पहले 6 वर्ण मिलेंगे। docs.groovy-lang.org/docs/groovy-2.3.2/html/api/org/codehaus/…
ahillman3

47

नोट: जुड़ा जेनकींस मुद्दा तब से हल हो गया है।

जैसा कि JENKINS-26133 में उल्लेख किया गया है कि एक चर के रूप में शेल आउटपुट प्राप्त करना संभव नहीं था। अस्थायी फ़ाइल से रिट-रीड का उपयोग करके सुझाए गए समाधान के रूप में। तो, आपका उदाहरण इस तरह दिखेगा:

sh "echo foo > result";
def output=readFile('result').trim()
echo "output=$output";

21
नवागंतुकों के लिए, नीचे दिए गए उत्तर stackoverflow.com/a/38912813/345845 देखें, यह तब से आसान हो गया था जब नए returnStdoutपैरामीटर को shचरण में पास किया गया था ।
बैप्टिस्ट माथस

2
"शेल आउटपुट को एक चर के रूप में प्राप्त करना संभव नहीं है" - सच नहीं है। यह एक हैक है, सही उत्तर रिटर्न है।
ग्राहम

4
केवल समय यह वास्तव में एक अच्छा जवाब है यदि आपको शेल कमांड से और दोनों की आवश्यकता है । अन्य बार, पैरामीटर का उपयोग करें । stdoutexit statusreturnStdout
साइमन फोर्सबर्ग

4

इसे इस्तेमाल करे:

def get_git_sha(git_dir='') {
    dir(git_dir) {
        return sh(returnStdout: true, script: 'git rev-parse HEAD').trim()
    }
}

node(BUILD_NODE) {
    ...
    repo_SHA = get_git_sha('src/FooBar.git')
    echo repo_SHA
    ...
}

पर परीक्षण किया गया:

  • जेनकिंस ver। 2.19.1
  • पाइपलाइन 2.4

3

आप StdErr StdOut और रिटर्न कोड को कैप्चर करने के लिए इस फ़ंक्शन का उपयोग करने का प्रयास कर सकते हैं।

def runShell(String command){
    def responseCode = sh returnStatus: true, script: "${command} &> tmp.txt" 
    def output =  readFile(file: "tmp.txt")

    if (responseCode != 0){
      println "[ERROR] ${output}"
      throw new Exception("${output}")
    }else{
      return "${output}"
    }
}

नोटिस:

&>name means 1>name 2>name -- redirect stdout and stderr to the file name

1

एक छोटा संस्करण होगा:

echo sh(script: 'ls -al', returnStdout: true).result


0

मैं एक ही मुद्दा था और लगभग सब कुछ करने की कोशिश की तो पता चला कि आने के बाद मैं इसे गलत ब्लॉक में आज़मा रहा था। मैं इसे स्टेप ब्लॉक में आज़मा रहा था जबकि इसे पर्यावरण ब्लॉक में होना चाहिए।

        stage('Release') {
                    environment {
                            my_var = sh(script: "/bin/bash ${assign_version} || ls ", , returnStdout: true).trim()
                                }
                    steps {                                 
                            println my_var
                            }
                }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.