21

有没有更好的方法在 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

这可能吗?

4

2 回答 2

22

是的,正如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,这有点不幸。

您可以在此处阅读更多官方文档

编辑:此外,它还允许您对失败/不稳定的构建状态进行更细粒度的控制。你可以在我的评论中看到一个例子

于 2016-08-19T15:18:48.570 回答
20

更新

自 6/2016 JENKINS-26133被正式标记为已解决。因此,在尝试以下解决方法之前,首先尝试支持的实现sh/bat使得可以使用 returnStdoutreturnStatus参数。

解决方法

不幸的是,此功能仍然不受支持且缺失。更多信息请参考官方门票

JENKINS-26133 Shell 脚本获取/返回输出/状态状态:受让人:优先级:解决方案:打开 Jesse Glick 主要未解决


描述

目前 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 更改。

于 2016-04-30T18:21:16.557 回答