如何在Jenkins 2.0 Pipeline作业中执行命令并返回stdout

22

在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

这是可能的吗?


可能是一个重复的问题,参考链接:如何在Jenkinsfile(groovy)中执行一个shell命令,并将其输出保存到变量中? - Krzysztof Krasoń
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,这有点不幸。

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

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


3
我们可以一起使用吗?将"catch returnStdout"存储在一个变量中,将"returnStatus"存储在另一个变量中?因为重复运行脚本并不好。 - sirineBEJI
@codeGeass 这个应该怎么工作?一个函数只有一个返回值(即堆栈上其返回值的一个内存位置),因此也只有一个变量赋值。请参见“在数学中,函数是二元关系”。如果要返回两个(或甚至更多,如错误消息),您必须使用复杂的字符串:CSV、JSON、XML等。 - Gerold Broser
1
@codeGeass 请查看此链接以了解详情:如何在Jenkins Pipeline sh脚本步骤中返回标准输出或标准错误以及状态 - Gerold Broser
我曾经考虑过像 map 一样以多条目的形式返回输出..但是现在(4年后)我知道 jenkins 不允许这样做 :) - sirineBEJI

21

更新

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

解决办法

不幸的是,这个特性仍然不受支持且缺失。有关更多信息,请参阅官方工单

JENKINS-26133 Shell script taking/returning output/status 状态: 分配人员:优先级:解决状态:未解决Jesse Glick Major Open


描述

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

可能需要在durable-task中进行一些API更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接