Swift 6 的 strict concurrency 若在本地可過、CI 卻起伏,會削弱團隊信心。常見根因並非業務邏輯,而是 建置設定不一致、DerivedData 競爭、模擬器目的地不同,或把警告當成非阻擋項。本文先列七項痛點,再以對照表整理執行環境,並提供六步 Runbook 與驗收觀點。延伸閱讀:SwiftPM/CocoaPods 與 DerivedData、可重現建置指紋、自架 runner 與快取分離。
並行性診斷對時間序列敏感,環境些微差異就會讓失敗散開。
本機與 CI 的 Swift/Xcode 組合不同:未記錄 swift --version 與 xcodebuild -version 時,Sendable 診斷連基準都沒有。
只在釋出前才開嚴格檢查:日常寬鬆、釋出突然加嚴會一次爆出差異,拖延回滾。
平行 xcodebuild 共用同一 DerivedData:競爭破壞增量編譯,出現與並行無關的大量 clean。
警告照過、CI 仍顯綠燈:拉高 SWIFT_STRICT_CONCURRENCY 才浮上水面的型態被藏住。
未規劃 actor 邊界就把 UI 測試與單元測試塞同一工作:模擬器負載與編譯旗標互相干擾,誤判不穩定。
Runbook 沒寫 xcode-select/TOOLCHAINS 前題:圖形介面切換 Xcode 就能換掉夜間編譯器。
只在 Linux 跑 swift build、延後驗證 iOS 目標:伺服器目標與 UIKit 目標的診斷集合不同,債務往後堆。
共同點是把「編譯器事實」排除在 CI 不變式之外;獨佔遠端 Mac 較容易用 SSH 當成基礎設施釘死。
目標是每次得到相同的診斷集合;快取策略與平行度一變,嚴格模式結果就跟著晃。
| 維度 | Xcode Cloud | 託管 macOS Runner | 獨佔遠端 Mac(SSH) |
|---|---|---|---|
| 工具鏈釘選 | 跟隨受控更新 | 映像標籤與鄰居租客可能造成變動 | xcode-select 與磁碟版面可寫進合約 |
| 嚴格診斷可重現性 | 流程設計良好時偏高 | 共享快取與 CPU 爭搶易晃動 | DerivedData 依工作切分較直覺 |
| xcodebuild 彈性 | 自訂腳本可能有邊界 | 依管理員政策 | -destination、-derivedDataPath 易固定 |
| 典型失敗 | 佇列、額度、步驟邊界 | 只能在乾淨映像重現的依賴缺漏 | 休眠策略、磁碟打滿 |
| 適合團隊 | 商店路徑標準化 | 大量短程冒煙測試 | monorepo 與長時嚴格 gate |
「嚴格並行」在 CI 裡也是編譯器與快取的物理配置問題。
把預算與頻寬假設對齊可讀 租賃 SLA 與計費。
凍結採用 Xcode 並記錄 xcode-select -p。
入口必印 xcodebuild -version、xcodebuild -showsdks、swift --version。
對齊 SWIFT_STRICT_CONCURRENCY;模組分階升級寫進變更單。
傳入固定 -scheme、-destination、每工作獨立 -derivedDataPath;SwiftPM 時另切 -clonedSourcePackagesDirPath。
拆開測試層級並把平行上限寫進節點合約。
驗收檢查表簽核:日誌片段、編譯器版本、嚴格層級、乾淨重現步驟。
#!/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
提示:第三方套件若仍為寬鬆模式,請在 README 寫明升級到 complete 的路線圖並分段設 gate。
夜間批次與白天互動帳號分開,可降低工具鏈誤切換。
模組層級檢查由專案設定與編譯器旗標共同決定;請公開目標矩陣,減少程式碼審查摩擦。
注意:用語與預設細節以使用中 Xcode/Swift 發布說明為準;本文只談營運框架。
MainActor 與資料競爭警告也受模擬器負載影響,效能測試與功能測試日誌應分傳。
xcodebuild -version 與 swift --version 進成品庫。SWIFT_STRICT_CONCURRENCY 以表格文件化。-derivedDataPath 綁工作 ID 等唯一鍵。僅依賴共用 runner 時,工具鏈漂移與磁碟競爭難以同時壓制,Swift 6 嚴格 gate 容易被誤認為不穩定。NodeMini 雲端 Mac Mini 獨佔租賃適合要把 SSH、磁碟檔位與 7×24 iOS 建置寫成可交接合約的團隊。規格與價格見 Mac Mini 雲端租賃價格,接入與驗收見 雲端 Mac 說明中心(繁中)。
上線後建議每週彙總嚴格模式違規趨勢,並連結第三方跟版計畫。