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 秒左右。