脚本返回代码引发的失败/不稳定问题

8

我希望能够获取到我的Jenkins构建作业的结果,无论是失败(红色),不稳定(黄色)还是成功(绿色)……

如果从我的Shell脚本中返回非零值,我只能得到失败的结果。是否有任何返回代码会产生不稳定的结果?


1
可能是如何在Jenkins中运行shell脚本时将构建标记为不稳定的重复问题(虽然它是关于PHP而不是Bash,但概念应该是相同的)。 - Oliver Charlesworth
我认为我的问题的答案很简单,就是不行。只有通过使用补充插件才能实现。 - khmarbaise
那个相关的问题讨论了CLI模式下的jar文件如何实现这一点。这意味着有一些方法可以做到这一点。你只需要找出那个jar文件调用了哪个API等来实现它。 - Etan Reisner
1
问题已被Jenkins团队确认:https://issues.jenkins-ci.org/browse/JENKINS-23786 - ıɾuǝʞ
现在完全可以实现这一点,无需额外的插件:https://dev59.com/T2sz5IYBdhLWcg3wCDl2#49676269 - Alan Franzoni
6个回答

19

更新: Jenkins的新版本支持设置不稳定(unstable)的退出代码。更多信息请参考这里 (感谢@Pedro和@gib)

我没有测试过这个。

以下为原始回答:

不,脚本退出代码不会在Jenkins中产生不稳定(unstable)的构建结果。

唯一设置不稳定(unstable)的构建结果的方法是通过Jenkins进行编程。

这就是Jenkins的测试工具包部分所做的事情。

您还可以直接从脚本使用Jenkins CLI来设置当前正在执行的构建的结果。而不是返回特定的退出代码,让您的脚本执行Jenkins CLI命令。有关详细信息,请前往您自己的服务器,转到http://<your-server>/cli/command/set-build-result

还有许多插件也可以实现相同的功能,包括:


这在以前是正确的,但现在你可以使用returnStatus来实现这个功能(请参见https://dev59.com/KYLba4cB1Zd3GeqPibgV#47158087)。 - gib
即使没有管道 / Groovy,您也可以做同样的事情。请参阅https://dev59.com/T2sz5IYBdhLWcg3wCDl2#49676269。 - Alan Franzoni

4
这在较新版本的Jenkins中已经成为可能,您可以这样做:
#!/usr/bin/env groovy

properties([
  parameters([string(name: 'foo', defaultValue: 'bar', description: 'Fails job if not bar (unstable if bar)')]),
])


stage('Stage 1') {
  node('parent'){
    def ret = sh(
      returnStatus: true, // This is the key bit!
      script: '''if [ "$foo" = bar ]; then exit 2; else exit 1; fi'''
    )
    // ret can be any number/range, does not have to be 2.
    if (ret == 2) {
      currentBuild.result = 'UNSTABLE'
    } else if (ret != 0) {
      currentBuild.result = 'FAILURE'
      // If you do not manually error the status will be set to "failed", but the
      // pipeline will still run the next stage.
      error("Stage 1 failed with exit code ${ret}")
    }
  }
}

管道语法生成器在高级选项卡中显示如下: Pipeline Syntax Example

1

鼓励提供外部资源链接,但请在链接周围添加上下文,以便其他用户了解它的内容和原因。始终引用重要链接的最相关部分,以防目标站点无法访问或永久离线。 - Bugs
看起来这个被还原了(或者从未被实现),我无法在Jenkins 2.73.2中让它工作。 - gib
在这里可以工作,只需打开执行 shell 的高级选项,并设置您想要的不稳定退出代码。 - Somatik

0

正如其他人所说,没有返回[退出]代码来表示“不稳定”,但是有许多方法可以采取。为了节省您阅读Jenkins文档和实验的麻烦,我在这里提供一种方法,这对我很有效。

它基于Jenkins提供的“CLI”。 CLI作为一个独立的JAR实现,可以从Jenkins本身下载。 在以下示例中,我们下载该JAR(如果尚未下载),并使用命令“set-build-result”和参数“unstable”调用它。

然后,您的脚本应以零状态退出,否则构建将失败。

当脚本构建步骤完成时,控制台日志将显示构建变为“不稳定”; 而不是在执行该CLI命令时立即发生。

unstable() {
  test -f jenkins-cli.jar || wget -q ${JENKINS_URL}/jnlpJars/jenkins-cli.jar
  java -jar jenkins-cli.jar set-build-result unstable
}

do-something-that-might-go-badly || unstable
exit 0

3
谢谢您提供这段代码片段,它可能会立即提供一些帮助。一个适当的解释将极大地提高其教育价值,因为它能够展示为什么这是解决问题的好方法,并且使其对未来具有类似但不完全相同问题的读者更加有用。请编辑您的答案以添加解释,并指出哪些限制和假设适用。 - Toby Speight

0

在管道中的简单方法:

try {
    sh "<Whatever your command mayeth be>"
} catch (Exception e) {
    // Caught a non-zero exit code
    // Mark build as unstable.
    currentBuild.result='UNSTABLE'
}

0
Any Build Step Plugin
Fail The Build Plugin

first build step: Execute command
  Command: echo build_step
second build step: conditional step
  Run: Not
    !:Execute command
      Command: echo test_step
  Builder: Set the build result
    Result: Unstable

change "echo test_step" to "echo_test_step" to see how it works

if BUILD fails the result is FAILED, and TEST is not runned
if BUILD succedes, TEST runs, and if fails the result is UNSTABLE
if BUILD succedes, and TEST succedes, the result is SUCCESS

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