web-dev-qa-db-fra.com

pipeline jenkins: commandes Shell multilignes avec tuyau

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
12
Mandeep Singh

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. 

6
Mandeep Singh

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

0