GitLab如何基于子文件夹动态并行执行任务,无需手动更新矩阵?
解决方案:动态生成GitLab CI并行任务矩阵
针对子文件夹数量多且持续增长的场景,GitLab 15.10及以上版本支持动态生成并行矩阵,无需手动维护TEAM数组,自动识别变更的子文件夹并触发对应任务。
实现步骤
- 定义前置任务,动态生成包含所有变更子文件夹的矩阵JSON
- 在主任务中引用该矩阵,自动生成并行任务
完整CI配置示例
# 第一步:动态生成矩阵JSON Generate Team Matrix: stage: .pre script: - | # 筛选当前提交中变更的config.yaml所属子文件夹 TEAMS=$(git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA | grep 'mainfolder/.*/config.yaml' | sed -E 's/mainfolder\/(.*)\/config.yaml/\1/' | sort | uniq) # 转换为GitLab CI矩阵所需的JSON格式 echo "matrix=[\"$TEAMS\"]" | sed 's/ /", "/g' > matrix.env artifacts: reports: dotenv: matrix.env # 第二步:使用动态矩阵运行并行任务 Validating the Data: stage: validation parallel: matrix: - TEAM: $matrix rules: - changes: - mainfolder/$TEAM/config.yaml
关键说明
stage: .pre是GitLab预定义的前置阶段,会在所有自定义阶段前执行- 若需要对所有子文件夹(无论是否变更)运行任务,可修改
TEAMS的获取命令:TEAMS=$(find mainfolder -maxdepth 1 -type d ! -name mainfolder | sed 's/mainfolder\///') - 生成的
matrix.env会作为环境变量传递给后续任务,$matrix会被解析为数组,自动生成对应数量的并行任务
注意事项
- 确保GitLab Runner版本与服务器版本兼容(建议15.10+)
- 子文件夹数量上千时,需在项目设置中调整最大并行任务数,避免触发限制
- 若使用低于15.10的GitLab版本,可通过子流水线实现:编写脚本生成子流水线CI配置文件,再用
trigger关键字触发
内容的提问来源于stack exchange,提问作者Gabriel
相关产品推荐
相关产品推荐

