作为构建过程的一部分,我正在运行git commit作为执行shell步骤.但是,如果工作区中没有更改,Jenkins将无法进行构建.这是因为当没有提交更改时,git返回错误代码.我想要中止构建,或者只是在这种情况下将其标记为不稳定.有任何想法吗?
Quo*_*ons 186
在命令失败时停止进一步执行:
command || exit 0
要在命令失败时继续执行:
command || true
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)
Jenkins通过步骤的返回值确定步骤的成功/失败.对于shell的情况,它应该是最后一个值的返回值.对于Windows CMD和(POSIX)Bash shell,您应该能够使用exit 0最后一个命令手动设置返回值.
我能够使用这里找到的答案来解决这个问题:
git diff --quiet --exit-code --cached || git commit -m 'bla'
Run Code Online (Sandbox Code Playgroud)
在标题中的(更一般的)问题 - 为了防止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.
这个答案是正确的,但它没有指定|| 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)
也许这对其他人来说是显而易见的,但我在意识到这一点之前浪费了很多时间。
https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#sh-shell-script
如果包含returnStatus:true属性,则将忽略shell返回。