作为构建过程的一部分,我正在运行git commit作为执行shell步骤。但是,如果工作区中没有更改,Jenkins将无法进行构建。这是因为当没有提交更改时,git返回错误代码。我想要中止构建,或者只是在这种情况下将其标记为不稳定。有什么想法吗?
答案 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
命令以避免这种情况。
答案 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)
答案 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 0
和gmake 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
,但是会丢失命令的输出。