如何通过循环在GitLab CI中为100个文件夹创建单阶段多任务
在GitLab CI中为批量文件夹生成同阶段任务的实现方法
GitLab CI本身不支持在.gitlab-ci.yml中直接写for循环,但可以通过动态生成CI配置的方式实现批量创建同阶段任务,下面是最实用的方案:
方案:前置作业动态生成任务配置
通过一个前置作业遍历所有目标文件夹,自动生成对应的CI任务配置文件,让GitLab CI加载这个动态文件来创建任务。
步骤1:创建.gitlab-ci.d目录
GitLab CI会自动扫描仓库根目录下的.gitlab-ci.d文件夹,加载其中所有YAML配置文件。先在本地创建这个目录并提交到仓库。
步骤2:编写主配置文件gitlab-ci.yml
stages: - prepare - build # 生成动态任务的前置作业 generate-folder-jobs: stage: prepare script: - | # 初始化动态配置文件 echo "folder_build_jobs:" > .gitlab-ci.d/folder-jobs.yml # 遍历所有一级目录,排除.git和当前目录 for dir in $(find . -maxdepth 1 -type d ! -name "." ! -name ".git" | sort); do folder_name=$(basename "$dir") # 处理文件夹名称,替换特殊字符为下划线(符合GitLab作业命名规范) job_name="build-$(echo "$folder_name" | sed 's/[^a-zA-Z0-9]/_/g')" # 写入对应任务配置 cat << EOF >> .gitlab-ci.d/folder-jobs.yml $job_name: stage: build script: - cd "$folder_name" - echo "开始处理文件夹: $folder_name" # 替换成你的实际执行命令,比如 npm install、make 等 # - npm run build only: changes: - "$folder_name/**/*" EOF done artifacts: paths: - .gitlab-ci.d/folder-jobs.yml expire_in: 1h
原理说明
generate-folder-jobs作业在prepare阶段执行,遍历所有目标文件夹,生成每个文件夹对应的build-xxx任务,全部归属于build阶段。- 通过
only:changes配置,只有当对应文件夹内的文件有变更时,该任务才会触发(不需要的话可以删除这部分)。 - 动态生成的配置文件作为artifacts保留1小时,供后续阶段加载使用。
注意事项
- 遍历文件夹时要做好过滤,避免包含
.git、临时目录等不需要处理的文件夹。 - 作业名称必须符合GitLab规范,不能包含空格、特殊字符,所以用
sed替换处理是必要的。 - 同阶段的任务默认会并行执行,如果需要限制并行数量,可以在项目CI设置中调整“并发作业数”。
内容的提问来源于stack exchange,提问作者VomitCat
相关产品推荐
相关产品推荐

