Apple 文件列出 post-clone、pre-xcodebuild 和 post-xcodebuild 三個自訂建置腳本階段;各階段職責不同,不能假設它們取得的輸入也相同。Apple 自訂建置腳本說明

症狀:腳本需要第三方服務令牌,卻擔心憑據出現在構建日誌,或其他工作流程也能讀取。
最快解法:普通設定放工作流程環境變數;敏感值標記為 Secret,並只分配給確實需要它的工作流程與任務。若你需要持續保留主機狀態、互動式除錯或額外 macOS 控制,再評估遠端 Mac 建置環境。

適合正在用 Xcode Cloud 執行建置或測試、需要傳入環境設定的獨立開發者。
也適合維護多個工作流程、需要管理共享變數的小型團隊。
若自訂腳本會存取外部服務,本文會帶你檢查憑據暴露風險與驗收方式。

01

配置前:先分清變數、Secret 與檔案

假設 post-xcodebuild 要將建置產物交給外部服務。你把令牌寫進腳本,或為了除錯直接輸出變數,結果日誌可能暴露敏感資料。將變數標記為 Secret 有助於遮蔽日誌中的值,但不代表任何工作流程、觸發來源或腳本都應取得該憑據。

先按用途分類,再決定存放位置:

類型 適合放置的內容 設定與使用時的判斷
工作流程環境變數 非敏感的建置選項、環境名稱或功能開關 僅供指定工作流程使用時,優先採用工作流程層級設定
共享環境變數 多個工作流程確實共用的設定 建立共享變數後仍須確認哪些工作流程獲得指派;「共享」不等於所有流程都該存取
Secret API 令牌、簽署或發佈流程需要的敏感值 使用 Secret 設定,並縮小可使用它的工作流程與任務範圍
憑據檔案 必須以檔案形式交給工具的敏感資料 由安全流程提供,不要把真實憑據提交至程式碼儲存庫

Apple 說明可在 Xcode Cloud 工作流程中設定環境變數,也支援共享變數及預先定義的環境變數。自訂環境變數是你提供給工作流程或腳本的值;預先定義變數則由 Xcode Cloud 提供,兩者不要混為一談。請參考 Xcode Cloud 環境變數參考 核對可用變數與用途。

第二個判斷是變數的可見範圍。若令牌只用於發佈工作流程,就不要因為測試流程也方便而一併指派。若多個流程共用非敏感設定,可考慮建立共享變數;Apple 的共享環境變數設定說明提供了操作依據。

提醒:Secret 的日誌遮蔽不是權限隔離。能執行讀取該值之腳本的人,仍可能透過其他輸出、檔案或外部請求造成暴露;不要把遮蔽功能當作擴大分配範圍的理由。

02

首次設定:選好工作流程範圍

Xcode Cloud 自訂環境變數應在哪裡新增?

先確認變數要提供給哪個工作流程,再依照 Apple 文件所列的目前介面設定。若只有一條發佈流程需要 UPLOAD_TOKEN,將它設在該流程的環境變數範圍,並標記為 Secret。若多條流程共用非敏感的 BUILD_CHANNEL,才考慮使用共享變數。

選項 適用情況 主要優點 需要防範
工作流程環境變數 設定只供單一建置或發佈流程使用 範圍較清楚,容易按任務收窄存取 修改流程時要確認變數仍分配給目標工作流程
共享環境變數 多個工作流程確實需要相同設定 避免在多處重複管理相同設定 共享後仍須審核工作流程指派,不要預設全團隊都需要
預先定義環境變數 腳本需要 Xcode Cloud 提供的工作流程資訊 無須自行重複建立平台已有的值 先核對官方參考,不要猜測名稱或套用自訂變數規則

新增後,檢查工作流程指派、變數是否標記為 Secret,以及團隊成員是否有權編輯該設定。Apple 的工作流程策略與編輯權限說明可協助你把維護權限與日常提交權限分開考量。共享變數只解決重複設定問題,不會自動替你完成存取審核。

多個工作流程如何共用環境設定?

若同一設定確實被測試與發佈流程使用,可透過共享變數管理;接著逐一檢查哪些流程獲得使用權。不要為了減少設定步驟,把發佈憑據一併授予只需執行測試的工作流程。對每個值記錄用途、負責人與需要使用它的流程,日後輪替憑據時也較容易確認影響範圍。

03

首次執行:依建置階段讀取變數

自訂建置腳本應放在符合其工作的階段。Apple 說明建置腳本可在不同階段執行;請依照工作流程參考及自訂建置腳本文件確認目前專案的腳本位置、執行環境與可用資源。

腳本階段 適合的工作 不宜混入的工作
post-clone 檢查檢出後的專案內容、準備後續建置所需資源 需要等建置產物生成後才能執行的上傳
pre-xcodebuild 建置前處理、檢查必要設定或準備建置所需依賴 假設此時已存在尚未生成的構建產物
post-xcodebuild 建置完成後檢查結果或執行符合流程設計的後處理 在缺少必要條件時仍嘗試使用發佈憑據

Xcode Cloud 自訂建置腳本讀不到變數時怎麼查?

從最容易驗證的條件開始,不要先把問題歸因於 Xcode Cloud 故障:

  1. 核對名稱。在 Xcode Cloud 設定與腳本中逐字比對變數名稱;環境變數名稱大小寫不一致時,可能讀取不到預期值。

  2. 確認範圍。檢查變數是否設在目前執行的工作流程,或共享變數是否已指派給該流程。

  3. 確認階段。檢查腳本放置位置,以及該階段是否適合執行這項工作;不同階段不可假設有相同輸入。

  4. 用非敏感值測試。先建立明顯的占位值,例如 TEST_VALUE_DO_NOT_USE,只測試變數是否存在,不要用真實令牌除錯。

  5. 檢查腳本取值方式。在 shell 腳本中以環境變數方式讀取,並在缺值時停止後續動作。例如:

    : "${UPLOAD_TOKEN:?UPLOAD_TOKEN is required}"
    

    這段檢查不會輸出令牌值;錯誤訊息只提示缺少變數。

  6. 檢查構建報告與退出狀態。確認失敗是否發生在變數檢查、建置或上傳階段,並讓缺少必要憑據時的腳本以失敗狀態結束,而不是繼續執行不完整的發佈步驟。

Apple 的環境變數參考也列出 Xcode Cloud 提供的變數;如果你需要的是平台資訊,先核對預先定義變數,再決定是否真的需要新增自訂環境變數。

04

發佈驗收:檢查 Secret、日誌與觸發來源

Xcode Cloud Secret 怎樣降低構建日誌暴露風險?

在測試工作流程中使用非敏感占位值,確認腳本只檢查值是否存在,不會輸出值本身。Apple 的自訂建置腳本文件說明 Secret 與日誌處理方式;你仍應檢查腳本輸出及構建報告,確認沒有把憑據拼接到錯誤訊息、命令列輸出或其他可見內容。若要了解 Xcode Cloud 腳本日誌的回報說明,可參考 Apple 的 Xcode Cloud 日誌文件。

發布前按觸發來源逐項核對,不要只看變數是否已標記為 Secret:

  • 分支變更:這個工作流程是否需要外部服務憑據?若只做編譯或測試,移除不必要的發佈步驟。
  • 拉取請求:確認該工作流程的來源、參與者與權限政策;不要自行假設 Secret 一定可用,或一定會被平台阻止使用。
  • 手動觸發:確認執行者有權啟動該流程,也確認手動執行不會意外進入正式發佈步驟。
  • 正式發佈:僅在確有需要時提供發佈憑據,並檢查腳本失敗後是否會停止,而非帶著不完整結果繼續。

Apple 的工作流程策略文件可作為權限規劃的參考。不同專案的工作流程與團隊權限設定可能不同,因此應以你目前的設定及官方文件為準,不要把日誌遮蔽推論成憑據只能由特定觸發者使用。

05

長期維護:判斷雲端工作流程是否足夠

Xcode Cloud 適合依工作流程執行建置與測試;是否足以承擔你的全部維運需求,則要看你需不需要持續保留工作區、互動式除錯,或調整工作流程未提供的主機環境。Apple 的技術說明 TN3129提醒開發者留意 Xcode Cloud 的建置環境與輔助工具問題。排查時要區分腳本錯誤、環境條件與工具本身的限制,不要預設平台必然不適用,也不要假設每種主機控制需求都能由工作流程取代。

你可以按以下條件決策:

  • 繼續使用 Xcode Cloud:建置、測試與發佈步驟可由工作流程重現,且不依賴人工維持的主機狀態。
  • 調整腳本與權限:目前問題來自變數範圍過寬、缺值時未停止,或腳本放錯執行階段。
  • 評估遠端 Mac:你需要長期保留工作狀態、互動式排查,或對 macOS 主機有額外控制需求。先確認實際建置方式、資料存放與權限要求,再比較是否適合增加一個獨立環境。

遠端 Mac 不是每個 Xcode Cloud 專案都必須增加的環節;若你只需要由工作流程完成可重現的建置,先把變數與憑據權限整理好即可。若工作流程因短暫環境而難以保留除錯狀態,或你需要更直接地控制 macOS 建置主機,可進一步查看 KVMNODE 的遠端 Mac 方案資訊,核對現行服務資料是否符合你的環境需求;也可從 KVMNODE 的服務頁面了解可查證的服務內容。

相較之下,單靠目前的雲端工作流程,可能不便保留持續的工作區、互動式追查偶發問題,也未必能提供你需要的系統層級控制。若這些限制已經影響排障或建置重現,租用遠端 Mac 可作為補充方案;若你重視穩定使用同一個可控制的 macOS 環境,KVMNODE 的遠端 Mac 值得納入評估。先按自己的工作流程確認需求,再決定是否增加這條建置路徑。