You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 17:57:28