本文目标:
- 一台主机部署多个 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 |