为什么创建合并请求时我的GitLab流水线test阶段被跳过?
问题根因
GitLab CI 作业的rules采用从上到下的顺序匹配逻辑:作业命中某条规则时就按照该规则的when配置决定是否执行,如果没有命中任何规则,作业默认被设置为不执行。
你当前test作业的rules仅配置了「web 触发、定时触发时不执行」这一条规则,合并请求触发的merge-request-event场景没有命中任何规则,因此test作业被默认跳过,不会运行。
修复方案
根据你的需求可以选择以下任意一种方案:
方案1:兜底执行所有未排除的场景
如果你的需求是test作业在除了web触发、定时触发之外的所有场景(包括合并请求、代码推送等)都正常执行,直接在规则末尾加一条兜底规则即可:
test: rules: - if: $CI_PIPELINE_SOURCE == "web" || $CI_PIPELINE_SOURCE == "schedule" when: never # 兜底规则:所有未匹配到上面排除规则的场景,都正常执行作业 - when: on_success stage: test script: - 'echo "Running Test"'
when: on_success表示当前面的所有阶段执行成功后就运行当前作业,符合流水线按顺序执行的要求。
方案2:明确指定需要执行的场景
如果需要更严格的控制,避免作业在意外场景触发,可以明确列出允许执行的场景:
test: rules: - if: $CI_PIPELINE_SOURCE == "web" || $CI_PIPELINE_SOURCE == "schedule" when: never # 明确指定合并请求场景执行 - if: $CI_PIPELINE_SOURCE == "merge_request_event" # 明确指定代码推送场景执行 - if: $CI_PIPELINE_SOURCE == "push" stage: test script: - 'echo "Running Test"'
规则中未写when时默认取值为on_success,和方案1的执行逻辑一致。
修改后合并请求触发的流水线就会按照test→stage1→stage2的顺序正常执行三个阶段。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

