我正在执行Shell Jenkins配置中运行大量git操作。我确实看到了正在生成的错误,但是Jenkins的工作仍然显示为成功。我如何捕获以下错误,以使Jenkins作业的状态失败:
错误:无法将某些引用推送到'ssh:// git @ git
编辑jenkins shell git push后,如下所示:
git push“ $ target” --all | grep -z“错误:” &&退出1
即使发生错误,Jenkins作业仍被标记为成功
char buf[1000];
(struct packet*)(buf + N);
EDIT#2所有更改都存在于jenkins的Execute shell(#!/ bin / bash)配置部分中。
脚本:
const deepCopy = origin => {
let cp;
switch (typeof origin) {
case 'object':
if (origin === null) {
cp = null;
} else {
switch (toString.call(origin)) {
case '[object Array]':
cp = origin.map(deepCopy);
break;
case '[object Date]':
cp = new Date(origin);
break;
case '[object ReqExp]':
cp = new RegExp(origin);
break;
default:
cp = Object.keys(origin).reduce((prev, key) => {
prev[key] = deepCopy(origin[key]);
return prev;
}, {});
break;
}
}
break;
default:
cp = origin;
}
return cp;
}
输出:
15:24:06 ! [remote rejected] test/test/testBranch ->test/test/testBranch (pre-receive hook declined)
15:24:06 error: failed to push some refs to 'ssh://git@git.testing-repo/test/test-test.git'
15:24:06 hint: Updates were rejected because the remote contains work that you do
15:24:06 hint: not have locally. This is usually caused by another repository pushing
15:24:06 hint: to the same ref. You may want to first integrate the remote changes
15:24:06 hint: (e.g., 'git pull ...') before pushing again.
15:24:06 hint: See the 'Note about fast-forwards' in 'git push --help' for details.
15:24:06 Everything up-to-date
15:24:07 Finished: SUCCESS
编辑#3:实际上,当我在shell中调试$ RESPONSE时,它不包含任何数据,因此它可以解释为什么它不会更改jenkins作业的状态。因此,即使git命令实际上执行了预期的操作,它也没有将命令的输出馈送到$ RESPONSE
编辑#4 RESPONSE = $(git push“ $ target” --all 2>&1 | grep“ error:” || true)达到了目的。
答案 0 :(得分:2)
此问题很奇怪,因为此git push
失败,因此它应返回不同于0
的退出代码,然后退出构建。 Jenkin的Execute Shell生成步骤的最后一个命令的退出代码是确定Build步骤成功/失败的原因。 0
-成功,其他-失败。如果您可以提供更多数据,也许我可以调试一下。 git push之后返回什么退出代码? (您可以通过键入echo $?
来检查上一条命令的退出代码)您还可以添加一些示例吗?
但是请不要担心,我也为您提供了一个简单的解决方法(也许并不漂亮,但是它可以工作)。您始终可以通过自己设置错误代码来手动对Jenkins说失败的构建。在这种情况下,您可以grep
进行git push进行错误处理。如果存在,请退出并输入代码1。
git push ... | grep -z "error: failed to push some refs to" && exit 1 || true
或更通用的:
git push ... | grep -z "error:" && exit 1 || true
您究竟在哪里运行此git push
命令?在执行shell构建步骤中?您使用Jenkins Source Code Management吗? (这将使在Jenkins构建中使用存储库更加容易)
虚拟作业显示exit 1
将导致失败:
您总是可以尝试执行更多类似的bash脚本,例如:
RESPONSE=$(git push ... | grep -z "error:" || true)
if [ -n "$RESPONSE" ]; then
exit 1
fi
此外,我已经在解决方法命令中添加了|| true
,因为我忘记了如果没有选择任何行,grep
将会exit 1
:
如果选择任何行,则退出状态为0,否则为1
这意味着这将迫使所有构建失败。