合并请求触发时下游/子流水线未启动问题排查
问题说明
合并请求触发父流水线后,下游子流水线始终无法启动,调整规则和工作流配置后问题依旧,错误提示为:Pipeline cannot be created, no stages/jobs for this pipeline
当前配置
子流水线文件(childpipeline.yml)
stages: - test_stage image: name: someimage:0.0.2 entrypoint: ["sh", "-c"] test: stage: test_stage script: - pwd rules: - if: $CI_PIPELINE_SOURCE == "parent_pipeline"
父流水线文件(Parentpipeline.yml)
workflow: rules: # 注释:避免推送到已有MR时生成重复流水线 #- if: $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS #when: never - when: always stages: - stats stats: stage: stats variables: PARENT_ID : $CI_PIPELINE_ID trigger: include: project: someproject ref: main file: pathtochild rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event"
排查步骤
校验子流水线的规则条件
子流水线中test任务的规则依赖$CI_PIPELINE_SOURCE == "parent_pipeline",GitLab中通过trigger触发的子流水线,默认该变量值就是parent_pipeline,但跨项目触发时要确认变量是否正常传递。可以在子流水线临时添加任务输出该变量,比如:debug: script: - echo $CI_PIPELINE_SOURCE rules: - when: always看输出是否符合预期。
确认子流水线配置路径正确性
父流水线中trigger.include.file的pathtochild必须是子项目(someproject)根目录下的准确路径,比如文件实际在ci/childpipeline.yml,这里就不能只写childpipeline.yml,路径错误会导致加载不到配置,直接出现“无可用任务/阶段”的错误。验证父流水线的触发变量
父流水线stats任务的规则是$CI_PIPELINE_SOURCE == "merge_request_event",可以在该任务中添加脚本输出变量:stats: stage: stats variables: PARENT_ID : $CI_PIPELINE_ID script: - echo $CI_PIPELINE_SOURCE trigger: include: project: someproject ref: main file: pathtochild rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event"确认合并请求触发时,该变量确实是
merge_request_event,避免规则不满足导致父流水线的触发任务根本没执行。检查跨项目触发的权限配置
如果子流水线在另一个项目,必须确保:- 父项目的CI/CD令牌拥有子项目的读取权限;
- 子项目在「设置 > CI/CD > 流水线触发器」中允许外部项目触发流水线;
- 父流水线中指定的
ref: main是子项目存在的分支,且该分支上确实存在对应的子流水线文件。
简化规则做快速测试
暂时把子流水线的rules改成- when: always,如果能正常触发,说明原规则条件不满足;如果还是不行,说明配置加载或项目权限存在问题。核对GitLab版本兼容性
部分旧版本GitLab在跨项目传递CI_PIPELINE_SOURCE变量时存在逻辑差异,确认当前使用的GitLab版本是否支持该场景的变量传递。
内容的提问来源于stack exchange,提问作者Umair Shahid

