当前位置: 首页 > 知识库问答 >
问题:

如何在Jenkins 2.0管道作业中执行命令,然后返回标准输出

凌翔宇
2023-03-14

有没有更好的方法在Jenkins2.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个答案

魏凯捷
2023-03-14

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

不幸的是,此功能仍然不受支持且缺失。有关更多信息,请参阅官方票证:

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

描述

目前sh没有有意义的返回值,如果退出状态不为零,则会引发异常。最好有一个选项让它以整数值返回退出代码(零或否):

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

当前解决方法:

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

或者让它返回其标准输出(类似于shell backticks):

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

东门修文
2023-03-14

是的,正如luka5z提到的,Pipeline Nodes and Process Plugin的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将覆盖ReturnsDout,这有点不幸。

您可以在这里的官方文档中阅读更多内容

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

 类似资料:
  • 我想通过管道传输我的hadoop流作业。例如,我运行了一个命令hadoop jarhadoop-streaming.jar-mappermap1.pyreducer.py-inputxx输出 /output1 但是我想使用第一步的输出作为第二步mapduce作业的输入,而不存储在hdfs中,也许输出为标准输出。有没有像linux管道一样的东西?比如hadoop jarhadoop-streamin

  • 问题内容: 在Linux 3.0 / C ++下: 我想要一个执行以下操作的函数: 显然上述方法不起作用,但是您可以理解。我有一个字符串s,我希望将其作为应用程序“ foo”的子进程执行的标准输入传递,然后将其标准输出记录到字符串r中,然后将其返回。 我应该使用linux syscall或posix函数的什么组合? 问题答案: eerpini提供的代码无法正常工作。请注意,例如,之后将使用在父级中

  • 问题内容: 这是一段简单的代码: 我将其执行为:java Read <input.txt 一旦将input.txt完全传递到程序中,x就会保持无限的null。为什么呢?有没有办法在将文件输入代码后使标准输入(命令行)活动?我尝试关闭流并重新打开,但它不起作用。重置等。 问题答案: 通过执行操作,您已经告诉操作系统,对于此过程,管道文件 是 标准文件。您不能再从应用程序内部切换回命令行。 如果要这样

  • 问题内容: 是否可以在管道常规脚本中直接调用PowerShell命令?在Jenkins中使用自定义作业时,我可以使用PowerShell插件调用该命令。但是在groovy脚本中没有片段可以使用它。 我也尝试过,但似乎此命令不允许在命令中包含多行和注释。 问题答案: 要从Groovy脚本调用PowerShell脚本,请执行以下操作: 您必须使用命令。 之后,您必须确保正确返回错误代码()变量(应导致

  • 问题内容: 我想知道是否有一种方法可以在Go中运行一定的时间,然后在从通道接收到值后将其杀死。在似乎不支持命令管道。谢谢。 问题答案: 这是我的管道示例,通过OS Std Pipe归档一个调用文件b,您可以对其进行编辑并添加计时器以执行所需的操作。 文件b:

  • 问题内容: 所以我正在与paramiko一起进行一些基本的SSH测试,并且没有将任何输出输出到stdout中。这是我的代码。 因此,每当我运行此命令时,都会执行该命令(如执行cp之类的操作所看到的那样,文件将被复制),但是我始终会收到“此命令无输出”的信息。当输出stdout = stdout.readlines()时,输出为[]。另外,如果我将打印语句添加到for循环中,它将永远不会运行。有人可