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

GitLab CI配置rules: changes后任务未执行问题排查

问题描述

仅在main分支满足以下两个条件时执行build和deploy阶段任务:

  1. src目录存在JSON文件;
  2. src目录的JSON文件发生变更。

尝试用before_script结合find、wc命令检查条件1,用rules: changes检查条件2,配置通过语法校验,before_script逻辑单独测试正常,但所有任务均未触发执行。流水线结构:

docker-build (build) ---- process-build (build)
                     \___ app-deploy (deploy)

原.gitlab-ci.yml配置:

stages:
  - build
  - deploy

docker-build:
  stage: build
  before_script: 'if [ $(find ./src -name "*.json" | wc -l) -eq 0 ]; then exit 0; fi'
  script:
    - docker build
    ...
  rules:
    - if: '$CI_COMMIT_BRANCH == "main"'
      changes:
        - ./src/**/*.json

process-build:
  stage: build
  needs: docker-build
  script:
    ...
  rules:
    - if: '$CI_COMMIT_BRANCH == "main"'
      changes:
        - ./src/**/*.json

app-deploy:
  stage: deploy
  needs: docker-build
  script:
    ...
  rules:
    - if: '$CI_COMMIT_BRANCH == "main"'
      changes:
        - ./src/**/*.json
问题原因
  1. rules: changes的局限性:该规则是和上一次流水线的提交对比,如果是main分支的首次提交、或没有历史流水线记录,GitLab无法检测到变更,会直接跳过任务。
  2. before_script的exit 0错误:exit 0会让任务标记为成功完成,而非触发跳过逻辑,且before_script是任务触发后才执行,无法提前控制任务是否启动。
解决方案

将两个条件合并到rules中,用exists关键字检查文件是否存在,结合changes和分支判断,同时处理needs的依赖逻辑:

修正后的配置:

stages:
  - build
  - deploy

.docker-base-rules:
  rules:
    - if: '$CI_COMMIT_BRANCH == "main"'
      exists:
        - ./src/**/*.json
      changes:
        - ./src/**/*.json
      when: always

docker-build:
  stage: build
  script:
    - docker build
    ...
  extends: .docker-base-rules

process-build:
  stage: build
  needs: [docker-build]
  script:
    ...
  extends: .docker-base-rules

app-deploy:
  stage: deploy
  needs: [docker-build]
  script:
    ...
  extends: .docker-base-rules

关键调整说明

  • 使用exists: ./src/**/*.json直接检查src目录是否存在JSON文件,无需依赖脚本,GitLab会在任务触发前完成校验。
  • 将分支判断、exists、changes合并到同一条规则中,确保三个条件同时满足才触发任务。
  • 使用锚点.docker-base-rules复用规则配置,减少重复代码。
  • 移除before_script中的判断逻辑,避免任务触发后才执行校验的问题。

如果需要兼容首次提交场景(即src目录已有JSON文件但无历史变更),可补充规则:

.docker-base-rules:
  rules:
    - if: '$CI_COMMIT_BRANCH == "main"'
      exists:
        - ./src/**/*.json
      changes:
        - ./src/**/*.json
      when: always
    # 处理main分支首次提交,src已有JSON文件的场景
    - if: '$CI_COMMIT_BRANCH == "main"'
      exists:
        - ./src/**/*.json
      when: always

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 02:13:19