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

pam*_*mk2 3 testing unit-testing gitlab gitlab-ci

我们有一个在 Gitlab 中管理的项目,带有用于构建和测试(pytest、Google 测试)的 CI 管道。我们在 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
Run Code Online (Sandbox Code Playgroud)

感谢您的任何帮助。问候。

Ada*_*all 5

Gitlab CI/CD 作业不关心脚本区域正在做什么(因此它们不会查看例如测试通过百分比)。他们唯一用来确定作业是否通过或失败的是退出代码allow_failure关键字。

before_script执行、script和部分中的每个命令后after_script,Gitlab Runner 检查命令的退出代码以查看它是否为0。如果非零,则该命令被视为失败,如果作业allow_failure未设置该关键字true,则作业失败。

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

ZIPNAME=$(cat _VERSION_.txt)
./scripts/gitlab-ci/stage-unittests.sh test_unit_test_report.xml $ZIPNAME
Run Code Online (Sandbox Code Playgroud)

注意:我用此处$(command)解释的语法替换了反引号“`” ,该语法执行相同的操作(执行此命令),但比“命令”具有一些优势,包括嵌套和更容易在 markdown 中使用,其中“”表示代码格式。

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