Gitlab CI/CD 介紹與 Runner 的架設

Kiwi lee
11 min readJul 16, 2020

--

此篇參考[DevOps] Gitlab CI/CDGitLab 的 CI/CD 官方文件 來撰寫。

內容上只簡單帶到 CI/CD 的名詞解釋,及如何架設 GitLab 上的 Runner 。當完成 Runner 後,即可開始撰寫我們的 GitLab CI/CD 的腳本,關於腳本如何編寫,應該是下一篇才會提到。

CI/CD 介紹

基本概念

圖片來源: Cisco Blogs

CI/CD 可拆成三個連續的步驟

  1. Continuous Integration 持續整合
    藉由頻繁的整合,來減輕版本之間差異過大時,會發生的合併困難甚或失敗。在此階段,通常還會加入自動化測試來確保待合併的分支,不會發生功能錯誤。
  2. Continuous Delivery 持續佈署
    在確定程式碼的功能性正常後,會自動因應不同的環境進行相對應的程式檔佈署。佈署完成後,可以進行手動測試驗證。
  3. Continuous Deployment 持續交付
    在已經有相對應的程式檔後,自然就要落地到機器上來正式運行,給客戶們使用啦,這就是這階段的目的。

GitLab 上的 CI/CD 介紹

圖片來源 https://docs.gitlab.com/ee/ci/introduction/

上圖是 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
圖片來源: https://gitlab.com/gitlab-org/gitlab/-/pipelines/166785558
  • 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

$ docerk pull gitlab/gitlab-runner

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

  1. 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
  • 依序輸入相對應的資訊
  1. 輸入你的 GitLab URL。你可以在 Project (sidebar) -> Settings -> Runners -> “Set up a specific Runner manually” 的第二項
  2. 輸入 Gitlab-ci 的 token。同上的第三項
  3. 輸入你想在 GitLab 呈現的 Runner 名稱
  4. 輸入 此 runner 相關的 tag
  5. 輸入 Runner 的啟動,我們用 docker 的,就輸入 “docker“
  6. 輸入你打算使用的 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 list
Runtime 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

--

--

Kiwi lee
Kiwi lee

Written by Kiwi lee

Hi, I'm kiwi, Platform Engineer (SRE, DevOps). Python Engineer. Love art, books, longboard. https://kiwilee-blog.netlify.app/