2017-04-17 153 views
3

我想创建一个詹金斯管道,我需要执行多个shell命令并在下一个命令左右使用一个命令的结果。我发现在一对三个单引号'''中包装命令可以完成相同的操作。但是,在使用pipe将一个命令的输出提供给另一个命令时,我遇到了一些问题。例如詹金斯管道:与管道多行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 
     ''' 
    } 

带管的命令无法正常工作。这里是詹金斯控制台输出:

+ 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 
+0

我知道但是它可能会帮助其他人,只需在命令后面添加一个;按照您的示例, stage('Test'){ sh''' echo“Executing Tests”; UR L ='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; ''' } 我在詹金斯做了很多,这从来没有失败过。虽然我只是做了一个衬里(冷凝器在这里)没有多条漂亮的线:P – Nelson

回答

1

我试图进入在詹金斯所有这些命令片断发生器管道,它给了以下的输出:

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\'。使用这种方法代码解决了这个问题

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

+0

您正在执行网络命令并假设它们永远不会失败。这永远是一件坏事。你应该在使用popen4()或类似的语义的专用脚本中做到这一点,并做出相应的响应。不要忽视这样一种心态:忽视这一点会更快 - 你或者你的雇主会花费更多的时间跳过由于没有检查而导致的问题,而不是检查和报告。 –

0

我& &

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

的例子输出拆分命令: - LS -a(在您的工作空间 文件 - PWD(工作区位置) - 回声世界