jenkins管道:管道

时间:2017-04-17 13:19:24

标签: jenkins groovy jenkins-pipeline

我正在尝试创建一个Jenkins管道,我需要执行多个shell命令并在下一个命令中使用一个命令的结果。我发现将命令包装在一对三个单引号'''中可以完成相同的操作。但是,在使用管道将一个命令的输出提供给另一个命令时,我遇到了问题。例如

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

带管道的命令无法正常工作。这是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

3 个答案:

答案 0 :(得分:9)

我尝试在jenkins片段生成器中为管道输入所有这些命令,它给出了以下输出:

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

请注意命令jq -r \'.public_url\'jq -r \'.code\'中的转义单引号。这种方式使用代码解决了问题

更新::过了一段时间,甚至开始出现问题。在这些命令之前执行某些命令。其中一个是grunt serve,另一个是./ngrok http 9000。我在每个命令之后添加了一些延迟,它现在解决了问题。

答案 1 :(得分:1)

我用&&

拆分命令
      nav {
        width: 75%;
        margin: auto
      }

      #menu {background-color: #98bf21}

      .container{padding: 0.10em}

      .cell-row {display:table; width:100%}
      .cell {display: table-cell}
      .cell-middle {vertical-align: middle}

      a:link, a:visited {
        font-weight: bold;
        color: black;
        text-align: center;
        padding: 4px;
        text-decoration: none;
        text-transform: uppercase;
      }

      a:hover, a:active {background-color: #7A991A}

      @media (max-width: 500px) {
        .mobile {
          display: block; 
          width: 100%; 
          text-align: center
        }
							
        nav {
          width: 100%;
          margin: auto
        }  
      }

示例输出: - ls -a(工作区中的文件 - pwd(位置工作区) - 回声世界

答案 2 :(得分:0)

以下情形显示了一个实际的示例,可能需要使用多行shell命令。也就是说,假设您正在使用Publish Over SSH之类的插件,并且需要在单个SSH会话中的目标主机中执行一组命令:

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

特殊说明:

  • 最后一个ENDSSH'之前不能包含任何字符。所以 应该在新行的开始位置。
  • 如果远程Shell命令中包含ssh -t -t,请使用sudo