是否有更好的方法在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
这可能吗?
答案 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,这样就可以使用returnStdout
和returnStatus
参数。
不幸的是,此功能仍然不受支持和缺失。有关详细信息,请参阅官方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更改。