GitLab CI合并请求报错:build_publish_branch依赖test但不在前置阶段
问题原因及解决方案
问题根源
GitLab CI 默认行为:未配置 rules/only/except 的 Job,只会在分支推送、标签推送类型的流水线中运行,不会出现在合并请求流水线里。
你的 test Job 没有设置任何规则,因此在合并请求流水线中完全不存在;而 build_publish_branch 的规则条件 $CI_COMMIT_BRANCH != 'test' 在合并请求场景下会被判定为 true(合并请求中 CI_COMMIT_BRANCH 是未定义的空值,空值不等于 test),导致该 Job 被纳入合并请求流水线,但它依赖的 test Job 不存在,从而触发报错。
解决方案
1. 确保 test Job 出现在所有流水线中
修改 test Job 的配置,添加 rules 让它在所有类型的流水线(分支、合并请求等)中都运行:
test: stage: test when: always rules: - when: always # 强制该 Job 在所有流水线类型中执行
2. 修正分支判断规则,适配合并请求场景
合并请求流水线中不依赖 CI_COMMIT_BRANCH,需改用合并请求专用变量(CI_MERGE_REQUEST_SOURCE_BRANCH_NAME 代表源分支,CI_MERGE_REQUEST_TARGET_BRANCH_NAME 代表目标分支)来完善规则,确保分支和合并请求场景都能正确匹配:
build_publish_branch: extends: .build_publish_job rules: # 分支场景:非 test 分支手动触发 - if: $CI_COMMIT_BRANCH != 'test' when: manual # 合并请求场景:源分支非 test 时手动触发 - if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME != 'test' when: manual build_publish_test: extends: .build_publish_job rules: - if: $CI_COMMIT_BRANCH == 'test' - if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME == 'test' deploy_branch: extends: .deploy_job needs: ['build_publish_branch'] rules: - if: $CI_COMMIT_BRANCH != 'test' when: always - if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME != 'test' when: always deploy_test: extends: .deploy_job needs: ['build_publish_test'] rules: - if: $CI_COMMIT_BRANCH == 'test' - if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME == 'test'
如果想简化规则,可以用逻辑或同时覆盖分支和合并请求场景:
build_publish_branch: extends: .build_publish_job rules: - if: ($CI_COMMIT_BRANCH != 'test') || ($CI_MERGE_REQUEST_SOURCE_BRANCH_NAME != 'test') when: manual
内容的提问来源于stack exchange,提问作者Dorialean
相关产品推荐
相关产品推荐

