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(修改為自己的名字)
總之呢,我們需要的是一個在gitlab
站點上安裝的crt
證書。
註冊證書
假設我們按上一步的操作拿到了相關站點的證書,並且上傳到了執行gitlab-runner
的機器上。
ubuntu
下面,我們以ubuntu
作業系統為例,介紹如何把這個證書全域性的安裝到作業系統。
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校驗