一个计算机技术爱好者与学习者

0%

好好学GitLab:GitLab Runner安装实践

1. GitLab Runner版本说明

出于兼容性原因,GitLab Runner major.minor 版本应与 GitLab major.minor 版本保持同步。
较旧的runner可能仍然可以使用较新的 GitLab 版本,反之亦然。但是,如果存在版本差异,功能可能无法使用或无法正常工作。
minor版本更新时,会保障向后兼容性。但是,有时 GitLab 的minor版本更新会引入新功能,这些新功能需要 GitLab Runner 在同一minor版本上。

需要特别注意的是:GitLab Runner 15.0 对注册 API 请求格式进行了更改。它阻止 GitLab Runner 与低于 14.8 的 GitLab 版本通信。我们必须使用适合 GitLab 版本的 Runner 版本,或升级 GitLab 应用程序。

更多内容参考文档GitLab Runner

2. 查看安装教程

2.1. 指定项目的Runner

打开gitlab项目 -> Settings -> CI/CD -> Runners -> Expand -> Show Runner installation instructions

页面的 registration token,用于注册指定项目(当前项目)的runner。

2.2. 共享的Runner

查看Runner:https://gitlab.voidking.com/admin/runners

打开gitlab runner管理页面 -> Show Runner installation instructions

页面的 registration token,用于注册共享runner。

3. TOML语法

gitlab-runner配置文件为config.toml,使用TOML语法。
TOML的目标是成为一种易于阅读的最小配置文件格式。
TOML被设计为明确地映射到哈希表。
TOML应该很容易解析成各种语言的数据结构。

参考文档:

3.1. 注释

#,井号后面表示注释

3.2. 键值对

键名为字符串,值可以为字符串、整数、浮点数、布尔值、日期、时刻、数组、行内表等。
键名在等号的左边,值在等号的右边。

例如:

1
name = "voidking"

3.3.

表的表示方法:方括号+表名,例如[table]
表是键值对的集合,类似于json中的对象(花括号中内容)。在它下方,直至下一个表头或文件结束,都是这个表的键值对。
顶层表,又被称为根表,于文档开始处开始并在第一个表头(或文件结束处)前结束。

表名的规则和键名的规则相同。

表的层级结构以点.分隔,分隔的每个部分都是一个表名。
定义一个多层级表时,如果最后一个表名前的表没有被创建,那么会被自动创建。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
[table]
# 定义一个名为 table 的表
key1 = "some string"
key2 = 123

fruit.apple.color = "红色"
# 定义一个名为 fruit 的表
# 定义一个名为 fruit.apple 的表

fruit.apple.taste.sweet = true
# 定义一个名为 fruit.apple.taste 的表
# fruit 和 fruit.apple 已经创建过了

3.4. 表数组

表数组表示方法:双层方括号+表名,例如[[fruits]]
表数组是表的数组,类似于json中的对象数组。

表数组的第一例定义了这个数组及其首个表元素,而后续的每个表数组在该数组中创建并定义一个新的表元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[[fruits]]
name = "苹果"

[fruits.physical] # 子表
color = "红色"
shape = "圆形"

[[fruits.varieties]] # 嵌套表数组
name = "蛇果"

[[fruits.varieties]]
name = "澳洲青苹"

[[fruits]]
name = "香蕉"

[[fruits.varieties]]
name = "车前草"

对应的json格式为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"fruits": [
{
"name": "苹果",
"physical": {
"color": "红色",
"shape": "圆形"
},
"varieties": [
{ "name": "蛇果" },
{ "name": "澳洲青苹" }
]
},
{
"name": "香蕉",
"varieties": [
{ "name": "车前草" }
]
}
]
}

3.5. 缩进

TOML中的缩进没有意义,只是为了方便读者理解层级结构。

4. Linux环境安装Runner

参考文档:Install GitLab Runner

1、安装runner

1
2
3
4
5
6
7
8
9
10
11
12
13
# Download the binary for your system
sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64

# Give it permissions to execute
sudo chmod +x /usr/local/bin/gitlab-runner

# Create a GitLab CI user
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash

# Install and run as service
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start
sudo gitlab-runner -v

PS:其他版本的runner源码和二进制文件,可以在gitlab-runner Releases页面找到。

对于centos系统,可以直接使用rpm包安装。

1
yum install -y https://gitlab-runner.downloads.s3.amazonaws.com/latest/rpm/gitlab-runner_amd64.rpm 

2、添加到gitlab-runner到docker用户组(可选)
如果gitlab-runner执行的ci脚本需要运行docker,那么需要将gitlab-runner到docker用户组

1
2
3
4
5
sudo usermod -a -G docker gitlab-runner
# if no docker group
sudo usermod -a -G root gitlab-runner

sudo -u gitlab-runner -H docker info

3、gitlab-runner添加sudo权限(可选)

1
vim /etc/sudoers

添加配置:

1
gitlab-runner ALL=(ALL) NOPASSWD: ALL

5. 注册Shell类型Runner

Shell类型的Executor,在Runner程序所在主机上运行CI任务。

前置条件:安装好了Runner。

1
2
sudo gitlab-runner register -h
sudo gitlab-runner register --url https://gitlab.voidking.com/ --registration-token $REGISTRATION_TOKEN

REGISTRATION_TOKEN可以在gitlab页面获取到,详情参考上文【查看安装教程】一节。
根据提示,填写url、token、description、tags(多个tag以英文逗号分隔)、executor类型等信息,这里executor类型填写shell

6. 注册Docker类型Runner

Docker类型的Executor,在Runner程序所在主机上的Docker容器中运行CI任务。

前置条件:安装好了Runner,而且Runner所在主机已经安装配置好了Docker。

1
sudo gitlab-runner register --url https://gitlab.voidking.com/ --registration-token $REGISTRATION_TOKEN

根据提示,填写url、token、description、tags、executor类型等信息,这里executor类型填写docker,最后填写一个默认的镜像。

7. 注册Docker Machine类型Runner

参考文档:

7.1. 安装虚拟机驱动

可选驱动:

1、安装virtualbox驱动

1
yum install https://download.virtualbox.org/virtualbox/6.1.26/VirtualBox-6.1-6.1.26_145957_el7-1.x86_64.rpm

2、安装编译环境

1
yum install -y kernel-devel kernel-devel install gcc make perl kernel-headers

3、激活virtualbox内核支持

1
/sbin/vboxconfig

7.2. 安装Docker Machine

1、下载docker-machine二进制文件

1
2
3
wget https://gitlab.com/gitlab-org/ci-cd/docker-machine/-/releases/v0.16.2-gitlab.15/downloads/docker-machine-Linux-x86_64
mv docker-machine-Linux-x86_64 /usr/sbin/docker-machine
chmod +x /usr/sbin/docker-machine

更多版本可以访问docker-machine/releases页面查找。

2、测试启动虚拟机

1
docker-machine create -d virtualbox test

7.3. 注册Runner

前置条件:安装好了Runner。

1
sudo gitlab-runner register --url https://gitlab.voidking.com/ --registration-token $REGISTRATION_TOKEN

根据提示,填写url、token、description、tags、executor类型等信息,这里executor类型填写docker+machine,最后填写一个默认的镜像。

7.4. 配置镜像加速(可选)

参考文档《Docker镜像站的配置和使用》,搭建本地镜像站。

7.5. 配置缓存

1、启动minio容器

1
2
3
4
5
6
7
8
9
docker run -d --name minio \
--restart always \
-p 9000:9000 \
-p 9001:9001 \
-v /data/minio/.minio:/data/.minio \
-v /data/minio/export:/export \
-e "MINIO_ROOT_USER=root" \
-e "MINIO_ROOT_PASSWORD=xxxxxx" \
minio/minio:latest server /export --console-address ":9001"

2、页面访问
http://192.168.56.101:9001/

7.6. 配置Runner

1、修改 /etc/gitlab-runner/config.toml

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
concurrent = 3
check_interval = 0

[session_server]
session_timeout = 1800

[[runners]]
limit = 3
name = "dockermachine"
url = "https://gitlab.voidking.com"
token = "xxx"
executor = "docker+machine"
[runners.custom_build_dir]
enabled = true
[runners.cache]
Type = "s3"
Path = "runner"
Shared = true
[runners.cache.s3]
ServerAddress = "192.168.56.101:9000"
AccessKey = "root"
SecretKey = "xxx"
BucketName = "runner"
Insecure = true
[runners.cache.gcs]
[runners.cache.azure]
[runners.docker]
tls_verify = false
image = "docker:19.03"
privileged = true
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/certs/client","/cache", "/var/run/docker.sock:/var/run/docker.sock"]
pull_policy = ["if-not-present"]
shm_size = 0
[runners.machine]
IdleCount = 5
MaxGrowthRate = 1
IdleTime = 1800
MachineDriver = "virtualbox"
MachineName = "auto-scale-%s"
MachineOptions = [
"engine-registry-mirror=http://192.168.56.101:5000",
"engine-registry-mirror=http://192.168.56.101:5001",
"virtualbox-memory=4048",
"virtualbox-disk-size=204800",
"virtualbox-cpu-count=2"
]

注意:runners.docker.image要指定版本,否则每次构建都会拉取最新版的docker,而最新版本的docker不支持http请求镜像仓库。
更多docker版本可以访问dockerhub - docker获取。

其中MachineOptions中给定的参数,是docker-machine create命令接收的参数。

2、重新启动runner

1
gitlab-runner restart

7.7. 管理Docker Machine

1
2
docker-machine ls
docker-machine ssh xxx

8. K8S环境安装Runner

本节中,我们在K8S中通过helm安装Runner。

参考文档:

8.1. 准备存储

通过helm安装runner,values当前还不支持配置storageclass。因此,需要先自行准备好runner的存储。主要参考文档《K8S中安装配置StorageClass》

准备pvc定义 runner-pvc.yaml

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gitlab-runner-cache
spec:
storageClassName: nfs-storage
accessModes:
- ReadWriteMany
resources:
requests:
storage: 50Gi

8.2. 准备Runner配置

1、添加gitlab repo

1
2
helm repo add gitlab https://charts.gitlab.io
helm repo update

2、查看可用的runner版本

1
helm search repo -l gitlab/gitlab-runner

CHART VERSION有对应的APP VERSION版本,选择需要的APP VERSION版本。
这里选择14.0.0版本,对应CHART VERSION为0.30.0

3、下载chart

1
2
helm fetch gitlab/gitlab-runner --version 0.30.0
tar -xzvf gitlab-runner-0.30.0.tgz

4、values.yaml修改配置

  • image:指定版本gitlab/gitlab-runner:alpine-v14.0.1,更多镜像版本可以访问docker hub查找
  • gitlabUrl:改成我们自己的的gitlab地址
  • runnerRegistrationToken:参考【查看安装教程】一节获取
  • resources:修改申请和限制的资源
  • rbac.create:改成true,创建sa用于创建runner
  • name:改成runner想要在gitlab中显示的名称
  • tags:改成runner想要注册的tags,多个tag以英文逗号分隔
  • replicas:改成runner期望的副本数,这些runner副本使用同一个name。
  • privileged:改成true,启用docker in docker
  • runners.config:支持自定义构建目录,支持docker in docker

runners.config内容:

1
2
3
4
5
6
7
8
[runners.custom_build_dir]
enabled = true

[[runners.kubernetes.volumes.host_path]]
name = "docker"
mount_path = "/var/run/docker.sock"
read_only = true
host_path = "/var/run/docker.sock"

我们想要对构建缓存使用持久化存储,因此需要添加

1
2
3
4
5
## configure build cache
cibuild:
cache:
pvcName: gitlab-runner-cache
mountPath: /home/gitlab-runner/ci-build-cache

同时,需要修改gitlab-runner/templates/configmap.yaml
data.entrypoint部分添加runner配置,自动挂载存储

1
2
3
4
5
6
7
8
9
10
# add build cache and 
cat <<EOF >>/home/gitlab-runner/.gitlab-runner/config.toml
[[runners.kubernetes.volumes.pvc]]
name = "{{.Values.cibuild.cache.pvcName}}"
mount_path = "{{.Values.cibuild.cache.mountPath}}"
EOF

# Start the runner
exec /entrypoint run --user=gitlab-runner \
--working-directory=/home/gitlab-runner

8.3. 安装Runner

1、安装runner

1
2
3
kubectl create ns gitlab-14-0
kubectl apply -f runner-pvc.yaml -n gitlab-14-0
helm install --namespace gitlab-14-0 gitlab-runner ./gitlab-runner

2、查看安装

1
2
3
kubectl get all -n gitlab-14-0
kubectl get pvc -n gitlab-14-0
kubectl logs pod/gitlab-runner-gitlab-runner-849988b584-kllqv -n gitlab-14-0

3、查看runner注册结果
https://gitlab.voidking.com/admin/runners

找到新的runner,点击右侧的Edit按钮,可以做进一步的配置。

9. 自定义builds路径

参考文档Optimize GitLab for large repositories

1、准备builds目录

1
2
3
4
mkdir /builds
mkdir /cache
chown gitlab-runner:gitlab-runner -R /builds
chown gitlab-runner:gitlab-runner -R /cache

2、修改runner配置

1
vim /etc/gitlab-runner/config.toml

添加配置

1
2
3
4
5
[[runners]]
builds_dir = "/builds"
cache_dir = "/cache"
[runners.custom_build_dir]
enabled = true

3、重启runner

1
gitlab-runner restart

10. 取消注册Runner

1
2
3
4
5
# 查看token
gitlab-runner list
# token还可以在/etc/gitlab-runner/config.toml中查看
# 取消注册runner
gitlab-runner unregister -t $token -u https://gitlab.voidking.com/