You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitLab CI/CD仅在合并请求运行阶段时构建测试阶段缺失问题

问题原因与解决办法

为什么build、test阶段在合并请求流水线里不显示?

GitLab CI的默认规则是:没有显式定义only/except的job,只会在分支或标签的流水线中运行。而合并请求(merge_requests)属于独立的流水线类型,不在默认的触发范围内。你只给deploy review加了only: merge_requests,所以只有这个job会出现在合并请求流水线里,其他没加规则的build、test job不会被触发。

解决办法

有两种常用方案,按需选择:

方案1:给build、test job添加only规则

直接给这两个job加上包含merge_requests的only配置,让它们能在合并请求流水线里运行:

build website:
  stage: build
  only:
    - merge_requests
    - branches  # 保留分支流水线的触发
  script:
    - sed -i "s/%%VERSION%%/$CI_COMMIT_SHORT_SHA/g" ./public/index.html
  artifacts:
    paths:
      - ./public
    
test website:
  stage: test
  only:
    - merge_requests
    - branches
  script:
    - curl "http://localhost:9000" | tac | tac | grep -q "Gatsby"    

方案2:用workflow:rules统一控制流水线触发

这种方式更简洁,全局定义流水线触发条件,避免每个job重复写only:

image: node

workflow:
  rules:
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
    - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
      when: never
    - if: $CI_COMMIT_BRANCH

stages:
  - build
  - test
  - deploy review
  - deploy staging
  - deploy production
  - production tests

build website:
  stage: build
  script:
    - sed -i "s/%%VERSION%%/$CI_COMMIT_SHORT_SHA/g" ./public/index.html
  artifacts:
    paths:
      - ./public
    
test website:
  stage: test
  script:
    - curl "http://localhost:9000" | tac | tac | grep -q "Gatsby"    

deploy review:
  stage: deploy review  
  only:    
    - merge_requests
  environment:
    name: review/$CI_COMMIT_REF_NAME
    url: http://test.surge.sh
    on_stop: stop review  
  script:
    - npm install -g surge
    - surge --project ./public --domain test.surge.sh

这个workflow规则的作用是:

  • 触发合并请求流水线
  • 当分支有打开的合并请求时,不再触发分支流水线(避免重复构建)
  • 触发普通分支流水线

这样所有job默认都会在符合workflow规则的流水线里运行,而deploy review仍然只在合并请求里执行。

内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 15:35:23