如何在同一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
相关产品推荐
相关产品推荐

