gitlab
的单元测试依赖于gitlab-runner
,gitlab-runner
的作用便是基本gitlab
仓库相关的配置来运行单元测试(包含但不限于)并把单元测试的结果反馈给gitlab
。
所以如果我们跑单元测试的环境是macos
,则需要在一台macos
主机上安装gitlab-runner
;如果我们跑单元测试的环境是ubuntu
,则需要在一台ubuntu
的主机上安装gitlab-runner
。
gitlab-runner
安装完成后,需要将其注册到gitlab
中,这样gitlab
才会对其发起远程的调用。注册命令如下:
sudo gitlab-runner register --url https://yourGitLab.ServerDomainName.com --registration-token yourGitLabToken
但出于某些安全方面的原因,如果我们的gitlab
服务器的证书并不在拟运行单元测试主机的有效验证范围,则会报一个如下错误:
This solves the x509: certificate signed by unknown authority problem when registering a runner.
此时则需要我们在运行注册命令时,手动的为其指定一个有效的证书。
解决方案
gitlab官网专门对这个问题进行了说明。大概就是说我们需要手动的为每个预注册的站点来指定相关的证书。
在https
的访问过程中,浏览器会自动的为我们下载证书并使用 CA 证书进行验证,但gitlab-runner
并不会如此,所以我们需要手动的帮助一下它。
虽然gitlab的官方给出了几种解决方案,但实验证明将下载到的证书注册到操作系统上是最简单的方案。
步骤如下:
获取证书
如果跑gitlab服务的网站的证书就是你申请的,那么你本身就拥有一个crt
证书,可以略过此步,继续往下看。
如果我们并不掌握当前站点的证书,则可以使用openssl
来将获取服务器的crt证书,该操作可以在运行gitlab-runner
的测试机上进行,也可以在自己的电脑上进行:
openssl s_client -showcerts -connect gitlab.example.com:443(修改为你自己的域名及端口) < /dev/null 2>/dev/null | openssl x509 -outform PEM > ~/gitlab.example.com.crt(修改为自己的名字)
如果你不想打命令,也可以借助浏览器来获取,以macos为例:
此时我们得到了一个格式为cer文件,然后我们将转换为pem格式。
双击证书文件,添加到钥匙链:
在钥匙链中找到它, 右键导出:
格式选择pem
最后,再将扩展名.pem直接改成.crt就行了。
总之呢,我们需要的是一个在gitlab
站点上安装的crt
证书。
注册证书
假设我们按上一步的操作拿到了相关站点的证书,并且上传到了运行gitlab-runner
的机器上。
ubuntu
下面,我们以ubuntu
操作系统为例,介绍如何把这个证书全局的安装到操作系统。
$ sudo apt-get install -y ca-certificates
$ sudo cp gitlab.example.com.crt /usr/local/share/ca-certificates/
$ sudo update-ca-certificates
完整日志如下:
yunzhi@yunzhi-virtual-machine:/etc/ca-certificates$ sudo apt-get install -y ca-certificates
[sudo] password for yunzhi:
Reading package lists... Done
Building dependency tree
Reading state information... Done
ca-certificates is already the newest version (20210119~20.04.2).
0 upgraded, 0 newly installed, 0 to remove and 160 not upgraded.
yunzhi@yunzhi-virtual-machine:~$ sudo cp gitlab.example.com.crt /usr/local/share/ca-certificates/
yunzhi@yunzhi-virtual-machine:/usr/local/share/ca-certificates$ sudo update-ca-certificates
Updating certificates in /etc/ssl/certs...
rehash: warning: skipping DigiCert-Global-Root-CA.pem,it does not contain exactly one certificate or CRL
1🥰 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
🥰
是关键,表示成功添加了1个证书。
freebsd
freebsd注册证书比较简单,只需要将crt
文件移到到/usr/local/share/certs/
即可:
root@freebsd-jdk8:/home/panjie # cp yourdomain.crt /usr/local/share/certs/
注册runner
证书添加完成后,便可以自动使用该证书完成注册了:
yunzhi@yunzhi-virtual-machine:~$ sudo gitlab-runner register
Runtime platform arch=amd64 os=linux pid=813430 revision=f188edd7 version=14.9.1
Running in system-mode.
Enter the GitLab instance URL (for example, https://gitlab.com/):
https://gitlab.example.com:8888/
Enter the registration token:
yourGitLabTokenHere
Enter a description for the runner:
[yunzhi-virtual-machine]: ubuntu
Enter tags for the runner (comma-separated):
Enter optional maintenance note for the runner:
Registering runner... succeeded runner=GR134894
Enter an executor: docker-ssh+machine, kubernetes, custom, docker, parallels, ssh, docker-ssh, shell, virtualbox, docker+machine:
至此gitlab-runner x509:
错误便被成功解决掉了。
注册完成后,别忘了运行gitlab-runner start
🙂 。
git clone
gitlab-runner
在运行单元测试时,首要要执行git clone https://xxx
操作,当我们的证书不被认可时(内部主机),还会出现如下错误:
fatal: unable to access 'https://xxxxx.xxx.xxx/yunzhic...': Problem with the SSL CA cert (path? access rights?)
fatal: unable to access 'https://xxx.xxx.xxx/yunzhiclu...': error setting certificate verify locations: CAfile: /home/gitlab-runner/builds/c_SqAx1t/0/yunzhiclub/smart-community.tmp/CI_SERVER_TLS_CA_FILE CApath: none
此时,则可以通过设置环境变量
GIT_SSL_NO_VERIFY
的值为true
的方法来禁用git clone过程中的ssl校验。HTTPS原理和通信流程
gitlab官网:Self-signed certificates or custom Certification Authorities
Ubuntu官方:Installing a root CA certificate in the trust store
禁用git的ssl校验
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。