在獨佔遠端 Mac CI 運用 Swift 6 嚴格並行 xcodebuild · 工具鏈釘選 · 驗收檢查表

Swift 6strict concurrency 若在本地可過、CI 卻起伏,會削弱團隊信心。常見根因並非業務邏輯,而是 建置設定不一致、DerivedData 競爭、模擬器目的地不同,或把警告當成非阻擋項。本文先列七項痛點,再以對照表整理執行環境,並提供六步 Runbook 與驗收觀點。延伸閱讀:SwiftPM/CocoaPods 與 DerivedData可重現建置指紋自架 runner 與快取分離

01

審查前要看的七個痛點

並行性診斷對時間序列敏感,環境些微差異就會讓失敗散開。

  1. 01

    本機與 CI 的 Swift/Xcode 組合不同:未記錄 swift --versionxcodebuild -version 時,Sendable 診斷連基準都沒有。

  2. 02

    只在釋出前才開嚴格檢查:日常寬鬆、釋出突然加嚴會一次爆出差異,拖延回滾。

  3. 03

    平行 xcodebuild 共用同一 DerivedData:競爭破壞增量編譯,出現與並行無關的大量 clean。

  4. 04

    警告照過、CI 仍顯綠燈:拉高 SWIFT_STRICT_CONCURRENCY 才浮上水面的型態被藏住。

  5. 05

    未規劃 actor 邊界就把 UI 測試與單元測試塞同一工作:模擬器負載與編譯旗標互相干擾,誤判不穩定。

  6. 06

    Runbook 沒寫 xcode-selectTOOLCHAINS 前題:圖形介面切換 Xcode 就能換掉夜間編譯器。

  7. 07

    只在 Linux 跑 swift build、延後驗證 iOS 目標:伺服器目標與 UIKit 目標的診斷集合不同,債務往後堆。

共同點是把「編譯器事實」排除在 CI 不變式之外;獨佔遠端 Mac 較容易用 SSH 當成基礎設施釘死。

02

Xcode Cloud、託管 runner、獨佔遠端 Mac

目標是每次得到相同的診斷集合;快取策略與平行度一變,嚴格模式結果就跟著晃。

維度Xcode Cloud託管 macOS Runner獨佔遠端 Mac(SSH)
工具鏈釘選跟隨受控更新映像標籤與鄰居租客可能造成變動xcode-select 與磁碟版面可寫進合約
嚴格診斷可重現性流程設計良好時偏高共享快取與 CPU 爭搶易晃動DerivedData 依工作切分較直覺
xcodebuild 彈性自訂腳本可能有邊界依管理員政策-destination-derivedDataPath 易固定
典型失敗佇列、額度、步驟邊界只能在乾淨映像重現的依賴缺漏休眠策略、磁碟打滿
適合團隊商店路徑標準化大量短程冒煙測試monorepo 與長時嚴格 gate

「嚴格並行」在 CI 裡也是編譯器與快取的物理配置問題。

把預算與頻寬假設對齊可讀 租賃 SLA 與計費

03

六步 Runbook

  1. 01

    凍結採用 Xcode 並記錄 xcode-select -p

  2. 02

    入口必印 xcodebuild -versionxcodebuild -showsdksswift --version

  3. 03

    對齊 SWIFT_STRICT_CONCURRENCY;模組分階升級寫進變更單。

  4. 04

    傳入固定 -scheme-destination、每工作獨立 -derivedDataPath;SwiftPM 時另切 -clonedSourcePackagesDirPath

  5. 05

    拆開測試層級並把平行上限寫進節點合約。

  6. 06

    驗收檢查表簽核:日誌片段、編譯器版本、嚴格層級、乾淨重現步驟。

bash · CI 範例片段
#!/usr/bin/env bash
set -euo pipefail
xcodebuild -version
xcodebuild -showsdks
swift --version
export DERIVED_DATA="$(pwd)/.derivedData/$CI_JOB_ID"
xcodebuild -scheme "App" \
  -destination 'platform=iOS Simulator,name=iPhone 16' \
  -derivedDataPath "$DERIVED_DATA" \
  build
tips_and_updates

提示:第三方套件若仍為寬鬆模式,請在 README 寫明升級到 complete 的路線圖並分段設 gate。

夜間批次與白天互動帳號分開,可降低工具鏈誤切換。

04

把 strict concurrency 當成設定來讀

模組層級檢查由專案設定與編譯器旗標共同決定;請公開目標矩陣,減少程式碼審查摩擦。

policy

注意:用語與預設細節以使用中 Xcode/Swift 發布說明為準;本文只談營運框架。

MainActor 與資料競爭警告也受模擬器負載影響,效能測試與功能測試日誌應分傳。

05

驗收檢查表與結論

  • 編譯器證跡:至少一組 xcodebuild -versionswift --version 進成品庫。
  • 嚴格層級:各 target 的 SWIFT_STRICT_CONCURRENCY 以表格文件化。
  • 快取隔離:-derivedDataPath 綁工作 ID 等唯一鍵。
  • 重現:乾淨機器或準備腳本得到相同日誌。

僅依賴共用 runner 時,工具鏈漂移與磁碟競爭難以同時壓制,Swift 6 嚴格 gate 容易被誤認為不穩定。NodeMini 雲端 Mac Mini 獨佔租賃適合要把 SSH、磁碟檔位與 7×24 iOS 建置寫成可交接合約的團隊。規格與價格見 Mac Mini 雲端租賃價格,接入與驗收見 雲端 Mac 說明中心(繁中)

上線後建議每週彙總嚴格模式違規趨勢,並連結第三方跟版計畫。

FAQ

常見問題

診斷高度依賴編譯器版本與快取位置,獨佔節點較易固定。價格參考 租賃價格說明

scheme、destination、derivedDataPath,並在設定對齊 strict 層級。流程見 說明中心

Xcode 組建編號、xcode-select、選用 TOOLCHAINS、CI 開頭必跑指令列。方案查 租賃價格說明