如果测试作业在另一个存储库中失败,则使gitlab多作业管道失败



我的应用程序repo a中有一个gitlab ci管道,它调用端到端测试repo T来运行测试。repo A管道成功触发了来自repo T的测试,但如果测试作业在T中失败,则从A调用T中测试作业的作业仍然通过。我如何让回购A跟踪回购T的测试作业的结果,并根据T中的测试作业通过/不通过其管道?

.gitlab-ci.yml用于测试Repo T:

stages:
- test
test:
stage: test
image: markhobson/maven-chrome:jdk-11
artifacts:
paths:
- target/surefire-reports
script:
- mvn test
only:
- triggers

应用程序回购A:中的.gitlab-ci.yml

job1:
stage: unit-tests ...
job2:
stage: build ...
...
trigger-e2e-repo:
stage: e2e-testing
image: markhobson/maven-chrome
script:
- "curl -X POST -F token=repo-T-token -F ref=repo-T-branch https://repo-A/api/v4/projects/repo-T-id/trigger/pipeline"
only:
- repo-A-branch

由于GitLab 11.8,您可以通过桥接作业触发管道。

在GitLab 11.8中,GitLab提供了一种新的CI/CD配置语法,使该任务更加简单,并避免了需要GitLab Runner来触发跨项目管道。

使用桥接作业,可以将触发器管道的状态镜像到调用管道。

您可以使用策略:dependent将触发管道的管道状态镜像到源网桥作业。

您的例子:

trigger-e2e-repo:
stage: e2e-testing
trigger:
project: repo-T
strategy: depend

如果带有测试作业的触发管道失败,则调用管道也会失败。

如果你只想在你的存储库中执行一个特定的作业";回购T";当由桥接作业执行时,则应使用only: pipeline(仅(或rules: -if '$CI_PIPELINE_SOURCE == "pipeline"'(规则:if(而不是only: triggers

我无法使用镜像下游作业结果的桥接作业属性,因为我的gitlab版本在11.8之前。我确实通过为回购a创建一个触发器,并用这个新的第二个触发器从回购T调用回购a,使其发挥了作用。回购A中的剩余作业将仅通过触发器和变量设置(在这种情况下为JOB(激活,如下所示:

用于回购T的.gitlab-ci.yml:

test:
stage: test
script:
- mvn test
- "curl -X POST -F token=repo-A-token -F ref=$BRANCH -F variables[JOB]=build https://project.com/api/v4/projects/project_id/trigger/pipeline"

中的.gitlab-ci.yml

job1:
...
except:
- triggers
job2:
...
except:
- triggers
...
trigger-e2e-repo:
stage: e2e-testing
script:
- "curl -X POST -F token=repo-B-token -F ref=repo-B-branch -F variables[BRANCH]=$CI_COMMIT_REF_NAME -F https://project-B/api/v4/projects/project-B-id/trigger/pipeline"
except:
- triggers
build_application_for_prod:
stage: build_prod
script:
- "curl -X POST -F token=repo-A-token -F ref=$CI_COMMIT_REF_NAME -F variables[JOB]=deploy -F variables[SEND]=true https://foo/api/v4/projects/proj_A_id/trigger/pipeline"
only:
variables:
-  $JOB == "build"
deploy_production_environment:
stage: deploy_prod
script:
- ...
only:
variables:
- $JOB == "deploy"

注意,我还必须在repo A中的端到端测试之前为作业添加except语句,这样当稍后调用repo A的API触发器时,它们就不会重新运行和循环

最新更新