minio可替代本地缓存实现多runner共享依赖快照。需独立部署minio(docker启动,暴露9000/9001端口,挂载持久化目录,设置accesskey/secretkey,创建bucket),gitlab runner配置s3缓存(type="s3"、serveraddress、accesskey、secretkey、bucketname、shared=true、insecure=true),.gitlab-ci.yml中声明cache key、paths及policy,验证日志是否命中缓存。

直接用 MinIO 替代本地缓存,就能让多个 Runner 共享同一份依赖快照,彻底解决“A 机器缓存了、B 机器还得重下”的问题。核心不是换工具,而是把缓存从“每个 Runner 自己管”变成“统一由 S3 兼容服务托管”。
MinIO 服务部署要点
MinIO 必须独立运行,不依附于任何 Runner 主机。推荐用 Docker 启动,暴露两个端口:
- 9000 端口:用于对象上传/下载(S3 API)
- 9001 端口:Web 控制台(可选,方便查 bucket 和凭证)
- 挂载持久化目录,比如
/minio/data存对象,/minio/config存配置 - 启动时必须设置
MINIO_ACCESS_KEY(至少 3 位)和MINIO_SECRET_KEY(至少 8 位),后续 Runner 配置会用到 - 创建一个 bucket,例如
gitlab-runner-cache,所有缓存 tar 包都存这里
GitLab Runner 的 S3 缓存配置
修改 Runner 的 config.toml,在对应 [[runner]] 段落中加入 cache 块:
- Type = "s3":明确指定后端为 S3 兼容协议
-
ServerAddress = "your-minio-ip:9000":填 MinIO 实际监听地址,不带
http:// - AccessKey / SecretKey:与 MinIO 启动时设置的一致
- BucketName:填上面创建的 bucket 名称
- Shared = true:关键开关,设为 true 才能让不同 Runner 读写同一份缓存
- insecure = true:如果 MinIO 未启用 TLS(即用 HTTP),此项必须设为 true
.gitlab-ci.yml 中的缓存声明
流水线脚本里要定义缓存路径和 key 规则,否则 Runner 不知道该存什么、怎么找:
-
key 推荐用
${CI_COMMIT_REF_SLUG}或default,避免分支间缓存污染 -
paths 明确列出需缓存的目录,如
target/(Maven)、node_modules/(Node.js) - policy: pull-push 表示每次作业都先拉缓存再推更新,适合绝大多数场景
- 可加
when: on_success,只在构建成功后才上传新缓存,防止失败构建污染缓存
验证与调优提示
配置生效后,观察日志里的 Checking cache for … 和 Downloading cache from … 行:
- 首次构建耗时长,但日志应显示 “Uploading cache to …”
- 第二次构建若看到 “Using cache …” 且耗时明显下降(实测常缩短 60%~70%),说明命中成功
- 如果频繁出现 “Cache is not found”,检查 key 是否一致、bucket 权限是否开放、网络连通性
- 缓存包默认压缩为 tar,无需额外处理;MinIO 自动按对象存储方式管理,无文件系统限制











