GitHub 強制執行自架 Runner 最低版本:代理 CI 上線前檢查

陶瓷馬賽克網際網路將最新 CI runner 送入代理閘道,並把過舊模組引導至升級通道

GitHub Enterprise Cloud 計畫於 2026 年 9 月 25 日開始全面執行自架 Actions runner 最低版本要求。GitHub 表示,當某個更新已發布超過 30 天,仍未升級的 runner 可能失去註冊或執行支援;若發布重大安全更新,工作排隊也可能暫停,直到 runner 完成升級。

對代理工程、瀏覽器自動化、已授權資料收集和區域驗證團隊而言,真正風險是錯誤歸因。過舊 runner 可能無法註冊、持續排隊或無法執行,但監控卻將它記成「代理測試失敗」。實際上,請求可能根本沒有抵達代理閘道。

本次執行改變了什麼

此時間表面向使用 GitHub Enterprise Cloud 的自架 runner,包括 GitHub 公布的雲端執行安排。此特定時間表不包含 GitHub Enterprise Server。

GitHub 將兩個邊界分開:

  • 註冊支援:runner 能否註冊或重新註冊;
  • 執行支援:已連線 runner 能否接收並執行工作。

執行生效後,舊 runner 可能在任一邊界失敗。必須分別記錄排隊、註冊和網路測試執行狀態。只有 runner 接收工作且網路測試輸出明確啟動標記後,才應開始統計代理健康指標。

建立完整 runner 清單

不要只看某個儲存庫中顯示「在線」的 runner。應涵蓋組織、企業、自動擴充、臨時 runner,以及未來可建立 runner 的映像與範本。

至少記錄:

runner_group
runner_name_or_instance_id
runner_version
operating_system_and_architecture
image_or_template_digest
registration_source
last_registration_time
last_job_time
labels
network_zone
proxy_test_role
owner
upgrade_method

檢查安裝腳本、黃金映像、容器映像、機器範本和災難復原副本。只升級正在執行的機器並不足夠,因為自動擴充器可能在五分鐘後重新建立舊版本。

分離 runner 健康與代理健康

加入明確的生命週期標記:

  1. 工作流程進入佇列;
  2. runner 被分配;
  3. 工作啟動;
  4. 代理測試程序啟動;
  5. 抵達代理閘道;
  6. 驗證完成;
  7. 目標斷言完成;
  8. 清理完成。

只有第 5 至第 7 階段描述代理路徑。持續排隊的工作不應降低代理成功率、觸發出口輪替或建立供應商事故。

應為 runner 不受支援、註冊被拒、工作未分配、工具啟動失敗和真實網路故障分別建立錯誤類別,避免污染採購與可靠性資料。

在截止日前找出舊版本

GitHub 提供 runner 版本資訊和稽核證據,包括註冊事件。可以使用適用於儲存庫、組織或企業的檢視,但要注意:註冊記錄只顯示發生過註冊的 runner,未必是全部線上或休眠機器的完整清單。

交叉比較三類來源:

  • 控制平面中的已註冊 runner 清單;
  • 基礎設施清單與自動擴充範本;
  • 最近工作流程實際執行時記錄的 runner 版本。

近期沒有執行工作的 runner 仍可能在容錯移轉時被選中,因此備用池與災備池亦須獨立測試。

升級「生產機器的工廠」

先更新建立 runner 的機制:

  • 安裝與啟動腳本;
  • VM、容器和機器映像;
  • 自動擴充啟動範本;
  • 離線快取的軟體套件;
  • runner 更新所需的網路允許清單;
  • 決定 runner 何時加入標籤群組的健康檢查。

然後替換或升級既有執行個體。新 runner 必須先回報受支援版本,再接收敏感代理憑證或正式網路工作。

不要為了完成升級永久擴大出站存取。應使用核准的成品來源,依組織流程驗證簽章或摘要,並縮小代理繞過規則。NO_PROXY 政策測試可證明升級流量與測試流量均走在預期路徑。

升級後執行代理 CI 金絲雀

在許多叢集中,runner 升級同時會改變基礎映像、憑證、shell 工具、瀏覽器、程式庫或服務設定。全面替換前必須執行低流量金絲雀。

至少測試:

  • runner 註冊與工作領取;
  • Action 啟動及所需執行環境;
  • 代理密鑰注入且記錄不洩漏;
  • 代理閘道和目標網域的 DNS 行為;
  • 實際使用的 HTTP 代理、HTTPS CONNECT 與 SOCKS;
  • 已購買的 IPv4 與 IPv6;
  • 憑證與主機名稱驗證;
  • 黏性和輪替工作階段語義;
  • 回應完整性、取消和有界重試;
  • 成品上傳與清理。

只對自有或明確授權的目標執行。比較舊 runner 與升級 runner 時,保持代理帳號、目標、負載和通過條件不變。

Node 24 Actions 遷移方案可協助區分 JavaScript Action 執行環境、應用程式執行環境與代理行為。

替換期間保護憑證

臨時 runner 應在通過版本與安全狀態檢查後,才接收短期、最小權限憑證。不能將代理密碼、Cookie 或 Token 固化進機器映像。

下線舊執行個體時:

  • 停止分配新工作;
  • 等待進行中工作結束,或安全取消;
  • 撤銷 runner 註冊材料;
  • 刪除臨時代理允許清單;
  • 依政策清除本機工作目錄與診斷成品;
  • 確認執行個體不能從舊快照重新加入。

若除錯記錄洩漏代理憑證,應立即輪替。刪除 runner 並不會讓外洩密鑰失效。

設計仍受支援的回復

回復不能還原至已不受支援的 runner 版本。應保留 runner 仍在支援窗口內的舊基礎設施版本,或保留少量目前版本的已驗證備用池。

建議推進順序:

  1. 一台非正式環境 runner;
  2. 每個網路區域一台正式金絲雀;
  3. 每個標籤群組的 10%;
  4. 一半叢集;
  5. 證據穩定後全面替換。

每個階段比較工作領取延遲、有效結果率、p95 測試耗時、重試放大及每次有效結果成本。若回應驗證下降,僅佇列更快不代表成功。

工作停止時的正確排查順序

若執行日前後工作持續排隊:

  1. 檢查 runner 分配和版本註解;
  2. 確認 runner 可以註冊,且符合所需標籤;
  3. 查看 runner 服務記錄中的更新或相容性錯誤;
  4. 檢查自動擴充器是否正在啟動舊範本;
  5. 只有網路測試實際啟動後,才調查代理 DNS、驗證、通道和出口。

不要透過輪替住宅 IP、擴大並行或更換代理供應商來修復根本沒有執行的工作。這些動作只會增加成本並破壞診斷證據。

就緒檢查清單

  • 已盤點全部 runner 群組、備用池和自動擴充範本。
  • 最新建立的 runner 回報預期的受支援版本。
  • 分別監控註冊支援與執行支援。
  • 佇列失敗不會污染代理成功率。
  • runner 工廠映像與啟動腳本已更新。
  • 離線快取無法重新建立舊 runner。
  • 升級流量遵循核准的網路政策。
  • 代理憑證在狀態檢查後注入,且從不固化進映像。
  • 金絲雀涵蓋 DNS、驗證、通道、TLS、路線與回應完整性。
  • 分別測試 IPv4、IPv6 與必要市場。
  • 取消、清理與成品處理均通過。
  • 回復使用受支援的已驗證 runner 版本。
  • 已下線 runner 無法重新加入,註冊材料已撤銷。

常見問題

本次執行適用於 GitHub Enterprise Server 嗎?

GitHub 公布的 9 月 25 日時間表適用於 GitHub Enterprise Cloud。公告說明 GitHub Enterprise Server 不受此特定變更影響。

安裝超過 30 天的 runner 會同時停止嗎?

規則與更新可用時間以及註冊和執行要求的最低版本有關。應查看目前註解及 API,而非僅憑安裝日期推斷資格。

runner 顯示在線便一定合規嗎?

不一定。在線狀態不能證明後續註冊或執行資格,自動擴充器也可能繼續建立舊版本。必須驗證實際執行版本和來源映像。

是否應改用 GitHub 託管 runner?

這取決於網路存取、資料處理、區域要求和安全政策。託管 runner 可作為暫時診斷對照,但不能取代正式 runner 架構驗證。

上線期間最重要的指標是什麼?

按 runner 版本與網路區域拆分的有效結果率。佇列延遲、執行故障和代理路徑故障必須分別統計。

合規說明

只對自有或明確獲准的系統、帳號、資料與市場執行代理和資料收集檢查。遵守存取控制、隱私要求、目標條款與速率限制。保護 runner 與代理憑證,只保留必要證據,不得使用代理輪替隱藏違規行為。

來源說明:GitHub,《GitHub Actions: Minimum version enforcement timeline for self-hosted runners》,2026 年 6 月 12 日;2026 年 9 月 24 日複核時間表。外部研究位置僅保存在內部營運記錄中。