CI/CD 一直一來都是前端和後端共同的話題,因為自動化流程不管是應用在哪個領域用途都是相當大的,會節省相當多的時間和人力,如果結合軟體開發流程,甚至衍生出 DevOps 等等規範,而本篇則是用 GitLab Runner 建立一套 CI 流程。

工具選擇

在選擇工具前,還是先知道我們要做什麼?所以說明一下什麼是 CI/CD

  • CI: Continuous integration 持續集成,程式碼上傳後會自動編譯和測試和靜態檢查等等
  • CD: Continuous delivery 持續交付,CI 確認成功後自動發佈到正式環境

網路上有太多優秀介紹 CI/CD 的文章,這裡只留 GitHub 和 GitLab 的官方解釋

想要為你的產品做一套 CI 流程,考慮因素很多,例如你的程式碼放哪裡?你的產品是網站、App還是服務?專案數量?共同的開發人員數量?金錢預算?
因此其實沒有最佳解,找到適合自己公司或產品才是重要的。
網路上也有相當多的線上服務,例如:Bitrise、TravisCI、CircleCI…

由於這次程式碼的部分是在”自架的 GitLab”上
因此選擇”GitLab Runner”做為搭配
( 如果用公開的 GitLab 實作 CICD 流程,步驟是差不多的 )

安裝 CICD 流程

  1. 找到你的 GitLab Repo > Setting > CI/CD > Runners
  2. 找到 Registration URL 和 Registration token
  1. 有一台實體或虛擬的 CI 機
  2. CI 機執行以下步驟建立 Runner ( 這裡 CI 機是用 macOS 系統 )
    1. 註冊 runner: gitlab-runner register
    2. 輸入 GitLab 的網址
    3. 輸入 Token
    4. 輸入 Description
1
2
3
4
5
6
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
http://ooo.ooo.ooo/ci
Please enter the gitlab-ci token for this runner
vsdvsdvsd_sefefqb_u
Please enter the gitlab-ci description for this runner
[hostname] new-runner
  1. 操作指令啟動或關閉 runner
1
2
3
4
5
6
7
8
9
10
#啟動所有runner
gitlab-runner list
#啟動所有runner
gitlab-runner run
#把所有 process 移除,再重啟 runner (非必要不要使用,通常用在runner卡住或環境變數有異動)
killall gitlab-runner -9 && gitlab-runner run
#顯示Config
cd ~/.gitlab-runner/
ls
cat config.toml
  1. 回到 GitLab Repo > Setting > CI/CD > Runners 就可以設定開啟連動指定 Runner
  1. Repo 也需要新增 .gitlab-ci.yml 就會開始運作,下一篇文章會說明一下 CI 腳本並且提供範例
  1. 程式碼上傳就會開始跑 CI 了,可以在 CI/CD > Pipelines 看結果

CI 機推薦調整事項

  1. 設定Mac的共享連線 => 隨時可以遠端回 CI 機做調整!
    • 終端機連線 ssh user@192.168.000.000
    • Safari 連線 vnc://192.168.000.000
  2. 固定IP設定 => IP 不亂跳!
  3. 避免CI機睡眠
    • 前往 系統偏好設定 => 能源節約器
    • 勾選「避免電腦在顯示器關閉時自動進入睡眠」

CI 機 iOS 環境設定 ( 選用 )

  1. 安裝 Xcode,可使用 Xcodes 下載
  2. 安裝 xcpretty
  3. 安裝 slather
  4. 安裝 cocoapods

其他可能問題

  1. 設定環境語言(解決:invalid byte sequence in US-ASCII (ArgumentError))

    • 輸入指令編輯 bashrc or bash_profile(不一定…似乎跟終端機環境設定有關),不確定的話可以都設定
    1
    2
    sudo vi ~/.bashrc
    sudo vi ~/.bash_profile
    1
    2
    3
    export LANGUAGE=en_US.UTF-8
    export LANG=en_US.UTF-8
    export LC_ALL=en_US.UTF-8