症狀:Jenkins Mac Agent 顯示在線,iOS 建置卻卡在工具鏈、依賴或簽名步驟。
最快解法:由 Jenkins 控制器負責調度,Mac Agent 執行 Apple 平台任務;用標籤分派建置、測試與發布,並把生產簽名憑證限制在可信任任務。上線前要用團隊真實流水線逐項驗收,不能只看 Agent 狀態。
這篇適合管理 Jenkins 平台、規劃 Apple 平台 CI 節點的 IT 負責人。
如果你負責 iOS/macOS 流水線,文中會說明如何把建置、測試和發布工作分配給 Mac Agent。
若你要核定發布安全,也可以用文中的驗收條件檢查憑證存取和節點信任邊界。
Jenkins Mac 打包機搭建:先劃清控制器與 Agent 邊界
建議讓 Jenkins 控制器負責排程與管理,Mac Agent 負責執行需要 macOS、Xcode 或 Apple 平台工具鏈的工作。Jenkins 文件說明,Agent 可執行 Pipeline 等工作;標籤可用來表示節點能力,流水線也能依標籤選擇執行節點。這是適合企業評估的架構方式,不代表 Jenkins 規定所有組織都必須採用相同配置。Jenkins Agent 文件與 Pipeline 語法文件說明了節點與標籤的用途。
控制器在線、Agent 在線,分別只能說明管理端和節點之間的連線狀態。它們都不能證明 Xcode 已被正確選取、私有依賴可取得,或簽名工作流程已符合生產要求。把「節點連上了」當成「流水線已通過驗收」,是常見的上線誤判。
普通提交建置:只把必要工作送到 Mac
不用把所有檢查都塞進 Mac 節點。與 Apple 工具鏈無關的程式碼檢查,可由你現有的通用執行環境處理;需要 Xcode 或 macOS 才能完成的建置與測試,再路由到 Mac Agent。這樣能避免不必要的 Mac 工作排隊,也能讓節點用途更清楚。
| 工作類型 | 建議執行環境 | 上線前要確認 |
|---|---|---|
| 與 Apple 工具鏈無關的檢查 | 現有通用執行環境 | 輸入資料、執行工具與產出位置 |
| iOS/macOS 建置 | Mac Agent | Xcode 選擇、工作目錄、專案建置結果 |
| 模擬器測試 | 有相應工具鏈的 Mac Agent | 測試目標、模擬器啟動與測試結果 |
| 正式簽名與發布 | 經核准的可信任節點 | 作業權限、憑證可見範圍與發布產物 |
設定標籤時,名稱應表達節點實際具備的能力,例如 macos-xcode;不要只用團隊名稱或「一般節點」這類無法協助排程判斷的名稱。以下是將建置工作指派給 Mac Agent 的 Declarative Pipeline 範例;實際標籤要與 Jenkins 節點設定一致。
pipeline {
agent none
stages {
stage('Build for Apple platforms') {
agent { label 'macos-xcode' }
steps {
sh 'xcodebuild -version'
sh 'xcodebuild -scheme App -configuration Release build'
}
}
}
}
這段範例只是路由示意,不是可直接套用到所有專案的建置設定。你仍要按實際專案調整 scheme、組態、工作目錄和依賴處理方式。請從真實儲存庫觸發工作,核對流水線是否在預期的 Mac Agent 執行,並檢查產物是否由預期步驟產生。
模擬器測試:把「啟動」和「通過」分開驗收
xcodebuild 等命令列工具隨 Xcode 提供。Apple 的文件也指出,命令列工具的安裝與使用受 Xcode 開發者目錄影響;因此,不能只靠 Agent 的在線狀態判斷工具鏈可用。請參考 Apple 命令列工具安裝說明與 Xcode 命令列工具參考,再到實際 Mac Agent 上確認專案需要的工具與目錄設定。
建議用流水線執行環境本身做檢查,而不是在管理員的互動終端成功後就推定 Agent 也能工作。可在 Jenkins 工作中執行以下命令,再依專案要求呼叫建置或測試任務:
xcode-select -p
xcodebuild -version
xcodebuild -scheme App test
xcodebuild -version 有輸出,不代表專案測試已完成;模擬器能啟動,也不等於測試結果通過。驗收時要分開記錄工具鏈是否可用、目標測試是否執行、測試結果是否成功,以及 Jenkins 是否將失敗狀態正確回報。若 Agent 在線但 xcodebuild 失敗,先比對服務帳號的開發者目錄、Xcode 可用性、工作目錄與依賴,再查專案本身的建置錯誤。
簽名發布:把憑證留給可信任工作
模擬器測試與正式簽名發布有不同的憑證風險。是否需要分成不同實體 Mac,應依團隊的信任模型、作業授權和環境隔離能力決定;至少要分開管理哪些工作可以接觸生產簽名憑證。可透過節點標籤與任務授權限制排程範圍,但標籤只是路由條件,不是完整的安全隔離機制。
Jenkins 的 憑證安全文件提醒,憑證遮蔽不會阻止不可信或惡意的流水線讀取憑證。若使用多分支流水線,也應參照 Jenkins 對 組織資料夾與多分支流水線憑證安全的說明,核對不同分支與作業的存取邊界。
決策條件:
- 若發布程式碼、觸發者與核准流程都屬可信任範圍,且你已驗證該工作只能在允許的節點取得所需憑證,才將正式簽名任務路由到發布節點。
- 若一般提交、外部貢獻或未審核分支可能執行任意流水線程式碼,則不要讓這些工作取得生產憑證;改用不含生產憑證的建置路徑,並另設受控發布流程。
- 若團隊無法證明標籤、任務授權與憑證存取彼此配合,就先不要把節點視為可信任發布環境。待權限邊界確認後,再決定是否共用或分離 Mac 節點。
私有依賴:從 Jenkins 服務帳號驗證網路
私有程式碼倉庫、套件來源和 Apple 服務的存取方式,應由企業網路與安全團隊確認。不要直接複製一份沒有核實的網域或連接埠清單;應依你實際使用的來源、代理伺服器、憑證與網路政策,整理准入需求。
接著以 Jenkins Agent 真正執行工作的服務帳號,分別驗證程式碼簽出、依賴下載和必要服務連線。互動登入的管理員帳號可能有不同的金鑰、代理設定或憑證信任,因此管理員終端成功,不等於流水線執行環境已具備相同存取能力。若工作停在簽出或套件解析階段,先分辨是身份驗證、代理設定、憑證信任,還是儲存庫本身的權限問題。
若你正評估把 Jenkins Agent 放在遠端 Mac 上,請先查看 KVMNODE 公開的 Mac 方案資訊,並逐項核對頁面可確認的環境與交付資料;再以你自己的控制器、網路政策和真實流水線完成驗收。本文不假設特定節點規格、連線方式或成本,也不把未經確認的服務條件當成既定能力。
上線驗收:依實際工作流逐項放行
照以下順序執行,並保留每個步驟的流水線結果與錯誤紀錄,方便平台團隊和安全團隊共同核對:
- 確認控制器只負責排程與管理;需要 Apple 工具鏈的工作會被送到預期的 Mac Agent。
- 以實際 Jenkins 作業檢查 Agent 標籤、工作目錄與執行帳號,確認不是只在管理員終端環境測試。
- 從真實儲存庫執行程式碼簽出與依賴取得,檢查私有倉庫授權、代理設定和憑證信任。
- 執行專案原本的
xcodebuild建置任務,核對 Xcode 工具鏈選擇、建置結果與產物位置。 - 若流水線包含模擬器測試,確認測試目標、測試執行結果與 Jenkins 對成功或失敗狀態的回報。
- 以可信任發布工作驗證簽名與發布路徑,確認非發布作業無法讀取生產憑證。
- 模擬工具鏈錯誤、依賴取得失敗或發布權限不足,檢查錯誤能否被識別、限制與追查。
完成這些檢查後,再依團隊的安全要求決定是否准許節點承接生產工作。若只有 Agent 連線成功,卻沒有通過專案建置、測試、依賴與簽名驗收,就應先維持在非生產用途。
常見問題
怎樣把 iOS 建置工作派給 Jenkins Mac Agent?
在 Jenkins 為具備相應工具的節點設定標籤,再在 Pipeline 中以標籤選擇 Agent。之後用真實專案驗證執行位置、工作目錄、Xcode 選擇和建置結果。標籤負責排程,不會自動安裝工具或修正環境問題。
Agent 在線但 xcodebuild 失敗,先查什麼?
先在 Jenkins 工作中確認 Xcode 與活動開發者目錄,再檢查 Agent 服務帳號的工作目錄、專案依賴、代理設定和憑證信任。不要把管理員終端測試成功當成 Agent 環境已驗證。從實際流水線的第一個失敗步驟開始排查,避免只看最後的錯誤摘要。
模擬器測試和簽名發布要不要用不同 Mac?
這取決於節點隔離能力與憑證信任要求,不宜只用「是否不同主機」作為安全判斷。無論共用或分開,都應限制哪些作業能執行發布工作,並驗證一般建置與未審核分支無法取得生產簽名憑證。
上線前要驗收哪些 Jenkins Mac 工作流?
至少要用實際專案走過程式碼簽出、私有依賴取得、Xcode 建置、模擬器測試和簽名發布,並檢查每個步驟的執行節點與服務帳號。若團隊暫不開放生產簽名,也要驗證一般工作無法取得該憑證,並確認流水線能正確回報失敗。
如果你目前使用通用執行環境處理所有工作,常見代價是 Apple 工具鏈任務無法穩定排程、依賴管理帳號環境,以及發布憑證暴露範圍難以說清。改用經驗收的 Mac 節點能把需要 macOS 的工作交給合適環境,但仍要投入節點維護、權限治理與流水線驗證。若你只在特定專案或發布階段需要 Mac 算力,可評估租用 Mac;先對照 KVMNODE 公開方案頁面可核實的資料,再確認接入條件、權限和真實工作流是否符合團隊要求。若工作長期且負載穩定,或必須直接使用特定實體介面,則應把自購設備也納入比較。