在上一篇的自架GitLab - 基於Docker的實作中,我們實作了利用Docker建立自架GitLab服務。在CI/CD中,一個用於執行檢測以及佈署任務的Runner/Worker是不可或缺的,那我們要如何為自架的GitLab服務添加Runner呢?
答案很簡單:利用Docker來建立Runner容器並將其註冊至GitLab即可。接下來我們將示範如何實作。
請務必將以下教學中的/path/to/your
前綴更改成讀者自身所設定的位置。
首先,我們可以利用GitLab所提供的gitlab/gitlab-runner
搭配docker-compose
指令來建立GitLab-Runner
容器。
首先,我們修改上一篇中的docker-compose.yml
,將GitLab-Runner
的容器設定加入其中:
這樣我們就可以將gitlab-runner
容器納入devops-net
這個與gitlab-main
容器相同的網路中了。
在修改好設定之後,只需要重新執行docker-compose up -d
更新設定之後,就會產生一個名為gitlab-runner
的容器了。
雖然我們這邊將兩者納入相同的網路之中,但由於我們仍使用實體IP溝通,故在此篇中無法看到基於此設定的一些特點。
在將GitLab-Runner
註冊至GitLab之前,我們需要先取得一組token
用以提供給gitlab-runner register
進行註冊。
首先,先登入自架的GitLab網站,
點擊上方的+
號,建立一個團隊,
在團隊的頁面中,點擊左側面板的CI/CD
選項,進入該設定頁面,
點擊右方的Register a group runner
按鈕,就會跳出一個對話窗,並提供一組Token用以註冊,
請記住這一組Token,稍後將需要使用。
在上一步驟中,我們取得了一組Token,接下來我們將利用該組Token將GitLab-Runner
註冊至上一步中建立的團隊。有兩種作法可以將GitLab-Runner
註冊至GitLab服務。
Docker
要利用Docker註冊GitLab-Runner
到GitLab,需要先建立一個GitLab-Runner
的容器,再利用互動模式輸入相對應的資訊來註冊。讀者可以透過下方的指令啟動一個gitlab-runner
容器。
以互動模式註冊的相應步驟,我們將在Docker-compose
章節一同介紹。
上方的-e CA_CERTIFICATES_PATH=...
以及-e LOCAL_CA_PATH=...
是在使用HTTPS連線時所需要的參數,用以讓gitlab/gitlab-runner
的預設entrypoint
將自簽SSL證書加入容器的信任憑證之中。在使用HTTP連線時,不需要提供此兩項資訊。
Docker-compose
更新docker-compose.yml
在上方章節中,我們介紹了如何利用docker run
指令搭配相應參數來註冊。在本章節我們將介紹如何利用docker-compose
指令的方式來建立並註冊GitLab-Runner
。我們先回顧一下先前我們用以設定GitLab服務的docker-compose.yml
檔案。
我們可以透過在上方的設定中的serviers
部份之下新增一個gitlab-runner
部份,並將相對應的資訊帶入設定之中,用以讓docker-compose
指令能夠依照設定建立一個gitlab-runner
容器。
上方為更新後的docker-compose.yml
,只要在執行一次docker-compose up -d
指令,就能將此容器納入與GitLab服務相同的組成之中。上方的設定中,有一個environment
的部份,是用以將自簽SSL證書的位置以環境變數的方式宣告至容器內,與上一節的-e ...
相同,是為了讓啟動容器時的entrypoint
能自動將我們的證書加入信任憑證之中。
利用互動模式註冊gitlab-runner
在上一步驟,我們利用docker-compose
指令建立了一個gitlab-runner
容器,接下來需要用先前的Token來註冊gitlab-runner
。
GitLab Executer
設定以及相關標籤。
以上就是註冊GitLab-Runner
到GitLab的基本流程了。在完成註冊後,將可以在團隊的CI/CD
頁面看到Runner
的資訊。
在前述的章節中,我們成功的將Runner註冊至GitLab,但還有些事情必須去完成。以GitLab-Runner的Executor來說,有virtualbox
,kubernetes
, custom
, parallels
, ssh
, docker+machone
, shell
以及 docker-ssh+machine
等不同的Executor。
有些Executor是基於實體系統的,我們可以在實體系統中預先設定好Host資訊以及相關憑證信任設定,但如果是像Docker這種容器,本身不一定能夠同步使用實體系統的Host資訊時,又該如何呢?接下來我們將以GitLab Docker Executor
為例,示範如何為GitLab-Runner
所建立的容器添加相關設定以及資訊。
對於GitLab-Runner
的設定修改,都是透過對config.toml
做修改來達成的。只要在相對硬的部份加入正確的設定即可。
在[[runners.docker]]
設定中新增Host設定以及憑證設定
掛載憑證至容器內
為了使新建的容器能夠取用到憑證,我們必須在[[runners.docker]]
設定中用volumes
設定將憑證掛載至容器中的位置。如下所示:
新增Host資訊
為了能讓新建的容器能夠連線至我們自架的gitlab.me
網站,我們可以透過在[[runners.docker]]
設定中新增extra_hosts
資訊,或是直接將network_mode
指定為"host"
模式來讓容器取用實體系統的Host設定。以下是兩種方法的示範:
作法一:新增extra_hosts
資訊
作法二:設定network_mode
在[[runners]]
設定中新增pre_build_script
在上一步驟中,我們將憑證資訊掛載到了容器之中,但還需要一個步驟來讓新建的容器能夠信任憑證。處理方法為在[[runners]]
設定中新增pre_build_script
來讓容器在建立之時執行相關指令來更新憑證信任。這邊我們以基於Ubuntu的容器為範例來示範如何進行設定。
關於GitLab-Runner的自簽憑證設定,可以至GitLab官方教學:link:獲取詳細資訊。
完成上述設定之後,就能夠成功讓GitLab-Runner
新建的容器也能信任我們的自簽憑證以及自定義的網域了。
技術隨筆
DevOps
GitLab
GitLab-Runner
Docker
Docker-compose
HTTPS
HTTP
Self-Host