GitHub 說明,託管 Runner 的每個工作會在新的 Runner 執行個體中執行,工作完成後該執行個體會被棄置。GitHub 託管 Runner 文件因此,本週先按工作流程的程式碼信任度分類:不可信程式碼或需要乾淨執行環境的工作,優先評估託管 Runner;只有在確實需要自訂軟體、內網存取或環境控制,且團隊有能力隔離與維護時,再選自託管 Mac Runner。成本比較也要計入維護與安全工作,不能只看機器使用費。
適合需要為 iOS 或 macOS 建置、測試、簽名流程選 Runner 的開發團隊。
平台工程師可用本文判斷是否值得維護專用 Mac 執行節點。
安全負責人可用下列風險檢查 PR 工作流程、簽名憑據與 Runner 權限。
先按程式碼信任度完成 GitHub Actions macOS Runner 選型
不要先問「託管還是自託管比較快、比較省」。先問每個工作流程會執行什麼程式碼,以及它能接觸哪些資料。
- 只執行受信任分支的內部工作:兩種方案都可評估。若需要特定 Xcode、內網服務或自訂工具,自託管可能更符合需求;若希望減少維護工作,託管通常更簡單。
- 執行外部貢獻者的 pull request:預設當作不可信輸入。託管 Runner 每個工作使用新的執行個體,有助降低跨工作殘留風險;自託管節點則必須證明隔離與清理有效。
- 發布或簽名工作:將它與一般 PR 建置分開設計,只向受信任、受控的發布工作流程提供必要憑據。Runner 類型不會自動替你做好權限隔離。
GitHub 特別提醒,自託管 Runner 可能被工作流程程式碼持續影響;因此,不應將會執行不可信程式碼的工作,派送至含有敏感資料或可存取敏感網路的長期節點。GitHub 自託管 Runner 安全說明也不應把 pull request 一概視為可信:檢查觸發事件、分支來源、工作流程權限,以及工作執行時可讀取的秘密。
注意:「建置成功」不等於「安全隔離成功」。如果工作流程可以讀取簽名憑據、部署權杖或內網資源,先確認執行該工作的程式碼來源,再決定是否提供這些權限。
用四項指標比較兩種執行環境
以下評級是根據官方文件所述的隔離和管理責任,提供選型方向;不是效能測試,也不代表任何方案能自動消除風險。
- 工作之間的隔離
- 託管:較有利。每個工作使用新的 Runner 執行個體,執行後棄置,降低工作區檔案跨工作殘留的機會。
- 自託管:需自行負責。若節點或工作目錄重複使用,前一個工作留下的資料、設定或遭修改的狀態可能影響後續工作。要以可驗證的清理流程處理,而不是只相信工作流程內的刪除指令。
- 環境與軟體控制
- 託管:中等。可選擇官方提供的 Runner 環境,但影像與預載軟體可能更新;請在規劃時查閱託管 Runner 的目前支援與影像資訊,不要把某個 Xcode 或系統版本當成永久規格。
- 自託管:較有利。你可控制安裝的依賴與網路路徑,但也要負責相容性測試、系統更新及故障復原。
- 簽名金鑰和其他憑據
- 託管:較容易縮小節點殘留風險,但如果工作流程將秘密交給不可信程式碼,隔離特性不能替你阻止該程式碼讀取它。
- 自託管:風險由你管理。節點權限、秘密注入方式、磁碟殘留、日誌和遠端存取都要納入威脅模型。
- 維護責任與成本
- 託管:維運負擔較低。仍需核對用量、Runner 支援範圍、工作流程安全和帳單。
- 自託管:控制權較高,責任也較多。機器、系統、Runner 更新、監控、清理、備援和故障處理都由你安排。
把簽名與權限從一般建置工作分開
Apple 應用程式簽名的風險,不只是金鑰存在哪一台 Mac。真正的界線在於:哪些工作能取得憑據、哪些程式碼能執行,以及憑據會留在什麼地方。
你可以依下列方式縮小暴露面:
- 在工作流程中只授予必要的
GITHUB_TOKEN權限;可按工作設定permissions,而不是讓所有工作沿用過大的權限。GitHub 工作流程語法的權限設定 - 將發布憑據與一般 PR 建置分離,只在受信任的發布工作中提供。
- 透過環境保護、審核或部署規則限制敏感工作可在哪些條件下執行。GitHub 環境與部署保護說明
- 檢查工作流程觸發事件。使用
pull_request_target時尤其謹慎:官方文件提醒,若在這類工作流程中不安全地執行貢獻者程式碼,可能暴露存取權限或秘密。安全使用pull_request_target的說明 - 把憑據撤銷、輪替和外洩演練納入程序;只靠「工作完成後刪除檔案」不足以證明金鑰沒有殘留。
先核算自託管的總投入,再比較帳單
託管 Runner 的費用,應依 GitHub 當下公布的計費方式與你實際的 Runner 類型核對;不能將其他平台或舊有費率直接套用。GitHub Actions Runner 計費說明
自託管則用相同統計期間和工作量,逐項核算:
自託管總成本 = 機器使用與折舊 + 電力與網路 + 儲存與備援 + 系統及 Runner 維護工時 + 監控與安全加固 + 故障復原與值守成本
若還要存取內網,補上網路控管、帳號管理和稽核所需投入。若 Mac 節點由其他工作共用,記錄分攤方式;不要把整台機器的費用只算給 CI,也不要把無償工程師時間當成零成本。若你正把雲端 Mac 納入候選方案,也可先查看 VPSSpark 的支援中心資訊,核對服務相關問題與團隊操作需求。
可以用 GitHub 帳單和團隊工時記錄代入公式。缺少真實帳單、使用率或維運工時時,只保留待填變數,不要宣稱自託管一定比較便宜。GitHub 的安全指南也要求把工作流程權限、第三方動作和程式碼來源納入風險檢查,而非只比較執行費用。GitHub Actions 安全使用指南
提醒:自託管節點省下的 Runner 費用,可能轉成更新、監控與故障排除工時。若無法安排固定負責人,這些未列入帳單的工作仍是實際成本。
在決定前完成 Runner 上線檢查
把以下清單逐項勾選。任何一項涉及外部程式碼或簽名憑據、但無法說明控制方式時,先不要讓該工作流程使用正式節點。
- [ ] 列出哪些事件會啟動工作,標明受信任分支與外部 pull request 的差異。
- [ ] 確認每個工作需要的權杖、秘密、內網與部署權限,移除不必要的存取。
- [ ] 在自託管方案中驗證工作完成後,暫存檔、金鑰檔、快取與工作目錄的清理結果。
- [ ] 測試一個不可信輸入的隔離情境,確認它無法讀取其他工作的資料或憑據。
- [ ] 檢查所需 Xcode、相依套件、設備或網路條件,並核對託管 Runner 目前的支援資訊。
- [ ] 按同一工作量整理託管費用與自託管的機器、維護、安全和故障處理成本。
- [ ] 指定 Runner 更新、故障復原、金鑰輪替與安全事件的負責人。
若程式碼來源不可信、團隊沒有專人維護節點,或清理演練仍無法通過,先選託管 Runner。若工作需要內網或固定自訂環境,而且隔離、更新及值守責任都已落實,再試行自託管。
常見決策問題:從隔離、金鑰與成本下手
自託管 Mac Runner 不宜直接執行外部 pull request,尤其是長期使用、留有工作資料或能存取內網的節點。若確實需要執行,必須採用隔離的短生命週期環境、限制權限,並以實際演練證明每次工作後的清理有效。
Apple 簽名金鑰不應提供給一般 PR 建置。把簽名工作限制在受信任的發布流程,使用環境保護和最小權限;選擇託管 Runner 不能取代這些控制,自託管則還須檢查磁碟、日誌及其他可能的憑據殘留。
比較成本時,先取得實際 Runner 帳單、機器使用記錄和維護工時。再將更新、值守、安全加固和故障復原加入同一期間的總額。缺少可追溯資料時,保留公式與待補欄位,不填推測金額。
若你目前依賴自建 Mac,常見代價是節點更新與清理都要自行安排、閒置資源仍可能產生持有成本,故障時也要自己負責復原;但若團隊有穩定負載、硬體控制需求或必須連接實體設備,自購與維護仍可能更適合。對短期測試、臨時建置或需要 Mac 執行環境、但不想先承擔長期維運的團隊,租用 VPSSpark 的 Mac 可先驗證工作流程與環境需求。決定前可透過 VPSSpark 支援資訊查詢服務相關問題,再依你的安全要求評估是否合適。
為 macOS 自託管 Runner 準備專屬雲端環境
VPSSpark 提供 Mac mini M4 雲端主機,適合執行 iOS 與 macOS 建置、測試及簽署工作流程。
可按專案需要選擇 16GB 或 24GB 記憶體配置,並加購儲存空間,讓建置環境更貼合工作負載。