如何让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
相关产品推荐
相关产品推荐

