Ich versuche, eine Jenkins-Pipeline zu erstellen, in der ich mehrere Shell-Befehle ausführen und das Ergebnis eines Befehls im nächsten Befehl verwenden muss. Ich fand heraus, dass das Umschließen der Befehle in ein Paar von drei einfachen Anführungszeichen '''
dasselbe bewirken kann. Ich habe jedoch Probleme bei der Verwendung von Pipe, um die Ausgabe eines Befehls an einen anderen Befehl weiterzuleiten. Zum Beispiel
stage('Test') {
sh '''
echo "Executing Tests"
URL=`curl -s "http://localhost:4040/api/tunnels/command_line" | jq -r '.public_url'`
echo $URL
RESULT=`curl -sPOST "https://api.ghostinspector.com/v1/suites/[redacted]/execute/?apiKey=[redacted]&startUrl=$URL" | jq -r '.code'`
echo $RESULT
'''
}
Befehle mit Pipe funktionieren nicht richtig. Hier ist die Ausgabe der Jenkins-Konsole:
+ echo Executing Tests
Executing Tests
+ curl -s http://localhost:4040/api/tunnels/command_line
+ jq -r .public_url
+ URL=null
+ echo null
null
+ curl -sPOST https://api.ghostinspector.com/v1/suites/[redacted]/execute/?apiKey=[redacted]&startUrl=null
Ich habe versucht, alle diese Befehle in den Jenkins-Snippet-Generator für Pipeline einzugeben, und dies ergab folgende Ausgabe:
sh ''' echo "Executing Tests"
URL=`curl -s "http://localhost:4040/api/tunnels/command_line" | jq -r \'.public_url\'`
echo $URL
RESULT=`curl -sPOST "https://api.ghostinspector.com/v1/suites/[redacted]/execute/?apiKey=[redacted]&startUrl=$URL" | jq -r \'.code\'`
echo $RESULT
'''
Beachten Sie die einzelnen Anführungszeichen in den Befehlen jq -r \'.public_url\'
und jq -r \'.code\'
. Durch die Verwendung des Codes auf diese Weise wurde das Problem behoben
UPDATE: : Nach einiger Zeit gab es sogar Probleme. Vor diesen Befehlen wurden bestimmte Befehle ausgeführt. Einer von ihnen war grunt serve
und der andere war ./ngrok http 9000
. Ich habe nach jedem dieser Befehle etwas Verzögerung hinzugefügt und das Problem wurde vorerst gelöst.
Ich teile die Befehle mit &&
node {
FOO = world
stage('Preparation') { // for display purposes
sh "ls -a && pwd && echo ${FOO}"
}
}
Das Beispiel gibt Folgendes aus: - ls -a (die Dateien in Ihrem Arbeitsbereich - pwd (Standortarbeitsbereich) - echo world