如何让调用Java程序的Shell脚本失败时触发Jenkins构建失败?
问题原因与解决方案
你的问题核心出在脚本最后一行的exit 0——不管前面的Java程序执行成功还是失败,这行命令都会强制让shell脚本返回状态码0(代表成功),而Jenkins正是通过脚本的最终退出码来判断构建状态的,所以哪怕Java程序抛出异常并退出,Jenkins依然会认为构建成功。
另外补充一点:虽然你设置了set -e(命令失败立即退出),但Java程序调用System.exit(-1)时,在shell环境中这个退出码会被转换为255(shell的退出码范围是0-255),属于非0的失败状态,理论上set -e应该让脚本在Java程序失败后立即退出,但因为你最后写了exit 0,脚本还是会执行到这一行,覆盖之前的失败状态。
修复方案
方案一:直接移除exit 0
修改后的myscript.sh:
#!/bin/bash # exit immediately if any command fails set -e java MyJavaProgram
这样脚本会以最后一条命令(Java程序)的退出码作为自身的退出码。当Java程序失败时,脚本返回非0状态,Jenkins就会自动标记构建失败。
方案二:显式传递Java程序的退出码(如需后续操作)
如果需要在Java程序执行完成后做一些清理或其他操作,可以先捕获Java程序的退出码,最后再返回这个码:
#!/bin/bash set -e java MyJavaProgram # 捕获Java程序的退出码 EXIT_STATUS=$? # 这里可以添加成功后的清理、日志记录等操作 # 注意:如果后续操作可能失败,需要确保不会覆盖EXIT_STATUS exit $EXIT_STATUS
内容的提问来源于stack exchange,提问作者ptha
相关产品推荐
相关产品推荐

