Ist es möglich, das stdout über den Befehl sh DSL in der Pipeline zu erfassen?


86

Beispielsweise:

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

Ich werde bekommen:

output=0

Anscheinend bekomme ich also eher den Exit-Code als den Standard-Code. Ist es möglich, das stdout in einer Pipeline-Variablen zu erfassen, sodass ich Folgendes erhalten kann: output=foo als Ergebnis?

Antworten:


220

Jetzt unterstützt der shSchritt die Rückgabe von stdout durch Angabe des Parameters 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)

Siehe dieses Beispiel .


9
Beachten Sie den .trim()Teil dieser Antwort, andernfalls erhalten Sie möglicherweise ein Zeilenumbruchzeichen am Ende der Zeile
Will Munn

2
append --shortzu rev-parseDose erhalten nur direkt einen kurzen Hash
Leon

Ich bin mir nicht sicher, was den Fehler verursacht hat, aber ich musste die Ausgabe auch so in einen String umwandelngitCommit = sh(returnStdout: true, script: 'git rev-parse HEAD').toString().trim()
Balkrishna

Hallo, wofür steht '.take (6)'?
Vano

1
@Vano, das sich auf die Groovy-Methode take () bezieht, die in diesem Fall die ersten 6 Zeichen erhält. docs.groovy-lang.org/docs/groovy-2.3.2/html/api/org/codehaus/…
ahillman3

47

Hinweis: Das verknüpfte Jenkins-Problem wurde inzwischen behoben.

Wie in JENKINS-26133 erwähnt , war es nicht möglich, die Shell-Ausgabe als Variable abzurufen . Als Problemumgehung wurde die Verwendung von Writ-Read aus temporären Dateien vorgeschlagen. Ihr Beispiel hätte also so ausgesehen:

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

21
Informationen für Neulinge finden Sie in der Antwort stackoverflow.com/a/38912813/345845 unten. Dies wurde seitdem durch den neuen returnStdoutParameter, der an den shSchritt übergeben wurde, erleichtert .
Baptiste Mathus

2
"Es ist nicht möglich, eine Shell-Ausgabe als Variable zu erhalten" - nicht wahr. Dies ist ein Hack, die richtige Antwort ist returnStdout.
Graham

4
Das einzige Mal , das ist eigentlich eine gute Antwort ist , wenn Sie benötigen sowohl die stdoutund die exit statusvon der Shell - Befehl. In anderen Fällen verwenden Sie den returnStdoutParameter.
Simon Forsberg

4

Versuche dies:

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
    ...
}

Getestet am:

  • Jenkins ver. 2.19.1
  • Pipeline 2.4

3

Sie können auch versuchen, diese Funktionen zu verwenden, um StdErr StdOut zu erfassen und Code zurückzugeben.

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}"
    }
}

Beachten:

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

1

Eine kurze Version wäre:

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


0

Ich hatte das gleiche Problem und versuchte fast alles, was ich fand, nachdem ich erfahren hatte, dass ich es im falschen Block versuchte. Ich habe es in Schritten Block versucht, während es im Umgebungsblock sein muss.

        stage('Release') {
                    environment {
                            my_var = sh(script: "/bin/bash ${assign_version} || ls ", , returnStdout: true).trim()
                                }
                    steps {                                 
                            println my_var
                            }
                }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.