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

时间:2013-01-18 04:22:17

标签: jenkins

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

14 个答案:

答案 0 :(得分:163)

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

command || exit 0

命令失败时继续执行:

command || true

答案 1 :(得分:65)

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

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

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


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

Another related question

答案 2 :(得分:37)

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

git commit -m 'some messasge' || echo 'Commit failed. There is probably nothing to commit.'

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

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

答案 3 :(得分:13)

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

set +e
git commit -m "Bla."
set -e

答案 4 :(得分:7)

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

答案 5 :(得分:7)

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

How to git commit nothing without an error?

git diff --quiet --exit-code --cached || git commit -m 'bla'

答案 6 :(得分:6)

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

bash -c "ping 1.2.3.9999 -c 1; exit 0"

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

output=`bash -c "ping 1.2.3.9999 -c 1; exit 0"`

当然代替ping ...您可以使用任何命令 - 包括git commit

答案 7 :(得分:5)

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

答案 8 :(得分:3)

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

如果包含returnStatus:true属性,那么将忽略外壳返回。

答案 9 :(得分:3)

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

set +e commands true

enter image description here

答案 10 :(得分:3)

This answer是正确的,但是没有指定BigDecimal.valueOf((resultset.getDouble(<column name here))).setScale(2, RoundingMode.HALF_UP)); || exit 0在shell命令中出现 。这是一个更完整的示例:

|| true

以上方法有效,但以下操作将失败:

sh "adb uninstall com.example.app || true"

也许对其他人来说很明显,但是我花了很多时间才意识到这一点。

答案 11 :(得分:2)

如果将此命令放入shell块:

false
true

您的构建将被标记为失败(至少1个非零退出代码),因此您可以添加(set + e)以忽略它:

set +e
false
true

不会失败。但是,即使使用(set + e),这也会失败:

set +e
false

因为最后一个shell命令必须以0退出。

答案 12 :(得分:1)

以下适用于 mercurial ,仅在有更改时提交。因此,如果提交失败,构建只会失败。

hg id | grep "+" || exit 0
hg commit -m "scheduled commit"

答案 13 :(得分:0)

另一种提示和一些提示可能对某人有用:

记住要分开命令with the following rule

command1 && command2-表示仅在command1成功的情况下才会执行command2

command1 ; command2-表示尽管有command1的结果,该命令2仍将被执行

例如:

String run_tests = sh(script: "set +e && cd ~/development/tests/ && gmake test ;set -e;echo 0 ", returnStdout: true).trim()
println run_tests 
如果set -e失败(您的测试失败),并且以下代码被截断,则

将通过echo 0gmake test命令成功执行:

String run_tests = sh(script: "set +e && cd ~/development/tests/ && gmake test && set -e && echo 0 ", returnStdout: true).trim()
println run_tests 

有点错误,set -e语句中的echo 0&& gmake test && set -e && echo 0中的命令将被跳过,因为失败的println run_tests将中止jenkins构建。解决方法是,您可以切换到gmake test,但是会丢失命令的输出。