症狀:Jenkins Mac Agent 顯示在線,iOS 建置卻卡在工具鏈、依賴或簽名步驟。
最快解法:由 Jenkins 控制器負責調度,Mac Agent 執行 Apple 平台任務;用標籤分派建置、測試與發布,並把生產簽名憑證限制在可信任任務。上線前要用團隊真實流水線逐項驗收,不能只看 Agent 狀態。

這篇適合管理 Jenkins 平台、規劃 Apple 平台 CI 節點的 IT 負責人。
如果你負責 iOS/macOS 流水線,文中會說明如何把建置、測試和發布工作分配給 Mac Agent。
若你要核定發布安全,也可以用文中的驗收條件檢查憑證存取和節點信任邊界。

01

Jenkins Mac 打包機搭建:先劃清控制器與 Agent 邊界

建議讓 Jenkins 控制器負責排程與管理,Mac Agent 負責執行需要 macOS、Xcode 或 Apple 平台工具鏈的工作。Jenkins 文件說明,Agent 可執行 Pipeline 等工作;標籤可用來表示節點能力,流水線也能依標籤選擇執行節點。這是適合企業評估的架構方式,不代表 Jenkins 規定所有組織都必須採用相同配置。Jenkins Agent 文件與 Pipeline 語法文件說明了節點與標籤的用途。

控制器在線、Agent 在線,分別只能說明管理端和節點之間的連線狀態。它們都不能證明 Xcode 已被正確選取、私有依賴可取得,或簽名工作流程已符合生產要求。把「節點連上了」當成「流水線已通過驗收」,是常見的上線誤判。

02

普通提交建置:只把必要工作送到 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 執行,並檢查產物是否由預期步驟產生。

03

模擬器測試:把「啟動」和「通過」分開驗收

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 可用性、工作目錄與依賴,再查專案本身的建置錯誤。

04

簽名發布:把憑證留給可信任工作

模擬器測試與正式簽名發布有不同的憑證風險。是否需要分成不同實體 Mac,應依團隊的信任模型、作業授權和環境隔離能力決定;至少要分開管理哪些工作可以接觸生產簽名憑證。可透過節點標籤與任務授權限制排程範圍,但標籤只是路由條件,不是完整的安全隔離機制。

Jenkins 的 憑證安全文件提醒,憑證遮蔽不會阻止不可信或惡意的流水線讀取憑證。若使用多分支流水線,也應參照 Jenkins 對 組織資料夾與多分支流水線憑證安全的說明,核對不同分支與作業的存取邊界。

決策條件:

  • 若發布程式碼、觸發者與核准流程都屬可信任範圍,且你已驗證該工作只能在允許的節點取得所需憑證,才將正式簽名任務路由到發布節點。
  • 若一般提交、外部貢獻或未審核分支可能執行任意流水線程式碼,則不要讓這些工作取得生產憑證;改用不含生產憑證的建置路徑,並另設受控發布流程。
  • 若團隊無法證明標籤、任務授權與憑證存取彼此配合,就先不要把節點視為可信任發布環境。待權限邊界確認後,再決定是否共用或分離 Mac 節點。
05

私有依賴:從 Jenkins 服務帳號驗證網路

私有程式碼倉庫、套件來源和 Apple 服務的存取方式,應由企業網路與安全團隊確認。不要直接複製一份沒有核實的網域或連接埠清單;應依你實際使用的來源、代理伺服器、憑證與網路政策,整理准入需求。

接著以 Jenkins Agent 真正執行工作的服務帳號,分別驗證程式碼簽出、依賴下載和必要服務連線。互動登入的管理員帳號可能有不同的金鑰、代理設定或憑證信任,因此管理員終端成功,不等於流水線執行環境已具備相同存取能力。若工作停在簽出或套件解析階段,先分辨是身份驗證、代理設定、憑證信任,還是儲存庫本身的權限問題。

若你正評估把 Jenkins Agent 放在遠端 Mac 上,請先查看 KVMNODE 公開的 Mac 方案資訊,並逐項核對頁面可確認的環境與交付資料;再以你自己的控制器、網路政策和真實流水線完成驗收。本文不假設特定節點規格、連線方式或成本,也不把未經確認的服務條件當成既定能力。

06

上線驗收:依實際工作流逐項放行

照以下順序執行,並保留每個步驟的流水線結果與錯誤紀錄,方便平台團隊和安全團隊共同核對:

  1. 確認控制器只負責排程與管理;需要 Apple 工具鏈的工作會被送到預期的 Mac Agent。
  2. 以實際 Jenkins 作業檢查 Agent 標籤、工作目錄與執行帳號,確認不是只在管理員終端環境測試。
  3. 從真實儲存庫執行程式碼簽出與依賴取得,檢查私有倉庫授權、代理設定和憑證信任。
  4. 執行專案原本的 xcodebuild 建置任務,核對 Xcode 工具鏈選擇、建置結果與產物位置。
  5. 若流水線包含模擬器測試,確認測試目標、測試執行結果與 Jenkins 對成功或失敗狀態的回報。
  6. 以可信任發布工作驗證簽名與發布路徑,確認非發布作業無法讀取生產憑證。
  7. 模擬工具鏈錯誤、依賴取得失敗或發布權限不足,檢查錯誤能否被識別、限制與追查。

完成這些檢查後,再依團隊的安全要求決定是否准許節點承接生產工作。若只有 Agent 連線成功,卻沒有通過專案建置、測試、依賴與簽名驗收,就應先維持在非生產用途。

07

常見問題

怎樣把 iOS 建置工作派給 Jenkins Mac Agent?

在 Jenkins 為具備相應工具的節點設定標籤,再在 Pipeline 中以標籤選擇 Agent。之後用真實專案驗證執行位置、工作目錄、Xcode 選擇和建置結果。標籤負責排程,不會自動安裝工具或修正環境問題。

Agent 在線但 xcodebuild 失敗,先查什麼?

先在 Jenkins 工作中確認 Xcode 與活動開發者目錄,再檢查 Agent 服務帳號的工作目錄、專案依賴、代理設定和憑證信任。不要把管理員終端測試成功當成 Agent 環境已驗證。從實際流水線的第一個失敗步驟開始排查,避免只看最後的錯誤摘要。

模擬器測試和簽名發布要不要用不同 Mac?

這取決於節點隔離能力與憑證信任要求,不宜只用「是否不同主機」作為安全判斷。無論共用或分開,都應限制哪些作業能執行發布工作,並驗證一般建置與未審核分支無法取得生產簽名憑證。

上線前要驗收哪些 Jenkins Mac 工作流?

至少要用實際專案走過程式碼簽出、私有依賴取得、Xcode 建置、模擬器測試和簽名發布,並檢查每個步驟的執行節點與服務帳號。若團隊暫不開放生產簽名,也要驗證一般工作無法取得該憑證,並確認流水線能正確回報失敗。

如果你目前使用通用執行環境處理所有工作,常見代價是 Apple 工具鏈任務無法穩定排程、依賴管理帳號環境,以及發布憑證暴露範圍難以說清。改用經驗收的 Mac 節點能把需要 macOS 的工作交給合適環境,但仍要投入節點維護、權限治理與流水線驗證。若你只在特定專案或發布階段需要 Mac 算力,可評估租用 Mac;先對照 KVMNODE 公開方案頁面可核實的資料,再確認接入條件、權限和真實工作流是否符合團隊要求。若工作長期且負載穩定,或必須直接使用特定實體介面,則應把自購設備也納入比較。