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

如何通过循环在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 13:05:14