在 Synology NAS 上跑 gitlab-runner

| | 0 Comments| 13:45
Categories:

Heresy 自從在去年在工作的環境架設了 GitLab 之後,就開始很認真地在搞 CI/CD 這塊了;而為了自動化流程的需要,目前也有好幾台電腦、都拿來安裝 gitlab-runner 作為接 CI/CD 的工作機了~

由於 Heresy 這邊 CI/CD 的工作基本上都是大量編譯,所以也都是拿比較高檔的電腦來做為 runner;但是這次,因為想要試試看自動將網站的容器佈署到測試機器上,由於負載不會太高,所以才會考慮拿手邊的 Synology DS918+(官網)這台多功能的 NAS 來用。

不過,實際用起來,這才發現…要成功架設到能用的難度好高啊…

下面則是 Heresy 這次試著讓他可以正常運作後,整理的設定方法。


透過 DSM 安裝 Docker

Synology 的 NAS 基本上是以「DiskStation Manager」(DSM、官網)來做為主要的管理介面;而要安裝軟體的話,主要的方法就是透過他的「套件中心」。

由於在「套件中心」中可以直接找到 Docker 的選項,所以要安裝 Docker 基本上算是相當簡單的。


透過 SSH 修改 Docker 的設定

雖然 DSM 的 Docker 安裝好了之後,的確可以馬上開始使用;但是如果是像 Heresy 這邊一樣使用 GitLab 自己建立了非 https 的 Docker Registry 的話,其實理論上是要修改設定、將自己的 Docker Registry 加入「insecure-registries」的。

不過,在 DSM 的 Docker 設定介面裡面,並沒有辦法設定「insecure-registries」

所以如果有這樣的需求的話,則是需要使用 SSH 連進去修改 Docker 的設定檔了。
(在「控制台」的「終端機 & SNMP」裡面可以開啟、設定 SSH 的相關功能)

而 Synology 的系統雖然也是 Linux,但是由於有經過他們一定程度的調整,所以相關的設定和其他系統都不大一樣,所以在設定上又得另外找方法了…

首先,Synology 系統的 Docker 設定檔放在「/var/packages/Docker/etc」,檔名也不叫做「daemon.json」、而是「dockerd.json」;所以如果要修改 Docker 的設定的話,就是要修改「/var/packages/Docker/etc/dockerd.json」這個檔案
(似乎沒有 nano 這類的編輯器,只有 vi 就是另一個問題了…)

Heresy 這邊的設定檔是改成:

{
   "data-root": "/volume1/docker",
   "log-driver": "db",
   "registry-mirrors": [],
   "insecure-registries": [ "example.com:5100" ] }

其中,「data-root」的修改,是讓他改把資料存在 RAID 的磁碟空間上。
而「insecure-registries」則就是要加入自己架設的 Docker Registry 路徑了。

在修改完設定檔案,則是呼叫「synoservice –restart pkgctl-Docker」這個指令、來重新啟動 Docker


使用 SSH 設定 Docker 版的 gitlab-runner

雖然 Synology NAS 採用的是 Linux 系統,也可以開啟 SSH 進去做控制,但是問題是他所採用的系統版本算是經過大幅度地客製化過的,所以和一般 Ubuntu 有相當地不同,所以也沒辦法自行下載官方的 gitlab-runner 來安裝官方文件)。

儘管在 DSM 的 Docker 介面可以快速地建立出 Docker 版的 gitlab-runner,但是透過 DSM Docker 的介面,在設定上卻有一些限制,導致無法完成必要的設定

所以,這邊還是需要使用 SSH、來進行手動的操作。這邊使用的指令,是:

docker run -d --name gitlab-runner --restart always 
  -v /var/run/docker.sock:/var/run/docker.sock 
  gitlab/gitlab-runner:latest

這邊的重點,是要加上 volume mapping,把 /var/run/docker.dock 對應到 gitlab-runner 的容器內,這樣他才可以操作 Docker。

而在容器跑起來之後,則是要再進去,連結到自行架設的 GitLab 網站。這邊可以先在 SSH 中執行:

docker exec -it gitlab-runner bash

以進入剛剛建立的「gitlab-runner」這個容器內,然後就可以執行「gitlab-runner register」(官方文件),一步一步完成設定了~

這邊要注意的是,「executor」的部分應該是要設定成「Docker」;而預設映像檔,也建議直接用 Docker 就好。

而由於 Docker 容器裡面還是要進行 Docker 的操作,所以這邊還需要手動修改 gitlab-runner 的設定檔;這個檔案是容器內的「/etc/gitlab-runner/config.toml」。

在裡面的 [[runners]] 下的 [runners.docker] 中,有一個「volumes」的陣列,裡面本來應該只有「“/cache”」,這邊要把 docker.sock 也加進去。

[["runners"]]
   [runners.docker]
     volumes = ["/var/run/docker.sock:/var/run/docker.sock","/cache"]

基本上大概就是像上面這樣(檔案中還有很多其他東西,這邊都省略了)。

之後,再執行「gitlab-runner restart」重新啟動 gitlab-runner 就可以了。


理論上,這樣修改後應該就可以正常地在 gitlab-runner 裡面去執行 docker 的命令了~

當然,如果是要讓他能動,應該也還有其他方法,在《Building Docker images with GitLab CI/CD》這邊也有提到「docker-in-docker」的方案;不過感覺要弄起來,也不會比較簡單,所以現階段就還是先用這個方法來玩了。

如此一來,就可以在 GitLab CI 腳本裡面,去自動把建立好的 Web Service Docker 在 Synology 的 NAS 上面跑起來做測試了~

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *