Gitlab CI测试用例失败阶段仍通过,如何配置100%通过率才成功
问题原因确认
你描述的现象确实有两种常见触发原因:
- 测试执行脚本未正确透传测试失败的退出码:如果
stage-unittests.sh在Google Test用例失败后最终返回的退出码为0,GitLab默认会判定阶段执行成功 - 项目配置了自定义测试通过率阈值:如果管理员在项目CI/CD设置中配置了低于100%的通过率要求(比如90%),只要失败用例占比未超过阈值,系统就会判定测试阶段成功
解决方案
1. 修复测试脚本的退出码透传逻辑
修改scripts/gitlab-ci/stage-unittests.sh,确保Google Test、pytest执行失败时,整个脚本返回非0退出码,参考逻辑如下:
# 执行Google Test ./path/to/your/gtest_executable GTEST_EXIT=$? # 执行pytest并生成junit报告 pytest ./test/ --junitxml=test_unit_test_report.xml PYTEST_EXIT=$? # 任意测试失败则脚本最终返回非0 if [ ${GTEST_EXIT} -ne 0 ] || [ ${PYTEST_EXIT} -ne 0 ]; then echo "存在测试用例执行失败" exit 1 fi
2. 配置CI Job强制测试用例全过才成功
如果你使用的是GitLab 15.3及以上版本,直接修改.gitlab-ci.yml的测试阶段配置,给JUnit报告增加fail_on_failure: true参数即可,修改后的配置如下:
test_unit_test: stage: test needs: ["build", "build_unit_test"] image: $DOCKER_IMAGE rules: - if: '$CI_PIPELINE_SOURCE != "merge_request_event"' - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' script: | ZIPNAME=`cat _VERSION_.txt` ./scripts/gitlab-ci/stage-unittests.sh test_unit_test_report.xml $ZIPNAME artifacts: reports: junit: paths: - test_unit_test_report.xml fail_on_failure: true # 只要报告存在失败用例,直接标记Job失败 expire_in: 1 week
3. 低版本GitLab兼容方案
如果你的GitLab版本低于15.3不支持fail_on_failure参数,可以在测试脚本末尾增加JUnit报告解析逻辑,主动判断失败用例数:
# 安装依赖(也可以提前打包到CI镜像里) apt update && apt install -y xmlstarlet # 统计失败用例数 FAILED_CASES=$(xmlstarlet sel -t -v "count(//testcase[failure])" test_unit_test_report.xml) if [ ${FAILED_CASES} -gt 0 ]; then echo "检测到${FAILED_CASES}个失败用例,流水线终止" exit 1 fi
4. 检查项目级通过率配置
进入项目「设置」→「CI/CD」→「通用管道」页面,找到测试通过率阈值配置项,将阈值设置为100%,关闭允许部分测试失败的相关开关。
内容的提问来源于stack exchange,提问作者pamplemousse_mk2
相关产品推荐
相关产品推荐

