如果执行shell失败,jenkins不会失败
作为我的构build过程的一部分,我正在运行一个git commit作为执行shell步骤。 但是,如果在工作区中没有任何更改,Jenkins将无法构build,因为git因为没有提交更改而返回错误代码。 我想要中止构build,或者只是把它标记为不稳定的,如果是这样的话。 有任何想法吗?
命令失败时停止进一步执行:
command || exit 0
命令失败时继续执行:
command || true
Jenkins默认使用/bin/sh -xe
执行shell构build步骤。 -x
表示打印执行的每个命令。 -e
表示如果脚本中的任何命令失败,则退出失败。
所以我想你的情况发生了什么事是你的git命令退出1,并且由于默认-e
param,shell拿起非0退出代码,忽略脚本的其余部分,并标记为失败的步骤。 如果您可以在这里发布您的构build步骤脚本,我们可以确认。
如果是这样的话,你可以尝试使用#!/bin/sh
这样脚本就会被执行而没有选项; 或者在构build步骤之上执行set +e
或任何类似的操作来覆盖此行为。
编辑:另外需要注意的是,如果shell脚本中的最后一个命令 返回非0代码 ,则即使使用此设置,整个构build步骤仍将标记为失败。 在这种情况下,您可以简单地在末尾加上一个echo
命令来避免这种情况。
另一个相关的问题
如果没有任何推git返回退出状态1.执行shell构build步骤被分别标记为失败。 你可以使用OR语句|| (双pipe)。
git commit -m 'some messasge' || echo 'Commit failed. There is probably nothing to commit.'
这意味着,如果第一个失败(返回退出状态> 0),执行第二个参数。 第二个命令总是返回0.当没有任何东西要推(退出状态1 – >执行第二个命令)时,echo将返回0,并继续构build步骤。
要将构build标记为不稳定,可以使用构build后步骤Jenkins Text Finder。 它可以通过控制台输出,匹配模式(你的回声)和标记build立不稳定。
Jenkins通过该步骤的返回值来确定步骤的成功/失败。 对于shell的情况,应该是最后一个值的返回。 对于Windows CMD和(POSIX)Bash shell,您应该能够使用exit 0
作为最后一个命令手动设置返回值。
我能够使用这里find的答案得到这个工作:
如何git没有提供任何错误?
git diff --quiet --exit-code --cached || git commit -m 'bla'
在标题中的(更一般的)问题 – 为了防止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
。
您可以使用文本查找程序插件 。 它将允许您检查输出控制台的expression式,然后将构build标记为Unstable
。
还有另一种顺利的方式告诉jenkins不要失败。 您可以在构build步骤中隔离您的提交,并将shell设置为不失败:
set +e git commit -m "Bla." set -e
下面的作品只是在有变化的情况下才提交。 所以如果提交失败,构build只会失败。
hg id | grep "+" || exit 0 hg commit -m "scheduled commit"
如果你把这个命令放到shell中:
false true
你的构build将被标记为失败(至less1个非零退出代码),所以你可以添加(set + e)来忽略它:
set +e false true
不会失败。 然而,即使在(set + e)的情况下,这也会失败:
set +e false
因为最后一个shell命令必须以0结束。