和k8s部署runner相比,Docker部署runner的优势
- 缓存,项目里用到的各种依赖,不可能每次都重新下载。同时构建应用、语法检测等也会产生缓存文件。
- 某个项目在k8s runner中使用分布式存储ceph来保存这些文件,大概700m。每次使用时特别慢,大部分时间都花在下载缓存,解压缓存,流水线结束时压缩缓存,上传缓存。
- 整个流水线跑下来需要10多分钟,但如果用docker部署的runner,时间将减少到3分钟。主要原因是因为使用挂载本地目录的形式来保存缓存文件,而不是使用gitlab的缓存关键字,从而跳过了上面提到的下载、解压、压缩、上传缓存文件这几个耗时的步骤。
- 当然在k8s中部署runner也可以选择挂载hostPath存储卷,不过那样的话,k8s灵活调度,充分利用资源的特性就用不到了。同时部署复杂度还提升不少,得不偿失。
docker-compose.yaml
version: "3.9"
services:
gitrunner:
image: 'gitlab/gitlab-runner'
container_name: "gitlab-runner"
restart: always
volumes:
- './data/config:/etc/gitlab-runner'
- './data/cache:/tmp/cache'
- './data/ssl:/etc/gitlab-runner/certs/'
- '/usr/bin/docker:/usr/bin/docker'
- '/var/run/docker.sock:/var/run/docker.sock'
创建挂载目录
mkdir -p data/config
mkdir -p data/cache
mkdir -p data/ssl
mkdir -p data/maven/.m2
mkdir -p data/go-mode/mod
mkdir -p data/data
配置Gitlab的https证书
如果 gitlab 是 docker 部署的,ssl 证书所在路径为:/etc/gitlab/ssl/xxx.com.crt
将证书放到ssl目录,整体结构为
.
├── data
│ ├── cache
│ ├── config
│ ├── data
│ ├── go-mode
│ │ └── mod
│ ├── maven
│ │ └── .m2
│ └── ssl
│ └── xx.xx.com.crt
└── docker-compose.yaml
创建runner容器
docker-compose up -d
注册runner
Gitlab Runner 有 3 种级别
- 全局共享
- 因为 executor 使用的是容器,不是 shell,所以非特殊要求,使用这个就行。如果是 shell,可能每个项目用到的环境不同,需要单独使用 runner
- 群组共享
- 项目独占
Runner 的并发性
- 每个 job 会单独起一个容器
- 不同流水线的 job 是并行处理
- 同一流水线同一阶段的 job 也是并行处理
获取 Gitlab CI Register Token
访问Gitlab全局 Runner 配置地址:https://{gitlab地址}/admin/runners
注册
docker exec -it gitlab-runner gitlab-runner register --non-interactive --executor "docker" --docker-image alpine:latest --url "https://xx.xx.com" --registration-token "RQxx7UtMssiWyzWqtUMr" --description "172.30.7.17-docker-runner" --tag-list "x86,docker-runner,share-runner,172.30.7.17-runner" --run-untagged="true" --locked="false" --access-level="not_protected"
查看
访问全局 Runner 配置地址:https://{gitlab地址}/admin/runners
配置runner
vim data/config/config.toml
修改并发数
concurrent
:默认为1,结合服务器配置自行修改
挂载目录
用于每个流水线容器都会挂载的目录,实现缓存功能的关键。
[runners.docker]下的volumes更改为:
volumes = ["/opt/compose/gitlab-runner/data/cache:/cache","/usr/bin/docker:/usr/bin/docker","/var/run/docker.sock:/var/run/docker.sock","/opt/compose/gitlab-runner/data/maven/.m2:/root/.m2","/opt/compose/gitlab-runner/data/go-mode/mod:/go/pkg/mod","/opt/compose/gitlab-runner/data/data:/data"]
/opt/compose/gitlab-runner/data/cache
:前面创建的挂载目录绝对路径/usr/bin/docker:/usr/bin/docker,/var/run/docker.sock:/var/run/docker.sock
:实现docker in docker,用于在流水线容器中打镜像
修改镜像拉取策略
- 默认每次重新拉取
- [runners.docker]下增加
pull_policy = "if-not-present"