如果执行shell失败,请不要失败jenkins build

Ben*_*Ben 110 jenkins

作为构建过程的一部分,我正在运行git commit作为执行shell步骤.但是,如果工作区中没有更改,Jenkins将无法进行构建.这是因为当没有提交更改时,git返回错误代码.我想要中止构建,或者只是在这种情况下将其标记为不稳定.有任何想法吗?

Quo*_*ons 186

命令失败时停止进一步执行:

command || exit 0

要在命令失败时继续执行:

command || true

  • @alfasin你不明白这个问题.OP不希望Jenkins构建失败; 因为任何非零的退出代码都会使构建失败,所以我们必须"退出0". (17认同)
  • 你不需要`|| 在第一种情况下退出0`,如果`command`返回false,则执行将停止.也就是说,第二种选择非常有用! (11认同)
  • 我明白了,在这种情况下,我会将措辞从:“命令失败时停止进一步执行:”更改为:“命令失败时停止进一步执行并将 Jenkins 作业标记为成功:”。 (2认同)
  • @alfasin 虽然我同意 Quolonel Questions 尖刻的评论是不专业的,但他说的是对的。“exit 0”不会将作业标记为成功。它只会标记当前构建步骤成功。该作业仍可能在接下来的构建步骤之一中失败。 (2认同)

Xia*_*ang 73

Jenkins /bin/sh -xe默认使用shell构建步骤.-x意味着打印每个执行的命令.-e表示如果脚本中的任何命令失败,则退出失败.

所以我认为在你的情况下发生的是你的git命令退出1,并且由于默认的-e参数,shell会选择非0退出代码,忽略脚本的其余部分并将该步骤标记为失败.如果您可以在此处发布构建步骤脚本,我们可以确认这一点.

如果是这种情况,您可以尝试放置#!/bin/sh脚本将在没有选项的情况下执行; 或者set +e在构建步骤之上执行或类似操作以覆盖此行为.


编辑:另外需要注意的是,如果shell脚本中的最后一个命令返回非0代码,即使使用此设置,整个构建步骤仍将标记为失败.在这种情况下,您可以简单地echo在最后放置一个命令以避免这种情况.

另一个相关问题


ece*_*ena 38

如果没有什么可以推送git返回退出状态1.执行shell构建步骤分别标记为失败.您可以使用OR语句|| (双管).

git commit -m 'some messasge' || echo 'Commit failed. There is probably nothing to commit.'
Run Code Online (Sandbox Code Playgroud)

这意味着,如果第一次失败,则执行第二个参数(返回退出状态> 0).第二个命令总是返回0.当没有任何东西要推(退出状态1 - >执行第二个命令)时,echo将返回0并继续构建步骤.

要将构建标记为不稳定,可以使用构建后步骤Jenkins Text Finder.它可以通过控制台输出,匹配模式(您的回声)并将构建标记为不稳定.


joe*_*cks 20

还有另一种流畅的方式告诉詹金斯不要失败.您可以在构建步骤中隔离提交并将shell设置为不失败:

set +e
git commit -m "Bla."
set -e
Run Code Online (Sandbox Code Playgroud)

  • 确保在要运行的命令之后添加`set -e`,而不考虑退出代码.否则,您可能最终会执行您不想执行的命令.我想自己处理错误,所以我做了类似的事情:`set + e commit -m"bla"EXIT_CODE ="$ {?}"set -e#handle exit code logic` (2认同)

jwe*_*rny 8

Jenkins通过步骤的返回值确定步骤的成功/失败.对于shell的情况,它应该是最后一个值的返回值.对于Windows CMD和(POSIX)Bash shell,您应该能够使用exit 0最后一个命令手动设置返回值.


Ben*_*Ben 8

我能够使用这里找到的答案来解决这个问题:

如何在没有错误的情况下git提交任何内容?

git diff --quiet --exit-code --cached || git commit -m 'bla'
Run Code Online (Sandbox Code Playgroud)


Nux*_*Nux 8

在标题中的(更一般的)问题 - 为了防止Jenkins失败,你可以阻止它看到退出代码1. ping的示例:

bash -c "ping 1.2.3.9999 -c 1; exit 0"
Run Code Online (Sandbox Code Playgroud)

现在你可以得到ping的输出:

output=`bash -c "ping 1.2.3.9999 -c 1; exit 0"`
Run Code Online (Sandbox Code Playgroud)

当然,而不是ping ...你可以使用任何命令 - 包括git commit.


Dav*_*edy 7

这个答案是正确的,但它没有指定|| exit 0or|| true进入shell command。这是一个更完整的示例:

sh "adb uninstall com.example.app || true"
Run Code Online (Sandbox Code Playgroud)

以上将工作,但以下将失败:

sh "adb uninstall com.example.app" || true
Run Code Online (Sandbox Code Playgroud)

也许这对其他人来说是显而易见的,但我在意识到这一点之前浪费了很多时间。


jph*_*ynh 6

您可以使用Text-finder插件.它将允许您检查输出控制台中是否有您选择的表达式,然后将构建标记为Unstable.


Meg*_*gha 6

对于多个 shell 命令,我通过添加以下内容来忽略失败:

set +e commands true

在此输入图像描述


jax*_*xed 5

https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#sh-shell-script

如果包含returnStatus:true属性,则将忽略shell返回。