[教學] 如何使用Gitlab CI來達到自動化測試與佈署

現在開發為了省去人力成本,都會使用自動化測試與自動化佈署,而Gitlab有提供了CI/CD的功能,能夠讓原始碼被commit進repo時會自動執行啟動CI,然後runner會把能夠執行的job抓下來執行並把結果回傳到gitlab,來達到自動化測試與自動化佈署,本篇教學如何設定gitlab ruuner以及讓repo執行ci。

如果還沒有架設Gitlab Server可以參考這篇:[推薦] GitLab安裝與基本設定教學

在安裝Eclipse Che之前需要先確定伺服器上有Docker,如果沒有安裝 請參考 https://docs.docker.com/install/ 依據伺服器作業系統來安裝Docker

安裝完docker後,首先要開始註冊gitlab runner
gitlab runner就是所謂的工作者 會把gitlab CI 上的Job抓下來執行,並且把執行結果回傳到gitlab上

在註冊前要先知道自己gitlab ci的Runner token

如果是全repo共用的token要進入admin頁面並且選Runners頁面

就能找到你網站對應的URL與token

而假如是要註冊對特定repo使用的runner則是進入repo後點選 Setting -> CI/CD 然後點選頁面的Runner

有了URL及token就能開始註冊runner了

gitlab runner並一定要在gitlab server上跑,只要任何連線得到gitlab網站的地方都能夠執行

這樣當有許多Job要執行時可以啟動很多機器來處理

輸入以下指令啟動gitlab runner register (/path/to/config為自己config要存放的位置,後面會用到)

docker run --rm -t -i -v /path/to/config:/etc/gitlab-runner --name gitlab-runner gitlab/gitlab-runner register

接下來要設定一些資料

Please enter the gitlab-ci coordinator URL

輸入剛剛記下的URL

Please enter the gitlab-ci token for this runner

輸入剛剛記下的token (例如上圖的ynyyvTwLVsTLsaf6REHH)

Please enter the gitlab-ci description for this runner

輸入該runner的簡介

Please enter the gitlab-ci tags for this runner (comma separated):

幫這個runner加上tag,這tag會影響到runner要抓哪個工作來執行 (有多個以逗號分開,例如tag1,tag2)

Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:

這邊要輸入runner要用什麼執行,可以依照個人需求修改(這邊以docker為例,因為docker能做的事情非常多)

Please enter the Docker image (eg. alpine:latest):

如果上個問題是寫docker,就會出現這個問題,此設定為當gitlab-ci沒有指定要使用哪個docker image執行的話,預設要用哪個docker-image

接著會顯示如下的訊息表示安裝成功

Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

成功後會在第一步驟中設定的/path/to/config中找到對應的設定檔案

接著就可以啟動runner (注意/path/to/config為設定檔資料夾位置)

docker run -d --name gitlab-runner --restart always \
-v /path/to/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest

這樣子runner就會啟動在背景準備做事情了 在剛剛的runner頁面中就能看到已經註冊的runner

這邊以gitbook repo做示範,如何在commit後自動化build出gitbook

目前repo中gitbook程式的原始碼

此時只要在gitlab的repo中加上一個 .gitlab-ci.yml 設定檔就可以啟用CI了

內容大致如下build_book 為job名稱 可依照用途取不同名稱

其中image為要使用哪個image來執行該job, gitlab-cli需要nodejs環境 ,所以使用node:8.11.3的image

tags則要設定的跟剛剛的runner的tags相同,此job才會被該runner執行,所以如果有不同種類的job可以用tags來區分不同runner執行不同工作

script中為要執行的command (能用的command依所指定的image而有所不同),所在位置為repo的根目錄,這邊示範的指令為安裝gitlab-cli並且build出gitbook

artifacts 則是設定CI跑完的哪些檔案要被留下來,產出的檔案可以在gitlab頁面中下載,因為gitbook預設輸入資料夾為_book所以這個示範的paths設定為_book

當加.gitlab-ci.yml 的commit加上後repo頁面會顯示一個CI正在執行的圖示點藍色圈圈能詳細看到Pipeline狀況

並且能查看目前runner執行狀況

最後成功的話會顯示 如下的畫面

如果gitlab-ci.yml檔案中有設定artifacts,右邊就會有個Job artifacts能夠下載對應的檔案

以上只是一個應用示範,因為runner是使用docker在跑的,任何command都能夠執行,所以可以用它來自動化的執行測試以及佈署相關功能