本文目标:
- 一台主机部署多个 Gitlab Runner
- 实现互相隔离且互不影响的 Gitlab Runner 环境
- 使用
compose.yaml持久化配置和数据,快速复制部署 - 在 Gitlab Runner 中使用
docker,helm以及kubectl
前置要求:
- 宿主机上安装了
docker和docker compose - 【可选】宿主机上安装了
kubectl和helm
方案限制:
- 只能使用 shell 作为 Gitlab Executor
- 由于 Gitlab Runner 本身运行在 docker container 中,所以几乎没有影响
一. 构建 Gitlab Runner 运行环境镜像
首先使用以下 Dockerfile 来构建一个镜像,作为 Gitlab Runner 的运行环境。
这个 Dockerfile 主要做的是这么几件事情:
- 安装一些常用的系统工具,比如
git,vim,ping,wget,curl等 - 安装
docker、docker compose、kubectl、helm和gitlab runner - 添加
gitlan runner用户并切换到该用户- Gitlab Runner 服务一般以
gitlab runner用户启动
- Gitlab Runner 服务一般以
1 | # This is the image for gitlab runner based on ubuntu:22.04, which adds the following features: |
执行以下命令来构建镜像:
1 | docker build . -f Dockerfile -t gitlab-runner:v0.1.0 |
二. 设置 Gitlab Runner 启动参数
然后使用以下 docker-compose.yaml 来启动 Gitlab Runner。这个 docker-compose.yaml 主要做了这么几件事情:
- 复制宿主机的
helm、kubectl、docker配置到容器中并持久化 - 持久化容器中的
gitlab runner配置和数据 - 把宿主机上的
docker透传给容器里面- 容器里面的
docker(容器/镜像)和宿主机互通
- 容器里面的
- 启动两个 service:
init, 用来做文件初始化操作runner,用来运行gitlab runner- 通过
tail -f /dev/null常驻容器 - 注意设置
init: true否则tail进程不会回收僵尸进程
- 通过
init通过/shared/.init_done通知runner准备工作是否完成
1 | # docker-compose.yaml |
三. 启动镜像
有了以上准备后,就可以启动容器并进入其中配置 Gitlab Runner 了。
为了方便在同一台宿主机上启动多个 Gitlab Runner,我们给每个 Runner 创建一个独立的文件夹。
由于 docker compose 默认使用文件夹名字作为 project 的名字,所以每个 Gitlab Runner 最好使用不同的名字(即使它们在不同的父目录中):
1 | mkdir -p gitlab-runners-test |
由于 docker-compose.yaml 中需要从环境变量中读取一些配置,为了后续方便,可以把这些配置落到 env.sh 中:
1 | export DOCKER_SOCKS=/var/run/docker.sock |
然后再执行以下命令启动服务:
1 | docker compose up |
启动后,如果一切正常,会看到 docker, docker compose, kubectl 和 helm 的自检输出。
这时候,就可以进入容器里去注册 Gitlab Runner 了:
1 | docker compose exec -it runner /bin/bash |
进入容器后,执行:
1 | # inside container |
之后的操作,和常规的注册流程一样,唯一需要注意的是,选用 shell 作为 Gitlab Executor。
如果一切正常,退出刚才通过 docker compose up 启动的服务,改为在后台常驻运行:
1 | docker compose up -d |