Lor*_*ein 1 bash hudson bazaar
我有一份 Hudson 工作,定期合并来自上游集市存储库的更改。
目前,当上游没有更改时,Hudson 会报告此作业失败,因为 bzr commit 命令返回错误。我的脚本看起来像这样:
bzr branch lp:~lorinh/project/my-local-branch
cd my-local-branch
REV_UPSTREAM=`bzr version-info lp:project --custom --template="{revno}"`
bzr merge lp:project
bzr commit -m "merged upstream version ${REV_UPSTREAM}"
./run_tests.sh
bzr push lp:~lorinh/project/my-local-branch
Run Code Online (Sandbox Code Playgroud)
如果没有要合并的更改,Hudson 控制台输出如下所示:
+ bzr branch lp:~lorinh/project/my-local-branch
Branched 807 revision(s).
+ bzr merge lp:project
Nothing to do.
+ bzr commit -m merged upstream version 733
Committing to: /var/lib/hudson/jobs/merge-upstream/workspace/myproject/
aborting commit write group: PointlessCommit(No changes to commit)
bzr: ERROR: No changes to commit. Use --unchanged to commit anyhow.
Sending e-mails to: me@example.com
Finished: FAILURE
Run Code Online (Sandbox Code Playgroud)
问题是我不希望 Hudson 将此报告为失败。如何修改我的命令,以便脚本在提交失败时终止,但 Hudson 不会将其解释为错误?我尝试将提交命令更改为:
bzr commit -m "merged upstream version ${REV_UPSTREAM}" || exit
Run Code Online (Sandbox Code Playgroud)
但这没有用。
(注意:我意识到我可以使用 Hudson 的“轮询 SCM”而不是“定期构建”。但是,对于 bazaar,如果有人对最近修改之前完成的本地提交进行推送,那么 Hudson 将不会检测到更改到存储库。)
你们非常接近!这是您尝试的更正版本:
bzr commit -m "merged upstream version ${REV_UPSTREAM}" || exit 0
Run Code Online (Sandbox Code Playgroud)
现在这可以满足您的要求,但并不完美。我稍后再讲。
请注意您的版本中的微小重要变化 - 我们现在明确表示,如果 bzr 命令不这样做,我们应该以代码 0 (成功)退出。在您的版本中, exit (不带参数)将终止您的脚本,但返回最后执行的命令的退出代码 - 在本例中为 bzr 提交。
有关退出的更多信息
我们如何了解这种退出行为?该exit
命令是一个内置的 shell - 要查找有关它的文档,我们使用 help 命令:
help exit
Run Code Online (Sandbox Code Playgroud)
我的机器上的哪个告诉我:
exit: exit [n]
Exit the shell.
Exits the shell with a status of N. If N is omitted, the exit status
is that of the last command executed.
Run Code Online (Sandbox Code Playgroud)
这是关于bash shell 中的退出和退出代码的不错的教程
Hudson 和退出代码
Hudson 遵循这一通用约定,将退出代码 0 解释为成功,将任何其他代码解释为失败。如果它执行的构建脚本以非零代码退出,它将把您的构建标记为失败。
为什么你的脚本在 bzr 提交后停止
如果,正如你所说,你有以下内容,并且你的脚本在 bzr 提交后停止......
bzr commit -m "merged upstream version ${REV_UPSTREAM}"
./run_tests.sh
Run Code Online (Sandbox Code Playgroud)
...我怀疑你的脚本有诸如这样的指令,set -e
或者正在被类似的东西调用bash -e build_script.sh
如果命令以非零状态退出,则这些命令都会告诉 shell 立即退出,并传递相同的“失败”退出代码。(有一些微妙之处 - 见脚注 1)。
禁用错误退出
虽然这种错误退出行为非常有用,但有时我们想暂时禁用它。你找到了一种方法,在
bzr commit whatever || true
Run Code Online (Sandbox Code Playgroud)
我们还可以使用 set +e 禁用错误检查。
这是您可能会觉得有用的模式。在其中我们将:
set +e
)bzr commit whatever
set -e
)让我们来实现它。如果 bzr 命令失败,我们将再次退出 0(成功)。
set +e
bzr commit whatever
commit_status=$?
set -e
if [[ "$commit_status" != "0" ]]; then
echo "bzr commit finds nothing to do. Build will stop, with success"
exit 0
fi
echo "On we go with the rest of the build script..."
Run Code Online (Sandbox Code Playgroud)
请注意,我们使用 set +e / set -e 尽可能少地括起来。如果我们在该部分的脚本中有拼写错误,他们不会停止脚本并且会出现混乱。请阅读“不充分了解 POSIX shell 功能”一文中的“避免 set -e”部分以获取更多想法。
有什么问题吗foo || exit 0
?
正如我之前提到的,我们提出的第一个解决方案存在问题。我们已经说过,当bzr commit
为非零时(即它没有正常提交),我们将始终停止并指示success。bzr commit
即使由于其他原因(以及其他非零退出代码)而失败,也会发生这种情况:也许您在命令调用中犯了拼写错误,或者 bzr 无法连接到存储库。
至少在其中一些情况下,您可能希望将构建标记为失败,以便您可以采取一些措施。
寻求更好的解决方案
我们想要具体说明我们期望 bzr 提供哪些非零退出代码,以及我们将如何处理每个代码。
如果您回顾上面的 set +e / set -e 模式,应该不难将上面的条件逻辑 (if) 扩展为可以处理 bzr 中的许多特定退出代码的东西,并带有一个 catch -all 用于意外的退出代码(我建议)使构建失败并报告有问题的代码和命令。
要查找任何命令的退出代码,请阅读文档或运行该命令,然后echo $?
作为下一个命令运行。$?保存前一个命令的退出代码。
脚注 1:使用 set -e 切换的错误退出行为有一些您需要阅读的微妙之处,涉及命令在管道、条件语句和其他结构中时的行为。
归档时间: |
|
查看次数: |
1332 次 |
最近记录: |