如何在Jenkins 2.0管道作业中执行命令,然后返回stdout

时间:2016-04-30 15:51:00

标签: jenkins groovy jenkins-workflow jenkins-pipeline jenkins-2

是否有更好的方法在Jenkins 2.0管道中运行shell任务,然后返回命令的stdout。我能让它工作的唯一方法是将命令的输出传递给文件,然后将文件读入变量。

sh('git config --get remote.origin.url > GIT_URL')
def stdout = readFile('GIT_URL').trim()

这似乎是一种非常糟糕的返回输出的方法。我希望我能做一些像:

def stdout = sh('git config --get remote.origin.url').stdout

def exitcode = sh('git config --get remote.origin.url').exitcode

这可能吗?

2 个答案:

答案 0 :(得分:20)

luka5z提到的,管道节点和进程插件版本2.4现在支持这种东西:

def stdout = sh(script: 'git config --get remote.origin.url', returnStdout: true)
println stdout

def retstat = sh(script: 'git config --get remote.origin.url', returnStatus: true)
println retstat

似乎你试图在同一个脚本中返回两者,returnStatus会覆盖returnStdout,这有点不幸。

您可以在官方文档here

中阅读更多内容

编辑: 此外,它还允许您对失败/不稳定的构建状态进行更精细的控制。您可以在我的评论here

中查看示例

答案 1 :(得分:19)

更新

自2016年6月起JENKINS-26133正式标记为已解决。因此,在尝试以下变通方法之前,首先尝试sh / bat支持implementation,这样就可以使用returnStdoutreturnStatus参数。

变通方法

不幸的是,此功能仍然不受支持和缺失。有关详细信息,请参阅官方ticket

  

JENKINS-26133 Shell脚本获取/返回输出/状态状态:   受让人:优先顺序:决议:公开Jesse Glick Major Unresolved

  

描述

     

目前sh没有有意义的返回值,并抛出异常   如果退出状态不为零。很高兴有一个选项   让它将退出代码(零或不返回)作为整数值返回:

def r = sh script: 'someCommand', returnStatus: true
     

目前的解决方法:

sh 'someCommand; echo $? > status' 
def r = readFile('status').trim()
     

或者让它返回标准输出(类似于shell反引号):

def lines = sh(script: 'dumpStuff.sh', returnStdout: true).split("\r?\n")
     

解决方法:

sh 'dumpStuff.sh > result'
def lines = readFile('result').split("\r?\n")
     

或者在标准输入上采取一些措施:

sh script: 'loadStuff.sh', stdin: someText
     

解决方法:

writeFile file: 'input', text: someText >     sh 'loadStuff.sh < input'
     

可能需要在持久任务中进行一些API更改。