Forgejo 有一个项目仓库大小达到了 2.6GiB,Woodpecker 流水线在执行时,第一步 Clone 就需要大约 3 分钟的时间。后续任务还有跨仓库操作,另外一个仓库大小也超过了 1GiB,也需要2分钟 Clone。

跨仓库的 Clone,是配置了部署密钥后,通过 git 命令直接 Clone 的。可以通过设置 --depth=1 来减少数据传输。

如果 CI 任务只需要部分目录,那么可以使用 --sparse 来做稀疏检出。效果非常显著,另一仓库的 Clone 时间从 2分钟 降到了 10秒以内。

而 Woodpecker 的默认 Clone 操作,并不支持稀疏检出。流水线任务执行时,会启动新的 Docker 容器,重新开始 Clone 整个仓库。我曾设想使用本地 Repo 作为缓存,但为了避免对文件加锁,就需要耗时的复制操作。或者使用与其他仓库一样的手动检出,不过,Woodpecker 原本已做好的目录和权限等各种处理,也都需要重新自行实现。

Woodpecker 提供了 Git 插件,可以为默认的 Clone 操作进行一些定制增强,不过一直以来选项有限。Plugin Git 刚刚发布了 2.12.0,新增了对稀疏检出的选项。

clone:
  git:
    image: woodpeckerci/plugin-git:2.12.0
    settings:
      lfs: false
      sparse:
        - path/Folder_1
        - path/Folder_2

steps:
  # ...

在 Woodpecker 中可以看到,原本的步骤名为 ‘Clone’,变成了 ‘git’,执行时间降至了 22 秒。

新版的 Plugin Git 似乎也加入了仓库缓存,因为在新的流水线第二次运行时,任务 ‘git’ 的执行时间只要 3 秒了!

整个流水线 5 分钟的执行时长,在全面切换到稀疏检出后,缩短到 30 秒左右。