jenkins pipeline: multiline shell commands with pipe

笑着哭i 提交于 2020-01-02 00:11:25

问题


I am trying to create a Jenkins pipeline where I need to execute multiple shell commands and use the result of one command in the next command or so. I found that wrapping the commands in a pair of three single quotes ''' can accomplish the same. However, I am facing issues while using pipe to feed output of one command to another command. For example

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

Commands with pipe are not working properly. Here is the jenkins console output:

+ 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

回答1:


I tried entering all these commands in the jenkins snippet generator for pipeline and it gave the following output:

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
'''

Notice the escaped single quotes in the commands jq -r \'.public_url\' and jq -r \'.code\'. Using the code this way solved the problem

UPDATE: : After a while even that started to give problems. There were certain commands executing prior to these commands. One of them was grunt serve and the other was ./ngrok http 9000. I added some delay after each of these commands and it solved the problem for now.




回答2:


The following scenario shows a real example that may need to use multiline shell commands. Which is, say you are using a plugin like Publish Over SSH and you need to execute a set of commands in the destination host in a single SSH session:

stage ('Prepare destination host') {
  sh '''
      ssh -t -t user@host 'bash -s << 'ENDSSH'
      if [[ -d "/path/to/some/directory/" ]];
      then
          rm -f /path/to/some/directory/*.jar
      else
          sudo mkdir -p /path/to/some/directory/
          sudo chmod -R 755 /path/to/some/directory/
          sudo chown -R user:user /path/to/some/directory/
      fi
ENDSSH'
     '''
}

Special Notes:

  • The last ENDSSH' should not have any characters before it. So it should be at the starting position of a new line.
  • use ssh -t -t if you have sudo within the remote shell command



回答3:


I split the commands with &&

node {
  FOO = world
  stage('Preparation') { // for display purposes
      sh "ls -a && pwd && echo ${FOO}"
  }
}

The example outputs: - ls -a (the files in your workspace - pwd (location workspace) - echo world



来源:https://stackoverflow.com/questions/43452317/jenkins-pipeline-multiline-shell-commands-with-pipe

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!