logo

鱼肚的博客

Don't Repeat Yourself

安装和配置Gitlab Runner

前言

上节中提到了Gitlab CI执行过程中需要寻找匹配的Runner,这里我们就动手配置下Gitlab Runner。

在开始之前,假设你已经有了:

  1. 一台Linux服务器,已经安装好Docker服务。
  2. 一个有管理权限的Gitlab工程。

如果英文水平不错的话,可参考官方文档:

  1. Install GitLab Runner
  2. Configuring runners in GitLab

下面我讲下我安装和配置Gitlab Runner时的过程:

安装Gitlab Runner

选择安装方式

安装方式有多种,比如使用deb包、rpm包,或者直接下载二进制文件。

为了简便,我用的直接下载二进制包的做法。

一般现在用的都是x64的机器,所以直接下载amd64版本的可执行文件即可。如果是其他架构的,可对应选择其它的版本。

amd64版本的gitlab-runner下载地址为:https://s3.amazonaws.com/gitlab-runner-downloads/master/binaries/gitlab-runner-linux-amd64

可选的其它版本还有:

下载下来之后,会得到一个gitlab-runner-linux-amd64的文件,为它添加可执行权限,并将其移动到一个系统目录中:

1chmod a+x ./gitlab-runner-linux-amd64
2sudo mv ./gitlab-runner-linux-amd64 /usr/local/bin/gitlab-runner
3
4# 添加gitlab runner用户
5sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
6
7# 安装
8sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
9
10# 启动
11sudo gitlab-runner start

之后就可以运行gitlab-runner来测试下效果了。

配置Gitlab Runner

注册Runner到Gitlab项目中

Gitlab服务器与Runner之间的通信,是通过Runner建立的长连接。首先Runner将自身注册进Gitlab服务器中,填好相应的配置,然后在它启动时,会主动地与Gitlab服务器建立连接。Gitlab后续派发任务时,就是通过这个长连接进行。

这个模式的好处是不需要Runner有公网地址,因为它是作为一个客户端的角色存在的,而不是一个服务端。

这个模式会要求Runner将自身的信息注册给Gitlab服务器,下面我们就讲下注册的过程。

打开Gitlab项目控制端,找到CI/CD。

打开项目中的"Settings->CI/CD",一般对应的URL是 <Git服务地址>/<组或用户名>/<项目名>/settings/ci_cd。会看到一个如下的页面:

image-20210104105717232

左侧部分,给出了注册的流程,右侧部分是共享的runner,一般由git管理员指定,设定一个或多个通用的Runner,共享给不同的项目,这里可以忽略。

记住这个图里面的2、3两个步骤中的URL和Token,后面会用到。

在服务器中注册信息

继续回到刚安装好 gitlab-runner 的服务器上,运行下面的命令:

1sudo gitlab-runner register

image-20210104111852520

这时会出现一个提示框Please enter the gitlab-ci coordinator URL,输入上面复制的Git服务器地址,回车即可。

接下来会提示Please enter the gitlab-ci token for this runner:,输入上面复制的Token,回车即可。

接下来就会询问名称Please enter the gitlab-ci description for this runner,随便起一个名字或直接回车均可。

再接下来会提示Please enter the gitlab-ci tags for this runner (comma separated):,这里要输入tag列表,英文逗号分隔,如 build,test,deploy 或 foo,bar等均随意定义即可。这里的tag列表要和.gitlab-ci.yml文件中的tags保持匹配,后面也可以改,这里不确定的话,随便填一两个就行了。

再接下来会让选择runner执行器的类型Please enter the executor: docker, docker-ssh, ssh, docker-ssh+machine, kubernetes, custom, parallels, shell, virtualbox, docker+machine:,可选值就是上面列出的这些。

关于各种executor的区别,可查看官方文档:Executors

简单来说,最常用的executor是docker和shell。它俩的区别是docker类型依赖docker服务,shell直接用服务器当前系统。docker类型的好处是比较安全,shell类型的不安全,相当于在服务器上开了后门,.gitlab-ci.yml中就算配置了rm -rf,也会照单接收,执行不误的。

这里我选择的是docker,这也是为什么一开始配置服务器那里,要安装好docker service。

选择docker之后,还会让输入基础镜像,即每次执行CI任务时,以哪个镜像作为基础镜像,这个就完全看个人需求了。比如说执行环境需要有node.js,那可以使用node镜像,需要python,可用python镜像,需要有docker,可选docker镜像等。比较常见的情况,还是自定义一个镜像,安装上自己需要的各种软件。

到这个步骤之后,Runner就注册成功了,可以在 "Settings->CI/CD"中看到它了。

image-20210104113304896

配置Runner属性

Tags

在上图中,小锁按钮旁边有个编辑按钮。点击它就会进入到这个Runner的详细配置页面。

image-20210104133113393

图中的"Tags"中可以随时更改这个Runner关联的Tag。使它能匹配到不同的job。

Active

同样是在上图中,Active是个复选框,勾除它可以暂时禁用这个Runner。

其它比较重要的属性,就需要在运行Runner的服务器上,修改它的配置文件了。

配置文件路径一般为/etc/gitlab-runner/config.toml,访问它需要提升权限,示例内容为:

1concurrent = 3
2check_interval = 0
3
4[session_server]
5  session_timeout = 1800
6
7[[runners]]
8  name = "foo"
9  limit = 1
10  url = "http://git.mycompnay.com/"
11  token = "af95bc59242a89b4efe24c66332a57"
12  executor = "docker"
13  [runners.custom_build_dir]
14  [runners.docker]
15    tls_verify = false
16    image = "docker"
17    privileged = false
18    disable_entrypoint_overwrite = false
19    oom_kill_disable = false
20    disable_cache = false
21    volumes = ["/cache", "/var/run/docker.sock:/var/run/docker.sock"]
22    shm_size = 0
23  [runners.cache]
24    [runners.cache.s3]
25    [runners.cache.gcs]
26
27[[runners]]
28  name = "bar"
29  limit = 1
30  url = "http://git.mycompany.com/"
31  token = "eeee0ae4851d71fda2fb9d4354fff6"
32  executor = "docker"
33  [runners.custom_build_dir]
34  [runners.docker]
35    tls_verify = false
36    image = "docker"
37    privileged = false
38    disable_entrypoint_overwrite = false
39    oom_kill_disable = false
40    disable_cache = false
41    volumes = ["/cache", "/var/run/docker.sock:/var/run/docker.sock"]
42    shm_size = 0
43  [runners.cache]
44    [runners.cache.s3]
45    [runners.cache.gcs]

这里面的关键属性解释一下:

  1. concurrent是并发数量,代表能并发运行的最大job数量。一般需要限制concurrent的场景,是为了限制资源占用率、或为了保证顺序性。它是一个全局控制。
  2. [[runners]] 每运行一次gitlab-runner register并成功注册,就会在[[runners]]中生成一项记录。代表此runner的配置。
  3. limit是runner内部的并发限制,只有同时满足limit限制和全局concurrent限制时,才能够分配资源给job。
  4. executor、url、token等是注册时就配置的信息,不再赘述。token是处理过的token,和gitlab项目中显示的token不是同一个。
  5. [runners.docker] 当executor是docker的时候,这项配置会生效,代表对Docker runner的配置
  6. [runners.docker] 中的 image 属性是基础镜像
  7. [runners.docker] 中的volumes可用来挂载运行时volume,默认只有"/cache",多加了一个"/var/run/docker.sock"是为了能够在Docker容器内部再继续调用Docker服务。

关于更高级的配置细节,检阅Gitlab的官方文档:https://docs.gitlab.com/runner/configuration/advanced-configuration.html