GitLab中如何在任一子流水线执行后运行promote-test-reports阶段
GitLab CI:实现promote-test-reports阶段在任一子流水线成功后执行
问题背景
当前CI阶段配置:
stages: - test - child_pipeline1 - child_pipeline2 - promote-test-reports
test阶段后仅会执行child_pipeline1或child_pipeline2中的一个,需要promote-test-reports阶段在任一子流水线成功后运行。但引入的模板中promote-test-reports阶段的test job包含script逻辑,无法与trigger/strategy:depend混用(会触发jobs:test config contains unknown keys: trigger错误),且无法修改模板的script逻辑。
可行替代方案
方案1:通过needs关联子流水线触发job(推荐)
- 先确保主流水线中用于触发子流水线的job配置正确,添加
strategy:depend等待子流水线完成:
# 主配置文件中定义子流水线触发job trigger-child1: stage: child_pipeline1 trigger: include: adapter/child_pipeline1.yml strategy: depend rules: # 替换为实际触发child_pipeline1的条件 - if: $RUN_CHILD_PIPELINE_1 == "true" trigger-child2: stage: child_pipeline2 trigger: include: adapter/child_pipeline2.yml strategy: depend rules: # 替换为实际触发child_pipeline2的条件 - if: $RUN_CHILD_PIPELINE_2 == "true"
- 覆盖模板中的
testjob,通过needs依赖两个子流水线触发job(设置optional: true允许其中一个不存在),并通过规则控制仅当任一子流水线成功后运行:
# 主配置文件中覆盖模板的test job test: stage: promote-test-reports needs: - job: trigger-child1 optional: true - job: trigger-child2 optional: true rules: - if: $CI_PIPELINE_SOURCE == 'web' # 仅当依赖的子流水线触发job至少一个成功时运行 when: on_success variables: GITLAB_PRIVATE_TOKEN: $GITLAB_TOKEN
注:模板中的script、image等配置会被自动继承,无需重复定义。
方案2:子流水线标记成功状态,主流水线通过变量触发
- 在两个子流水线的配置末尾添加一个job,当子流水线成功时,向主流水线设置一个标记变量:
# 子流水线配置文件(child_pipeline1.yml/child_pipeline2.yml)末尾添加 mark-child-success: stage: .post script: - | curl --request POST \ --header "PRIVATE-TOKEN: $GITLAB_PRIVATE_TOKEN" \ "$CI_API_V4_URL/projects/$CI_PROJECT_ID/pipelines/$CI_PARENT_PIPELINE_ID/variables" \ --form "key=CHILD_PIPELINE_SUCCESS" \ --form "value=1" \ --form "protected=false" when: on_success only: - pipelines
- 主配置文件中覆盖模板的
testjob,通过规则判断标记变量是否存在来触发:
# 主配置文件中覆盖模板的test job test: stage: promote-test-reports rules: - if: $CI_PIPELINE_SOURCE == 'web' && $CHILD_PIPELINE_SUCCESS == "1" when: on_success variables: GITLAB_PRIVATE_TOKEN: $GITLAB_TOKEN
内容的提问来源于stack exchange,提问作者vinod827
相关产品推荐
相关产品推荐

