此篇參考[DevOps] Gitlab CI/CD 及 GitLab 的 CI/CD 官方文件 來撰寫。
內容上只簡單帶到 CI/CD 的名詞解釋,及如何架設 GitLab 上的 Runner 。當完成 Runner 後,即可開始撰寫我們的 GitLab CI/CD 的腳本,關於腳本如何編寫,應該是下一篇才會提到。
CI/CD 介紹
基本概念
CI/CD 可拆成三個連續的步驟
- Continuous Integration 持續整合
藉由頻繁的整合,來減輕版本之間差異過大時,會發生的合併困難甚或失敗。在此階段,通常還會加入自動化測試來確保待合併的分支,不會發生功能錯誤。 - Continuous Delivery 持續佈署
在確定程式碼的功能性正常後,會自動因應不同的環境進行相對應的程式檔佈署。佈署完成後,可以進行手動測試驗證。 - Continuous Deployment 持續交付
在已經有相對應的程式檔後,自然就要落地到機器上來正式運行,給客戶們使用啦,這就是這階段的目的。
GitLab 上的 CI/CD 介紹
上圖是 gitlab 結合 CI/CD 所畫的流程圖。
當 push code 時,gitlab 會收到任務並指派 pipeline ,依序著 Stages 的順序,執行 Stage 裡的 jobs,依照 job 裡面的要求,可能會指派不同的 Runner 來完成 job 。當 Stage 裡有失敗則取消此次的 pipeline,若沒有,則繼續下去直到 pipeline 跑完。
名詞詳細解釋如下:
- Push Code 就是當有人 push 到 remote 並且滿足 CI/CD 的起始條件,gitlab 就會接下去做 CI/CD
- Pipeline 代表著這次要運行的處理鏈,包含著可能有的 Continuous Integration/Continuous Deployment/Continuous Delivery。網頁上會在這邊列出此 pipeline 的 Stage 與其 jobs,以下圖從 Gitlab 的官方專案的某一個 Pipeline 為例,從 Pipeline 可以看到有 Sync, prepare, build-images, fixtures, test 的 Stages,其中可看到 prepare stage 包含了數個 jobs。
說明一個 Pipeline 對應一次的 CI/CD,而 Pipeline 是由有順序的 Stages 所組成的,而各 Stage 有自己的 jobs。當然 Pipeline 也有其他變化性,連結如下:https://docs.gitlab.com/ee/ci/pipelines/#types-of-pipelines
- Stage 代表 Pipeline 在什麼時間點會執行,如果一個 Stage 的 jobs 都成功,會推進到下一個;但若該 Stage 有個 job 失敗,通常 Pipeline 就會停在該 Stage 不會繼續推進。
- Runner 是負責處理 job 的運作者,我們需要先架設好 Runner ,並登記在 Gitlab 上
- job 則代表著要做什麼樣的任務,像是 build/test/deploy 之類的。jobs 可以分散到數個 Runner 來運行。
> 延伸閱讀:08. 踏入 CI/CD 的世界 — 觀念篇https://ithelp.ithome.com.tw/articles/10204538
架設 Runner
Gitlab 提供三種 Runner 的權限
- Shared Runner: 當數個專案的 CI/CD job 都有相同的需求,可以節省為了每一個專案各開一個 Runner ,而導致可能性的閒置。Runner 會根據 Project 正在運行的 job 來挑選接下來要運行的 job ,可避免有某個 Project 過量的 job 導致其他 project 的 job 無法執行,詳細可以參考 fair usage queue。
- Group Runners: 該 Group 下的所有 Project 皆有此 Runner 的權限。採用 FIFO 來處理 jobs
- Specific Runner: 當組織中的多個專案 CI/CD job 需求的環境差很多時,需要採用這個來確保環境的隔離。此 Runner 採用 FIFIO 來處理 jobs
使用 docker 來安裝 gitlab-runner
- 從 dockerhub 拉下 gitlab-runner 的 image
https://docs.gitlab.com/runner/install/docker.html#upgrade-version
$ docerk pull gitlab/gitlab-runner
- 啟動 gitlab-runner 。可以使用 local file system 或者用 docker volumes 來連接設定檔
https://docs.gitlab.com/runner/install/docker.html#install-the-docker-image-and-start-the-container
1. Local file system
$ docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
2. Docker Volumes
# 建立 docker volume
$ docker volume create gitlab-runner-config# 啟動服務並且連接到剛建立的 Docker Volume
$ docker run -d --name gitlab-runner --restart always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v gitlab-runner-config:/etc/gitlab-runner \
gitlab/gitlab-runner:latest
Register Docker Runner
- Register,連結到 Gitlab 做 runner 的註冊。依照上個步驟你所選擇的 local file system / Docker Volume
https://docs.gitlab.com/runner/register/index.html#docker
- Local File System
$ docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register
2. Docker Volumes
$ docker run --rm -it -v gitlab-runner-config:/etc/gitlab-runner gitlab/gitlab-runner:latest register
- 依序輸入相對應的資訊
- 輸入你的 GitLab URL。你可以在 Project (sidebar) -> Settings -> Runners -> “Set up a specific Runner manually” 的第二項
- 輸入 Gitlab-ci 的 token。同上的第三項
- 輸入你想在 GitLab 呈現的 Runner 名稱
- 輸入 此 runner 相關的 tag
- 輸入 Runner 的啟動,我們用 docker 的,就輸入 “docker“
- 輸入你打算使用的 default docker image 。此 docker image 預設會從 docker hub 下載,當然你也可以在 project 的
.gitlab-ci.yml
自行設定 image
- 完成上面步驟就會自動連到 gitlab 網站 (在 Project (sidebar) -> Settings -> Runners )
GitLab Runner 相關的指令
以下只列出部份的 command 做介紹
- list 查看所有的 registered runner
# In docker
$ docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner listRuntime platform arch=amd64 os=linux pid=7 revision=6fbc7474 version=13.1.1
Listing configured runners ConfigFile=/etc/gitlab-runner/config.toml
kiwi-runner-2 Executor=docker Token=HelloIamToken URL=https://xxx.com.tw/
像上面我註冊了一個 name 是 kiwi-runner-2
,token 為 HelloIamToken
,URL 為 https://xxx.com.tw/
。確認 registered runner 的資訊,可以方便我們來 run/unregister/status
- run 運行所有 register 的 runners
- run-single 運行指定的 runners。以下的範例來自 Gitlab 官方
$ docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner run-single \
-u http://gitlab.example.com -t my-runner-token --executor docker --docker-image ruby:2.6
- verify 確認 runner 能否正確的連上 gitlab 。
$ docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner verifyRuntime platform arch=amd64 os=linux pid=6 revision=6fbc7474 version=13.1.1
Running in system-mode.
Verifying runner... is alive runner=HelloIam
如果要移除過期,unregister failed 的 runner ,可加入 --delete
來移除
$ docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner verify --deleteRuntime platform arch=amd64 os=linux pid=8 revision=6fbc7474 version=13.1.1
Running in system-mode.
ERROR: Verifying runner... is removed runner=8RaEjGpN
Verifying runner... is alive runner=r-tpEDig
Updated /etc/gitlab-runner/config.toml
- unregiser 刪除註冊的 runner
# wanna unregister Runner
Name=kiwi-runner-2
Executor docker
Token=HelloIamToken
URL=https://xxx.com.tw/
利用 url/token 來刪除
$ docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner unregister --url https://xxx.com/ --token HelloIa
利用 name 來刪除
$ docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner unregister --name kiwi-runner-2