AWS CodeBuild构建项目在serverless deploy失败时仍显示成功的问题
Fix AWS CodeBuild Success Status Even When Serverless Deploy Fails
我明白你的问题了——当serverless deploy命令执行失败时,AWS CodeBuild却依然标记构建成功,这确实会导致你无法及时发现部署问题。问题的根源出在你使用的管道操作| tee deploy.out上,下面我来详细解释并给出解决方案。
Why This Happens
在Bash中,管道命令的退出码默认是最后一个命令的退出状态。tee命令几乎总是会成功执行(只要它能写入文件/输出),所以哪怕前面的serverless deploy返回了非0的失败退出码,整个管道命令的退出码依然是0,CodeBuild就会认为这一步执行成功了。
Solution 1: Capture Exit Code Manually
你可以拆分命令,先执行serverless deploy并捕获它的退出码,再用cat输出内容,最后根据退出码决定是否让构建失败:
build: commands: - sls package - # 执行deploy并把所有输出重定向到文件 serverless deploy --stage $STAGE --region $AWS_DEFAULT_REGION > deploy.out 2>&1 - # 保存deploy命令的退出码 DEPLOY_EXIT_CODE=$? - # 打印输出内容,达到和tee一样的效果 cat deploy.out - # 如果deploy失败,退出并返回对应的错误码 if [ $DEPLOY_EXIT_CODE -ne 0 ]; then exit $DEPLOY_EXIT_CODE; fi
这样操作后,只要serverless deploy失败,整个构建阶段就会返回非0退出码,CodeBuild就会正确标记构建失败。
Solution 2: Use pipefail Shell Option
另一种更简洁的方法是启用Bash的pipefail选项,这个选项会让管道的退出码变为管道中第一个失败命令的退出码,而不是最后一个。你只需要在build阶段开头添加这个设置:
build: commands: - # 启用pipefail,确保管道的退出码反映第一个失败的命令 set -o pipefail - sls package - serverless deploy --stage $STAGE --region $AWS_DEFAULT_REGION | tee deploy.out
CodeBuild默认使用Bash作为执行shell,这个选项是完全支持的。启用后,如果serverless deploy失败,整个管道命令的退出码就是它的错误码,CodeBuild会立刻终止构建并标记为失败。
Additional Notes
- AWS CodeBuild判断构建成功与否的核心依据是每个阶段中命令的退出码,只要有一个命令返回非0,整个构建就会被标记为失败。
- 如果你还需要保留
tee的功能(同时输出到控制台和文件),第二种方案会更简洁;如果需要更精细的控制输出,第一种方案更灵活。
内容的提问来源于stack exchange,提问作者Reyansh Kharga
相关产品推荐
相关产品推荐

