GitLab CI部署:Runner部署及遇到的问题
GitLab CI部署:Runner部署及遇到的问题
如果已经对gitlab相当了解,且英文水平较好,可以直接阅读官方的runner安装文档。
安装文档:
Windows:https://docs.gitlab.com/runner/install/windows.html
Linux:https://docs.gitlab.com/runner/install/linux-manually.html
配置说明文档:
总体说明:https://docs.gitlab.com/runner/configuration/
config.toml配置:https://docs.gitlab.com/runner/configuration/advanced-configuration.html
如果对gitlab比较了解且可阅读官方英文说明的,下面的文章可以不继续看了。
1、Gitlab
这是代码管理的基础平台。一般公司都已经安装好了。如果没有,可以自己去下载安装。
2、创建群组及项目
对于Gitlab来说,是通过项目来管理代码的。群组就相当一个项目分类。项目创建好了之后,就会有独立的URL。
在个人电脑安装Git。使用Git clone命令复制代码,然后完成commit,push等操作。在这里不做详细描述。
3、找到项目独立的token
项目界面,左侧菜单,设置—CI/CD,展开“Runner”功能组,找到“手动设置specific Runner”组。
就可以看到Runner指定的URL地址,以及注册令牌(token),例:bzYnp6-39gF7zKqrcbqP
还有最重要的运行器唯一ID号,例:fLYMe3yE,最后编写yml代码时会用到。
4、部署gitlab runner
gitlab runner的window版本,是一个独立的exe文件。
在Gitlab官网可以下载:https://docs.gitlab.com/runner/install/windows.html
下载完成之后,存放在一个文件路径不包含空格、特殊符号的文件夹里。
下载的Gitlab runnber运行程序,名称为:gitlab-runner-windows-amd64.exe
名字太长了,给改短一点:gitlab-runner.exe 放在 D:\demo\GitLab-Runner (示例)目录。
4.1注册
以管理员的方式,打开Windows PowerShell。
cd D:\demo\GitLab-Runner
.\gitlab-runner.exe register
Please enter the gitlab-ci coordinator URL:
这里输入的是步骤3标记的那个地址。
Please enter the gitlab-ci token for this runner:
这里输入的是步骤3标记的token。
Please enter the gitlab-ci description for this runner:
这里输入编译器的描述信息,比如runner服务器名称等。
Please enter the gitlab-ci tags for this runner
runner标记。可以填写多个用,号分隔。非常重要。在CI\CD配置(.gitlab-ci.yml)中,需要指定这个名称。
Please enter the executor
shell
注册runner到系统服务
./gitlab-runner.exe install
使用特定账号注册系统服务
./gitlab-runner.exe install —user ENTER-YOUR-USERNAME —password ENTER-YOUR-PASSWORD
启动runner
./gitlab-runner.exe start
注册完成之后,再通过步骤3,查看token值时,会发现多了一个已运行的运行器。这个运行器的描述里有步骤4输入的runner服务器名称,runner标记等。
一次注册过程的日志如下:
D:\GitLab_CI>.\gitlab-runner.exe register
Runtime platform arch=386 os=windows pid=12744 revision=943fc252 version=13.7.0
Enter the GitLab instance URL (for example, https://gitlab.com/):
http://192.168.1.201:6666/ ## URL地址
Enter the registration token:
bzYnp6-39gF7zKqrcbqP ## 项目对应的 token 标记
Enter a description for the runner:
[CISERVER]: runner_on_ci_server ## runner 描述,随意填,有区分就行
Enter tags for the runner (comma-separated):
tag_check,tag_build,tag_test,tag_deploy ## .gitlab-ci.yml 中定义的几个过程tag
Registering runner... succeeded runner=YyTs5mar
Enter an executor: shell, ssh, virtualbox, docker+machine, docker-ssh+machine, custom, docker, parallels, docker-windows, docker-ssh, kubernetes:
shell ## 配置在cmd中运行
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
D:\GitLab_CI>
Q&A
1、因git仓库使用6666的端口而非gitlab的默认端口,因此需要在[config.toml]文件中设置url
和clone_url
,具体示例如下:
concurrent = 1
check_interval = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "runner_on_ci_server"
url = "http://192.168.1.201:6666/"
clone_url = "http://192.168.1.201:6666/"
token = "bzYnp6-39gF7zKqrcbqP"
executor = "shell"
shell = "powershell"
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
2、在同一CI配置了多个项目的CI流程后(即config.toml文件中存在多个runners任务),GitLab 的CI连续运行时,可能会出现fatal: unable to write new index file
错误
报错信息如下:
Running with gitlab-runner 14.1.0 (8925d9a0)
on runner_on_ci_server_for_proj1 AABBCC
Preparing the "shell" executor
Using Shell executor...
Preparing environment
Running on CISERVER...
Getting source from Git repository
Fetching changes...
Reinitialized existing Git repository in D:/GitLab_CI/builds/AABBCC/0/test/testproj/.git/
Checking out 1cf44cd5 as master...
fatal: unable to write new index file
ERROR: Job failed: exit status 1
此问题发生的实际原因暂时未知,修改GitLab-CI-runner的配置config.toml
中的任务检查间隔check_interval
值可缓解此问题。
check_interval
值的详细配置描述,可查看官方文档 https://docs.gitlab.com/runner/configuration/advanced-configuration.html
此处简要说明如下:
Runner间隔多久去GitLab上检查是否有job
config.toml文件的check_interval字段会决定这个时间间隔,它的默认值是3秒(注意当你把它设为0时依然采用的是默认值3秒,而不是0秒)。要解释它的意义,首先我们先来定义worker,在config.toml文件中定义了很多runner,它们可能executor类型不同,可能注册地址不同,但都是由GitLab Runner这个服务来管理的,为了与GitLab Runner区分开,我们将config.toml文件中定义的runner称为worker。对于不同的worker,worker之间(如worker A ---> worker B)的间隔为check_interval / worker_nums,但是对于worker A本身来说它下次去检查是否有job的时间间隔仍为check_interval。我们再举个简单例子:config.toml定义了3个worker—— worker A, worker B 和 worker C,check_interval采用默认值为3秒,第0秒时worker A会去检查是否有属于自己的job,第1秒时worker B会去检查,第2秒时worker C去检查,第3秒时worker A再检查……这个过程中worker A到worker B的间隔为3 / 3 = 1秒,而对于worker A下次检查job时的时间间隔为check_interval,即3秒。
修改后的config.toml
文件如下
concurrent = 1
check_interval = 6
[session_server]
session_timeout = 1800
[[runners]]
name = "runner_on_ci_server_for_proj1"
url = "http://192.168.1.201:6666/"
token = "bzYnp6-39gF7zKqrcbqP"
executor = "shell"
clone_url = "http://192.168.1.201:6666/"
shell = "powershell"
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
[[runners]]
name = "runner_on_ci_server_for_proj2"
url = "http://192.168.1.201:6666/"
token = "bfdJDF73F-3FDERKIRTP"
executor = "shell"
clone_url = "http://192.168.1.201:6666/"
shell = "powershell"
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]