手动创建 Gitlab runner
2024-09-18 02:46:04 # Technical # Operation

由于公司 gitlab 回滚,导致很多项目 CI/CD 的 runner token 失效,对于近期有更新的项目 gitlab 那边的同事还能帮忙处理,但是有些年久失修的项目就需要自己动手创建一个对应的 runner

创建 Runner 容器

随便找一台有 docker 的 Ubuntu 机器

这里有个隐性要求,如果 runner 需要拉取的镜像是在 非 TLS 的服务器上的,就需要配置 /etc/docker/daemon.json 中的 insecure-registries 标签,如:需要从 192.168.13.25 镜像仓库拉取镜像,就需要配置 "insecure-registries": ["192.168.13.25:5002"],不然无法拉取镜像。

关键一点:配置完 daemon.json 需要重启 docker 生效,所以需自行评估操作风险

先尝试拉下 gitlab-runner 的镜像

1
$ docker pull gitlab-runner:latest

如果拉不到就去有镜像的服务器上手动导出一个

1
$ docker save gitlab-runner:latest -o ./gitlab_runner.tar

然后上传到待创建的服务器上,加载镜像

1
$ docker load -i gitlab_runner.tar

检查下镜像有没有导入

1
$ docker images |grep runner

如果发现没有 REPOSITORYTAG 信息就手动打个 tag

1
$ docker tag <image-id> gitlab/gitlab-runner:latest

接下来进入正题,创建 runner 容器

首先需要准备一个 runner 的 config.toml 挂载文件

到任意路径下创建一个 config.tomal

1
2
3
4
5
6
listen_address = ":9252"
concurrent = 15
check_interval = 0

[session_server]
session_timeout = 1800

这个配置文件需要挂载到 runner 容器中

1
2
3
4
5
6
$ docker run -d --privileged --name gitlab-runner \
-v /opt/runner/gitlab-runner/config:/etc/gitlab-runner:rw \
-v /var/run/docker.sock:/var/run/docker.sock:rw \
-p 8093:8093 \
-p 9252:9252 \
gitlab/gitlab-runner:latest

注册 Runner

runner 正常启动后,进入对应项目的 CI/CD 设置页,找到项目的 runner 特征值

Specific runners

为该项目注册 runner

1
2
3
4
5
6
# 项目的 token
$ registration_token=8xumBh2szTV-ZeXL-usQ
$ description='任意描述'
# 项目 ci 文件中所用到的标签
$ tag_list=amd,docker
$ docker exec -it gitlab-runner gitlab-runner register --non-interactive --executor "docker" --docker-image alpine --url "http://192.168.70.8/" --registration-token $registration_token --description "${description}" --tag-list "${tag_list}" --run-untagged="true" --locked="false"

注册完成后,进入 runner 的配置文件中 config.toml

会看到有增加一个 runner 的配置,需要修改部分内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
listen_address = ":9252"
concurrent = 15
check_interval = 0

[session_server]
session_timeout = 1800

[[runners]]
name = "注册时设置的描述"
url = "http://192.168.70.8/"
id = 852
token = "noPVp638W98pwXJWwBdf"
token_obtained_at = 2024-08-21T07:45:52Z
token_expires_at = 0001-01-01T00:00:00Z
executor = "docker"
[runners.custom_build_dir]
enabled = true
[runners.cache]
MaxUploadedArchiveSize = 0
[runners.docker]
tls_verify = false
image = "alpine"
privileged = true
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
# ===需要修改的部分===
volumes = ["/cache", "/builds:/builds", "/root/.m2:/root/.m2", "/var/run/docker.sock:/var/run/docker.sock"]
extra_hosts = ["intellif.io:192.168.11.225"]
pull_policy = ["if-not-present"]
# =================
shm_size = 0
network_mtu = 0

到此 runner 就算创建完成

异常处理

不出意外的话,那就是要出意外了

  • 基础镜像拉取失败

    由于不可描述的原因,国内无法直接拉取镜像,这里需要将 config.toml 中的 image = "alpine" 改为 image = "192.168.13.25:5002/base/maven:3-jdk-8"

    alpine

  • gitlab-runner-helper 镜像拉取失败

    原因同上,这里需要从其他地方导入一个 gitlab-runner-helper 镜像(为啥需要这个镜像的原因未知)

    gitlab-runner-helper

  • Cannot link to a non running container

    具体原因未知,但经试验发现,可能是 runner 的镜像版本原因,将 gitlab-runner 的版本换成 alpine-v13.8.0 试试吧

    Cannot link to a non running container

docker daemon.json 配置说明

  • insecure-registries:指定不使用 HTTPS 的私有镜像仓库列表

    1
    "insecure-registries": ["myregistry.local:5000"]

    允许 Docker 连接到不使用 SSL 的镜像仓库

  • registry-mirrors:指定 Docker 镜像的加速镜像站点

    1
    "registry-mirrors": ["https://mirror.gcr.io"]

    提供快速的镜像拉取速度,尤其是在网络不佳的情况下

  • data-root:指定 Docker 存储数据的根目录

    1
    "data-root": "/mnt/docker-data"

    更改 Docker 默认的存储位置,以节省磁盘空间或优化性能

  • storage-driver:指定 Docker 使用的存储驱动

    1
    "storage-driver": "overlay2"

    选择不同的存储驱动来优化性能或兼容性

  • log-level:设置 Docker 日志的详细级别

    1
    "log-level": "debug"

    设定日志记录的详细程度,帮助调试问题

  • log-opts:配置 Docker 容器日志的行为

    1
    2
    3
    4
    "log-opts": {
    "max-size":"100m",
    "max-file":"1"
    }
    • **”max-size”: “100m”**:设置单个日志文件的最大大小为 100 MB

      当日志文件的大小达到 100 MB 时,Docker 会自动进行日志轮换。即,它会将当前日志文件重命名并创建一个新的日志文件来继续记录日志

    • **”max-file”:”1”**:设置要保留的旧日志文件的数量为 1

      在日志轮换时,Docker 会保留一个轮换的日志文件。如果 max-file 设置为 1,Docker 将只保留一个旧日志文件并删除其他的。这有助于控制磁盘空间的使用

  • exec-opts:设置执行选项,如默认的 log-opts

    1
    "exec-opts": ["native.cgroupdriver=systemd"]

    配置 Docker 的 Cgroup 驱动类型,以适配系统的 Cgroup 配置

  • bip:设置 Docker 的默认桥接网络 IP 地址

    1
    "bip": "192.168.1.5/24"

    更改 Docker 默认的网络桥接配置,可能用于避免 IP 冲突

  • default-address-pools:配置用于设置 Docker 默认网络地址池

    1
    2
    3
    4
    "default-address-pools": [{
    "base": "170.10.0.1/16",
    "size": 24
    }]
    • **”base”: “170.10.0.1/16”**:指定地址池的起始地址和子网掩码
    • “size”: 24:定义从地址池中分配的子网的大小。24 表示每个子网将有 256 个 IP 地址(子网掩码 /24