GitLab CI配置.NET6测试覆盖率时bc命令不存在如何解决
GitLab CI .NET 覆盖率计算bc命令不存在的解决方案
该报错的核心原因是当前CI运行环境(微软官方.NET SDK镜像默认基于精简版Debian)未预装bc浮点计算工具,可选择以下两种方案修复:
方案1:直接安装bc依赖,无需修改原有计算逻辑
在test作业的脚本步骤最前面加入bc的安装命令即可,官方.NET镜像基于Debian系,用apt安装就行,修改后的CI脚本片段:
test: only: - master - /^feature/.*$/ stage: test dependencies: - build-application variables: CONFIGURATION: "Debug" COVERAGE_FLAG: "XPlat Code Coverage" LOGGER_FLAG: "junit;LogFilePath=$CI_PROJECT_DIR/junit/junit-test-result.xml;MethodFormat=Class;FailureBodyFormat=Verbose" TEST_PROJECTS: "./tests/*Tests/*.csproj" script: # 新增下面这行安装bc依赖 - apt-get update && apt-get install -y --no-install-recommends bc - 'dotnet test $TEST_PROJECTS -c $CONFIGURATION -r $CI_PROJECT_DIR/cobertura --collect:"$COVERAGE_FLAG" --test-adapter-path:. --logger:"$LOGGER_FLAG"' - chmod +x ./scripts/print-dotnet-coverage.sh - ./scripts/print-dotnet-coverage.sh $CI_PROJECT_DIR/cobertura # 后续coverage、artifacts配置保持原有内容不变即可
这个方案改动最小,原有shell脚本不需要做任何调整,安装完依赖就能正常执行计算。
方案2:不依赖额外安装包,用系统自带awk完成计算
所有Linux类CI环境默认都会预装awk,不需要额外装任何包,直接替换shell脚本里的bc计算逻辑即可,修改后的完整shell脚本如下:
#!/usr/bin/env sh REPORTS_DIR="${1}" coverage=0 count=0 for i in $(find "$REPORTS_DIR" -name '*.xml'); do printf "Found coverage report: %s\n" "$i" coverage="$(xmllint --xpath 'string(/coverage/@line-rate)' ${i})" count=$((count + 1)) done; printf "Found a total of %i report(s)\n" "$count" # 替换原有的bc计算行,用awk完成乘100+四位小数格式化 coverage=$(awk -v line_rate="$coverage" 'BEGIN{printf "%.4f", line_rate * 100}') printf "TOTAL_COVERAGE=%s\n" "$coverage"
注意:当前脚本如果存在多个测试项目生成多份cobertura报告的场景,最终只会取最后遍历到的单份报告覆盖率,不会做多报告聚合计算,如果需要统计全项目总覆盖率,需要额外增加求和、按权重计算平均的逻辑,和当前bc报错问题无关。
内容的提问来源于stack exchange,提问作者Quyết
相关产品推荐
相关产品推荐

