GitLab CI问题:dev合并到release分支无法触发流水线作业
问题分析与解决方案
问题根源
你的build-composer作业在dev合并到release/*分支时未触发,核心原因有两个:
- 合并
dev到release/*后,触发的是目标分支(release/*)的push类型流水线,但你第二条规则限定了$CI_PIPELINE_SOURCE == "merge_request_event"(仅针对MR期间的流水线),同时$CI_MERGE_REQUEST_STATE == "merged"的条件在合并后的push流水线中不生效——此时流水线源已变为push,不再属于MR事件。 - 你尝试的
== "release/**"写法无效,GitLab CI的==不支持**通配符,分支匹配必须用正则表达式配合=~。
修正后的配置
根据你的需求,分两种场景提供配置:
场景1:合并到release分支后触发作业
如果希望在dev合并到release/*分支完成后,触发release/*分支流水线中的build-composer作业,使用以下配置:
build-composer: stage: build-app image: name: $PHP_IMAGE entrypoint: [""] script: - composer install artifacts: paths: - vendor/ expire_in: 1h rules: # dev分支的push流水线触发作业 - if: '$CI_COMMIT_BRANCH == "dev" && $CI_COMMIT_TAG == null' when: always # release/*分支的push流水线触发作业(覆盖dev合并到release后的场景) - if: '$CI_COMMIT_BRANCH =~ /^release\/.*$/ && $CI_COMMIT_TAG == null' when: always # feature合并到dev的MR完成后触发(可保留,也可删除——第一条规则已覆盖dev分支的push场景) - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature\/.*$/ && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "dev" && $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_STATE == "merged"' when: always
场景2:MR打开期间就触发作业
如果希望在dev合并到release/*的MR**未合并时(比如MR验证阶段)**就触发作业,使用以下配置:
build-composer: stage: build-app image: name: $PHP_IMAGE entrypoint: [""] script: - composer install artifacts: paths: - vendor/ expire_in: 1h rules: - if: '$CI_COMMIT_BRANCH == "dev" && $CI_COMMIT_TAG == null' when: always # MR打开时,dev合并到release分支触发作业 - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME == "dev" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME =~ /^release\/.*$/ && $CI_PIPELINE_SOURCE == "merge_request_event"' when: always # MR打开时,feature合并到dev分支触发作业 - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature\/.*$/ && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "dev" && $CI_PIPELINE_SOURCE == "merge_request_event"' when: always
关键说明
- 正则表达式
/^release\/.*$/是匹配所有release/开头分支的正确写法,不要用== "release/**"这种无效写法。 $CI_MERGE_REQUEST_STATE == "merged"仅在MR刚完成合并的瞬间生效,后续目标分支的流水线都是push类型,该条件不再适用。
内容的提问来源于stack exchange,提问作者Raja Haikal
相关产品推荐
相关产品推荐

