2016-12-03 3 views
3

Kann nicht speichern sh Befehlsausgabe durch DSL (groovy) in Jenkins Pipeline JobKann nicht sh Befehlsausgabe durch DSL (groovy) in Jenkins Pipeline Job speichern

ich letzte Build-Ausgabe in Pipeline jenkins erhalten möchte Job und anhängen in E-Mail (mit E-Mail-Plugin). Curl funktioniert gut und liefert eine korrekte Build-Ausgabe, aber ich kann nicht in Variablen speichern, um sie in der E-Mail anzuhängen. Ich benutze die neueste Version von Jenkins.

Ich kann sehen, es gibt einige verwandte Beiträge für einfache SH-Befehl, aber das funktioniert nicht für Curl Response Store.

Code versucht:

1.

def consoleOutput = sh(returnStdout: true, script: 'curl http://' + jenkinsUser + ':' + jenkinsUserToken + '@' + jenkinsServer + ':8080/job/' + 'myJob/lastBuild/consoleText').trim() 
echo consoleOutput 

2.

sh 'curl http://' + jenkinsUser + ':' + jenkinsUserToken + '@' + jenkinsServer + ':8080/job/' + "${env.JOB_NAME}" + '/lastBuild/consoleText; echo $? > status' 
def consoleOutput = readFile('status').trim() 

3.

def consoleOutput = sh(script: 'curl http://' + jenkinsUser + ':' + jenkinsUserToken + '@' + jenkinsServer + ':8080/job/' + '/myJob/lastBuild/consoleText', returnStatus: true).split("\r?\n") 
echo consoleOutput 

Kann mir bitte jemand helfen?

+0

http://stackoverflow.com/questions/36547680/how-to-do-i-get-the-output-of-a-shell-command-executed-using-into-a-variable-fro –

+0

I Es tut mir leid, aber ich habe diese Möglichkeiten ausprobiert und bin auch durch diesen Beitrag gegangen, aber es funktioniert nicht und nach diesem Build schlägt fehl. Es geht nicht weiter zur nächsten Zeile, wenn es um die Ausführung von jenkins Seite geht. Danke Tim! –

+0

Ihr erster Ansatz sollte das richtige Ergebnis erhalten, einfach die Variable nicht neu definieren. – Topro

Antwort

3

Es sieht aus wie Sie die innere Anordnung und einige doppelten Anführungszeichen und entkam doppelte Anführungszeichen für die Ausführung des Skriptes fehlen:

sh([ script: "curl \"http://${jenkinsUser}:${jenkinsUserToken}@${jenkinsServer}:8080/job/myJob/lastBuild/consoleText\"").trim() 

auch mehr Möglichkeiten gibt es Shell-Skripten zu tun, und es hängt von der Art von Jenkins Pipeline Sie verwenden.

In einem jenkins declarative pipeline Sie benötigen einen script {...} Block für alle Skript-Typ-Code und Einstellung Variablen enthalten, und das würde wie folgt aussehen:

pipeline { 
    agent { 
     ... 
    } 
    parameters { 
     ... 
    } 
    environment { 
    ... 
    } 
    stages { 
     stage('Run Required Scripts') { 
      steps { 
       ... 
       script { 
        NOTIFIER_BULD_NAME = sh([script: "./getNotifier.sh", returnStdout: true]).trim() 
        EMAIL_TEXT = sh([script: "./printEmailText.sh ${CURRENT_BUILD} ${PREVIOUS_BUILD}", returnStdout: true]).trim() 
        BODY= sh([ script: "curl \"http://${jenkinsUser}:${jenkinsUserToken}@${jenkinsServer}:8080/job/myJob/lastBuild/consoleText\"").trim() 
       } 
      } 
     } 
     stage('Send Email') { 
      when { 
       expression { 
        // Only send when there is text. 
        "${EMAIL_TEXT}" != ""; 
       } 
      } 
      steps{ 
       emailext (
        to: '[email protected]', 
        subject: "You have mail - ${EMAIL_TEXT}", 
        body: """${NOTIFIER_BULD_NAME} - ${EMAIL_TEXT}: 
... 
${BODY} 
""", 
        attachLog: false 
       ) 
      } 
     } 
    } 

In einem Jenkins scripted pipeline, die Sie nicht brauchen einen script{} Block, Sie können es tatsächlich an den meisten Orten platzieren. Meistens habe ich es in der Stufe Blöcke stage('some stage'){...} setzen und ich habe es so gemacht:

V5_DIR = WORKSPACE + '/' + sh([script: "basename ${V5_GIT_URL} .git", returnStdout: true]).trim() 

Obwohl ich auch curl Befehle verwendet haben (für eine Skript-Pipelines) und nicht die innere Anordnung brauchte ...

lastSuccessfulCommit = sh(
    script: "curl -sL --user ${JENKINS_API_USER}:${JENKINS_API_PSW} \"${lastSuccessfulCommitUrl}\" | sed -e 's/<[^>]*>//g'", 
    returnStdout: true 
) 

Und als Referenz, sieht in beiden

sh([script: "echo \"Value: ${someVariable}\""]) 

Hoffentlich this documentation hilft auch ein wenig vars Echo, aber ich weiß, vor kurzem Dokumentation Jenkins sein kann ziemlich fleckig, so fand ich auch a great gist about how to not do things for Jenkins Declarative pipelines. Viel Glück!

Verwandte Themen