和k8s部署runner相比,Docker安装runner的优势
缓存,项目里用到的各种依赖,不可能每次都下载,以及构建、语法检测等都会产生缓存。在k8s runner中使用分布式存储ceph来保存这些文件,大概700m。每次使用时特别慢,大部分时间都花在下载缓存,上传缓存。当前项目整个流水线跑下来需要10多分钟。而是用docker部署的runner,时间减少到3分钟,因为使用的本地磁盘来保存缓存。
docker-compose.yaml
代码语言:javascript复制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'
创建挂载目录
代码语言:javascript复制mkdir -p data/config
mkdir -p data/cache
mkdir -p data/ssl
配置Gitlab的https证书
如果 gitlab 是 docker 部署的,ssl 证书所在路径为:/etc/gitlab/ssl/xxx.com.crt
将证书放到ssl目录,整体结构为
代码语言:javascript复制.
├── data
│ ├── cache
│ ├── config
│ └── ssl
│ └── xx.xx.com.crt
└── docker-compose.yaml
创建runner容器
代码语言:javascript复制docker-compose up -d
注册runner
Gitlab Runner 有 3 种级别
- 全局共享
- 因为 executor 使用的是容器,不是 shell,所以非特殊要求,使用这个就行。如果是 shell,可能每个项目用到的环境不同,需要单独使用 runner
- 群组共享
- 项目独占
Runner 的并发性
- 每个 job 会单独起一个容器
- 不同流水线的 job 是并行处理
- 同一流水线同一阶段的 job 也是并行处理
获取 Gitlab CI Register Token
访问Gitlab全局 Runner 配置地址:https://xxx.com/admin/runners
注册
代码语言:javascript复制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 "docker-runner,share-runner,172.30.7.17-runner" --run-untagged="true" --locked="false" --access-level="not_protected"
查看
访问全局 Runner 配置地址:https://xxx.com/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/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"