Answers:
要在命令失败时停止进一步执行:
command || exit 0
要在命令失败时继续执行:
command || true
|| exit 0
在第一种情况下,您不需要,如果command
返回false,则执行将停止。也就是说,第二种选择非常有帮助!
exit 0
因为任何非零的退出代码都会使构建失败。
Jenkins /bin/sh -xe
默认使用Shell执行步骤。-x
表示打印每个执行的命令。-e
表示如果脚本中的任何命令失败,则退出失败。
因此,我认为您遇到的情况是您的git命令以1退出,由于默认-e
参数,shell选取了非0的退出代码,忽略了脚本的其余部分并将该步骤标记为失败。如果您可以在此处发布构建步骤脚本,我们可以确认。
如果是这种情况,您可以尝试放置,#!/bin/sh
以便脚本可以不带选项地执行;或set +e
在构建步骤顶部执行或类似操作以覆盖此行为。
编辑:需要注意的另一件事是,如果shell脚本中的最后一个命令返回非0代码,则即使使用此设置,整个构建步骤仍将标记为失败。在这种情况下,您只需echo
在末尾放置一个命令即可避免这种情况。
如果没有要推送的内容,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。它可以通过控制台输出,匹配模式(您的回声)并将构建标记为不稳定。
Jenkins通过步骤的返回值确定步骤的成功/失败。对于shell,应该是最后一个值的返回。对于Windows CMD和(POSIX)Bash Shell,您都应该能够通过使用exit 0
last命令来手动设置返回值。
exit 0
在Windows Jenkins安装的多个版本中与“ execute windows batch command”一起使用,它可以按预期工作。还必须进行其他操作。您可以发布控制台日志的相关部分吗?
#!/bin/sh -xv
如果遇到任何错误,将使用该shell 停止脚本。
我能够使用此处找到的答案使此工作正常进行:
git diff --quiet --exit-code --cached || git commit -m 'bla'
git diff
命令,如果失败,则执行git commit
命令。基本上,只有git diff
找到了要提交的内容,它才执行提交。但是@jwernerny回答是正确的,您应该可以将其添加exit 0
为最后一条语句到让Jenkins视为成功的任何脚本。我可以想到一个方案,如果您执行Linux Shell步骤,该方案将失败,但在批处理中应始终有效
/bin/sh -xe
默认使用此处提到的(中间)执行Shell构建步骤。因此,您可以尝试在构建步骤的顶部放置一个#!/bin/bash
或执行一个set +e
操作来覆盖此行为,即使在退出时使用非0代码退出一个命令,也将继续执行该步骤的其余部分
https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#sh-shell-script
如果包含returnStatus:true属性,则将忽略shell返回。
另一个包含一些提示的答案可能对某人有帮助:
请记住使用以下规则分隔命令:
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
in && gmake test && set -e && echo 0
将被该println run_tests
语句跳过,因为失败gmake test
将中止jenkins构建。解决方法是,您可以切换到returnStatus:true
,但是随后您将错过命令的输出。