当 2 个测试用例失败时,Gitab CI 管道中的测试标记为通过

Tests in Gitab CI pipeline marked as passed when 2 tests cases fail

我们有一个在 Gitlab 中管理的项目,具有 CI 用于构建和测试的管道(pytest,Google 测试)。 Google 测试中有两三个测试用例失败。但是 Gitlab 认为测试阶段是成功的。是因为成功率超过90%(任意值)?如果我们没有获得 100% 的成功,有没有办法让这个阶段(以及整个管道)失败?

这是管道摘要的屏幕截图:

阶段的yml脚本如下:

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: test_unit_test_report.xml
    expire_in: 1 week

感谢您的帮助。 问候。

Gitlab CI/CD 工作不关心什么 脚本区域在做什么(所以他们不看,例如,测试通过百分比)。唯一用于确定作业通过或失败的是 exit codes and the allow_failure 关键字。

before_scriptscriptafter_script段的每条命令执行后,Gitlab Runner检查命令的退出码是否为0.如果它非零,则认为该命令失败,如果作业的 allow_failure 关键字未设置为 true,则作业失败。

因此,对于您的工作,即使 测试 失败,脚本仍以某种方式存在,退出代码为 0,这意味着命令本身已成功完成。这种情况下的命令是:

ZIPNAME=$(cat _VERSION_.txt)
./scripts/gitlab-ci/stage-unittests.sh test_unit_test_report.xml $ZIPNAME

注意: 我用 $(command) 语法解释 here 替换了你的反引号 '`',它做同样的事情(执行这个命令)但是有与“command”相比的一些优势包括嵌套和更容易在 markdown 中使用,其中“”表示代码格式。

因此,由于您正在调用脚本 (./scripts/gitlab-ci/stage-unittests.sh) 来 运行 您的测试,该脚本本身成功完成,因此作业成功完成。看看那个脚本,看看你是否能说出为什么它成功完成,即使测试失败。