背景

  1. 使用 gitlab-runner 做 CI/CD
  2. 使用 docker 的方式启动 gitlab-runner
  3. gitlab-ci.yml 中使用 docker dind 的方式打包和构建镜像
  4. 我们使用了自建的 Maven 仓库以及 Docker 镜像仓库。

现象

每次在推送代码到指定分支时,一次完整的 CI/CD 流水线耗时在 32~36 分钟。流程中包含两个作业,分别是打包 SpringBoot 项目和构建以及部署 Docker 镜像。

  1. 作业 1:打包 SpringBoot 的过程每次耗时在 17 分钟左右。
  2. 作业 2:构建和部署 Docker 镜像耗时约在 16 分钟左右。

作业 1 的问题

通过查看作业 1 的日志发现,主要耗时有两点,分别是:

  1. 下载 maven 依赖包。
  2. 上传打包好的 SprintBoot jar 包。

作业 2 的问题

通过查看作业 2 的日志发现,主要耗时也是两点,分别为:

  1. 下载生成的 SpringBoot jar 包。
  2. 上传打包好的 Docker 镜像。

原因

Maven依赖包, SpringBoot jar 包以及 docker 镜像的上传或下载的瓶颈都在网络上。

解决方案

在 gitlab-runner 中配置 maven 仓库、gitlab 以及 docker 仓库走内网访问,加速上传和下载的过程。在 /gitlab-runner/config.toml 配置文件中添加如下内容:

1
2
[runners.docker]
  extra_hosts = ["gitlab.example.com:192.168.0.123", "maven.example.com:192.168.0.124", "docker.example.com:192.168.0.125"]