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

如何让AWS CodeBuild无论构建成败都执行artifacts阶段?

解决AWS CodeBuild无论构建成败都上传测试制品的问题

要让CodeBuild不管测试是否失败都执行artifacts阶段,核心是避免测试命令的失败直接终止整个构建流程,先完成测试报告生成,再在流程末尾统一标记构建状态。具体修改如下:

修改buildspec.yml的关键步骤

1. 捕获测试命令的退出码,不中断流程

在pre_build阶段执行测试时,不要让测试失败直接终止构建,而是捕获每个测试的退出码,继续执行后续步骤:

pre_build:
  commands:
    - cd myproj
    # 执行cfn-lint并捕获退出码,失败后不中断流程
    - cfn-lint --template cloudformation/template.cfn.yaml --format junit > cfn-lint.xml
    - CFN_LINT_EXIT=$?
    # 执行checkov并捕获退出码,失败后不中断流程
    - checkov --directory cloudformation --framework cloudformation secrets --output=junitxml > checkov.xml
    - CHECKOV_EXIT=$?

2. 在post_build阶段统一判定构建状态

在post_build阶段末尾,根据之前捕获的测试退出码决定是否标记构建失败。这样既保证测试报告能生成并上传为制品,又能正确反映构建结果:

post_build:
  commands:
    - ... # 保留你原有的post_build命令
    # 检查测试结果,若任意测试失败则标记构建失败
    - if [ $CFN_LINT_EXIT -ne 0 ] || [ $CHECKOV_EXIT -ne 0 ]; then exit 1; fi

3. 保留原有的artifacts配置

你的artifacts配置无需修改,只要流程能执行到这一步,不管最终构建成功还是失败,CodeBuild都会上传指定的测试报告文件:

artifacts:
  base-directory: myproj
  files:
    - cfn-lint.xml
    - checkov.xml

关于reports阶段的补充说明

如果你想用reports阶段替代或配合artifacts,同样需要按上述步骤处理测试命令的退出码。reports阶段会在流程完成后收集测试报告,即使最终构建失败,配置示例如下:

reports:
  cfn-lint-results:
    files:
      - cfn-lint.xml
    base-directory: myproj
    file-format: JUNITXML
  checkov-results:
    files:
      - checkov.xml
    base-directory: myproj
    file-format: JUNITXML

内容的提问来源于stack exchange,提问作者David Gard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 00:25:19