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 上面跑起來做測試了~