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

如何在同一GitLab CI阶段中基于代码变更执行不同脚本

在单一GitLab CI任务中根据代码变更执行对应测试脚本

直接在test任务的脚本块中通过Git命令检测目录变更,再根据结果分支执行测试逻辑,无需拆分阶段。以下是完整的实现方案:

核心实现思路

利用GitLab CI提供的CI_COMMIT_BEFORE_SHA和CI_COMMIT_SHA变量,对比两次提交的文件变更列表,判断core/client-1和core/client-2目录是否有代码改动,再执行对应测试流程。

完整的.gitlab-ci.yml配置示例

test:
  stage: tests
  script:
    - |
      # 处理首次提交的特殊情况(无前置提交哈希)
      if [ -z "$CI_COMMIT_BEFORE_SHA" ]; then
        echo "首次提交,执行全部客户端测试"
        # 执行client-1测试
        cd core/client-1
        pip install -r requirements.txt
        pytest tests/
        # 切换到client-2执行测试
        cd ../../core/client-2
        pip install -r requirements.txt
        pytest tests/
        exit 0
      fi

      # 检测两个客户端目录的变更数量
      CLIENT1_CHANGED=$(git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA | grep -c "^core/client-1/")
      CLIENT2_CHANGED=$(git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA | grep -c "^core/client-2/")

      # 根据变更情况执行对应测试
      if [ $CLIENT1_CHANGED -gt 0 ] && [ $CLIENT2_CHANGED -eq 0 ]; then
        echo "仅client-1目录有变更,执行client-1测试"
        cd core/client-1
        pip install -r requirements.txt
        pytest tests/
      elif [ $CLIENT2_CHANGED -gt 0 ] && [ $CLIENT1_CHANGED -eq 0 ]; then
        echo "仅client-2目录有变更,执行client-2测试"
        cd core/client-2
        pip install -r requirements.txt
        pytest tests/
      else
        echo "两个客户端目录均有变更,或其他目录变更,执行全部测试"
        # 执行client-1测试
        cd core/client-1
        pip install -r requirements.txt
        pytest tests/
        # 切换到client-2执行测试
        cd ../../core/client-2
        pip install -r requirements.txt
        pytest tests/
      fi

关键细节说明

  • git diff --name-only:列出两次提交之间变更的文件路径
  • grep -c "^core/client-1/":统计匹配core/client-1目录下变更文件的数量,大于0则表示该目录有改动
  • 首次提交处理:当CI_COMMIT_BEFORE_SHA为空时(比如项目第一次推送),默认执行全量测试,避免Git命令报错
  • 依赖安装:如果两个客户端的依赖可以复用,可将pip install步骤移到before_script中统一执行;若依赖冲突,则保持分目录安装

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 18:35:03