J'essaie de créer un pipeline Jenkins dans lequel je dois exécuter plusieurs commandes Shell et utiliser le résultat d'une commande dans la commande suivante. J'ai constaté que le fait de regrouper les commandes dans une paire de trois guillemets simples '''
peut accomplir la même chose. Cependant, je rencontre des problèmes lorsque j'utilise un canal pour alimenter la sortie d'une commande en une autre. Par exemple
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
'''
}
Les commandes avec pipe ne fonctionnent pas correctement. Voici la sortie de la console Jenkins:
+ 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
J'ai essayé d'entrer toutes ces commandes dans le générateur d'extraits de code jenkins pour le pipeline et cela a donné la sortie suivante:
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
'''
Notez les guillemets simples échappés dans les commandes jq -r \'.public_url\'
et jq -r \'.code\'
. Utiliser le code de cette façon a résolu le problème
UPDATE: : Après un certain temps, même cela a commencé à poser des problèmes. Certaines commandes s’exécutaient avant ces commandes. L'un d'entre eux était grunt serve
et l'autre ./ngrok http 9000
. J'ai ajouté un peu de retard après chacune de ces commandes et cela résout le problème pour le moment.
Je divise les commandes avec &&
node {
FOO = world
stage('Preparation') { // for display purposes
sh "ls -a && pwd && echo ${FOO}"
}
}
Les exemples de sortie: - ls -a (les fichiers de votre espace de travail - pwd (emplacement de travail) - echo world