在上個章節我們介紹了關於 GitHub Actions 的基礎用法,在這個章節我們將分享什麼是 Self-hosted runners,會有這個議題主要是因為,在後面第三個部分「Robot Framework 結合 Appium 進行 App (Android, iOS) 自動化測試」時,當今天我們的測試需要運行在實體機時,會發現 GitHub Actions 提供的機器是一台遠端的機器,如果我們需要跑我們手上的裝置他是無法連線的,因此這時候我們可以選擇雲服務平台提供的雲裝置,或是自己架設我們的裝置,後者的費用會相對於雲服務平台來中較低,因此實際使用情況大家還是可以依照需求改變。
在前面的章節,我們的 run-on 都是直接借用 GitHub 提供的機器,因此不需要自行架設或是維護裝置,但是其實這個借用是有時間限制的,當額度用完的時候便無法繼續使用,因此如果是有較高頻率運行的夥伴可以考慮這個章節介紹的 GitHub Self-hosted runners,這個便是將 GitHub actions runners 架設在我們自行維護的機器上,如此一來就不需要跟 GitHub 借用機器了,因此是不會產生任何費用的,除了添購機器的成本啦。
當我們使用 GitHub Actions 進行自動化工作流時,可以選擇 GitHub 提供的 GitHub-hosted runners 或自行架設的 Self-hosted runners。這兩者之間有何不同?為什麼我們需要考慮自行架設 Self-hosted runners 呢?
GitHub-hosted Runners 是由 GitHub 提供和管理的運行環境,預先配置了常見的工具和依賴項,因此用戶無需擔心基礎設施的配置和維護。然而,這些運行器有一些限制,如:
相對的,Self-hosted Runners 則是由用戶自行架設和管理的運行環境。這提供了更多的靈活性和控制,如:
使用 Self-hosted Runners 時,有一些使用限制,可以參考以下條列:
這些限制在使用 GitHub Actions 時必須留意,以確保流程順利運行。
GitHub-hosted Runners 由 GitHub 提供並管理,適合快速啟動且無需自定義環境的工作,而 Self-hosted Runners 則允許使用者在自己的伺服器上執行工作,提供更多自定義與資源控制,但需要自行維護基礎設施。選擇哪種運行器應取決於專案需求及資源管理能力。
GitHub-hosted Runners | Self-hosted Runners | |
---|---|---|
運行時間限制 | 是,有時間限制 | 時間的上限較長 |
硬體資源 | 共享資源 | 需要自行添購,為專屬的資源 |
環境自訂 | 限制較多 | 完全可自訂,由於裝置是我們的,因此我們可以先安裝好一些環境設定,讓 workflow 執行時,無需在安裝 |
維護成本 | 無需維護,由 GitHub 提供 | 需要自行維護,成本和複雜度較高 |
安全性 | 由 GitHub 保障的基礎安全性 | 需要自行注意,假設今天用到來路不明的 actions 可能會導致電腦中毒 |
價格 | 免費計劃有資源限制,付費計劃提供更多資源 | 需考慮自有硬體成本及運行維護成本 |
GitHub Self-hosted runners 在架設上是有分層級的,分為以下三個層級:
關於詳細資訊可以參考官方文件:Adding self-hosted runners
在這個區塊我們來探討該如何安裝一個 GitHub Self-hosted Runners!不過是 repository 層級的,如果需要安裝另外兩個層級的,可以參考官方文件:Adding self-hosted runners,由於是要將 GitHub Self-hosted Runners 安裝在我們指定的電腦上,因此我們需要先準備一台電腦,後續的步驟為:
在 workflow 中,我們可能有時候會需要使用到機敏資料,像是第三方工具的金鑰匙,但是因為 workflow 的 yaml 是需要加入版控的,因此我們不可能直接將密碼裸露在 yaml 檔案中,這樣太赤裸危險了,所以我們可以將這些資料放在 GitHub Action 提供的 Secrets 中,方法如下:
${{ secrets.SECRET_NAME }}
的格式來存取這些秘密。在 workflow 的 log 中,GitHub 為了防止機敏資料被洩漏,在輸出時也會自動將機敏資料清除並用 * 號代替,同時在 Github Action Secrets 設定秘密後,即使點選修改也無法看到原先設定的值。
在 GitHub 命名 Secrets 時,必須遵守以下規則:
GITHUB
前綴開頭。我們可以透過 with 或是 env 的方式來抓取 secrets 的資料,當我們將 secrets 寫入 env 後,在 python 我們可以透過 os.getenv()
的方式將 secrets 讀取:
steps:
- name: Hello world action
with: # Set the secret as an input
super_secret: ${{ secrets.SuperSecret }}
env: # Or as an environment variable
super_secret: ${{ secrets.SuperSecret }}
關於 Github Action Secrets 更多詳細資訊,可以參考官方文件:Using secrets in GitHub Actions
GitHub Self-hosted runners 提供了一種靈活且可擴展的 CI/CD 選項,特別適合需要高性能和自訂環境的專案。然而,這也意味著需要自行負責硬體維護和安全配置。透過了解其優勢與挑戰,我們可以更好的決定何時選擇 Self-hosted runners 作為團隊的 CI/CD 解決方案。
希望這篇文章能夠幫助到大家更深入了解 GitHub Self-hosted runners 的架設與應用。如果有任何問題或建議,歡迎在下方留言討論。