如何在测试覆盖率低于阈值时使AWS CodeBuild构建失败
测试覆盖率不达标时自动判定CodeBuild/CodePipeline失败的方案
你提到的aws codebuild stop-build --id ${CODEBUILD_BUILD_ID}不是最优实现,甚至完全没必要用。
核心逻辑说明
CodeBuild原生的判定规则非常简单:buildspec里任意一条命令返回非0退出码,整个构建就会直接标记为失败,关联的CodePipeline也会同步中断执行,根本不需要主动调用API终止构建。
为什么不推荐用stop-build命令
- 需要额外给CodeBuild执行角色配置
codebuild:StopBuild权限,增加不必要的权限配置成本 - 被stop命令终止的构建状态会标记为
Stopped,和校验不通过的Failed状态在后续告警、构建统计、问题排查时很容易混淆,没法快速定位是覆盖率不达标还是人为/系统异常终止了构建 - 实现逻辑冗余,完全可以用更简单的方式达到同样效果
Angular(Karma+Jasmine)项目的最佳实现
Karma自带的istanbul覆盖率插件原生支持阈值校验,不需要自己写脚本解析测试输出,配置一次就行:
- 打开项目根目录的
karma.conf.js文件,找到coverageIstanbulReporter配置段,添加阈值规则:
coverageIstanbulReporter: { dir: require('path').join(__dirname, './coverage'), reports: ['html', 'lcovonly', 'text-summary'], fixWebpackSourcePaths: true, // 新增以下阈值配置 thresholds: { global: { statements: 80, lines: 80, branches: 80, functions: 80 }, // 若不需要限制单个文件的覆盖率,可以删掉each这整段配置 each: { statements: 70, lines: 70, branches: 70, functions: 70 } } }
- 调整你的buildspec.yml,删掉多余的stop-build命令,build阶段直接执行测试命令即可:
version: 0.2 phases: install: commands: - npm install -g @angular/cli - npm i -D puppeteer - npm i -D @angular-devkit/build-angular - apt-get update # 合并依赖安装,减少apt执行次数 - apt-get install -y apt-transport-https libxcursor1 libgtk-3-dev libxss1 libasound2 libnspr4 libnss3 libx11-xcb1 - npm install build: commands: # 执行单测+覆盖率校验,不满足阈值时ng test会自动返回非0退出码,直接触发构建失败 - ng test --browsers=ChromeHeadlessNoSandbox --watch=false --code-coverage # 只有覆盖率达标,才会执行后续的构建打包逻辑 - ng build --prod - printenv artifacts: files: imagedefinitions.json
配置完成后,只要测试覆盖率低于你设定的80%阈值,ng test命令执行失败,CodeBuild会直接判定构建失败,CodePipeline也不会继续执行后续的部署等阶段。
自定义校验逻辑的实现方式
如果你不想用Karma自带的阈值校验,想自己解析覆盖率结果做判断,也只需要在不满足条件时执行exit 1即可,不需要调用AWS API,示例:
# 先安装解析工具(如果需要自己写脚本的话) - apt-get install -y jq bc # 读取覆盖率结果 - LINE_COVERAGE=$(cat coverage/coverage-summary.json | jq -r '.total.lines.pct') - | if (( $(echo "$LINE_COVERAGE < 80" | bc -l) )); then echo "错误:行覆盖率为${LINE_COVERAGE}%,低于要求的80%阈值" exit 1 fi
注意事项
- 不要把覆盖率校验逻辑写在buildspec的finally阶段,finally块的命令无论之前执行成功失败都会运行,会覆盖原有的退出码,导致状态判定错误
- 用Karma自带阈值校验时,失败日志会明确打印哪一项覆盖率不达标、差多少,比自己写脚本解析的日志更清晰,排查问题效率更高
- 如果你之前给CodeBuild角色加过StopBuild的权限,用新方案之后可以删掉该权限,遵循最小权限原则
内容的提问来源于stack exchange,提问作者Van Wilder
相关产品推荐
相关产品推荐

