跳至內容

持續整合 (CI)

註冊表在 CI 上開箱即用,無需任何額外的驗證設定。預設情況下,未經驗證的請求會受到速率限制,每個 IP 地址每分鐘最多 1,000 次請求。

如果你需要更高的速率限制(每分鐘 20,000 次請求),可以透過執行 tuist registry login 進行驗證。這需要設定 TUIST_TOKEN 環境變數。你可以依照文件說明這裡建立專案權杖。

Note

下方的金鑰圈設定僅在你使用 tuist registry login 以取得更高速率限制時才需要。在大多數情況下,預設的未驗證速率限制已足夠,你可以完全略過此步驟。

此外,只有在使用套件的 Xcode 整合功能時,才需要建立新的預先解鎖金鑰圈。

由於 tuist registry login 會將憑證儲存在金鑰圈中,你需要確保在 CI 環境中可以存取該金鑰圈。請注意,某些 CI 供應商或自動化工具(例如 Fastlane)已經會建立臨時金鑰圈,或提供內建方式來建立金鑰圈。不過,你也可以透過以下程式碼建立自訂步驟來建立金鑰圈:

bash
TMP_DIRECTORY=$(mktemp -d)
KEYCHAIN_PATH=$TMP_DIRECTORY/keychain.keychain
KEYCHAIN_PASSWORD=$(uuidgen)
security create-keychain -p $KEYCHAIN_PASSWORD $KEYCHAIN_PATH
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
security default-keychain -s $KEYCHAIN_PATH
security unlock-keychain -p $KEYCHAIN_PASSWORD $KEYCHAIN_PATH

請確保在執行 tuist registry login之前,已建立並解鎖你的預設金鑰圈。

跨環境的增量解析#

使用我們的註冊表時,乾淨/冷啟動解析的速度會稍快一些;如果你在 CI 建置之間持久化已解析的相依性,還能獲得更大的效能提升。請注意,得益於註冊表,你需要儲存和還原的目錄大小比不使用註冊表時小得多,所需時間也顯著減少。若要在預設的 Xcode 套件整合中快取相依性,最佳做法是在透過 xcodebuild 解析相依性時指定自訂的 clonedSourcePackagesDirPath。你可以將以下內容加入 Config.swift 檔案來完成此設定:

swift
import ProjectDescription
let config = Config(
generationOptions: .options(
additionalPackageResolutionArguments: ["-clonedSourcePackagesDirPath", ".build"]
)
)

此外,你还需要找到 Package.resolved 的路徑。你可以執行 ls **/Package.resolved 來取得路徑。路徑看起來應該類似 App.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved。

對於 Swift 套件和基於 XcodeProj 的整合,我們可以使用位於專案根目錄或 Tuist 目錄中的預設 .build 目錄。在設定你的管線時,請確保路徑正確。

以下是一個 GitHub Actions 工作流程範例,用於在使用預設 Xcode 套件整合時解析並快取相依性:

yaml
- name: Restore cache
id: cache-restore
uses: actions/cache/restore@v4
with:
path: .build
key: ${{ runner.os }}-${{ hashFiles('App.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved') }}
- name: Resolve dependencies
if: steps.cache-restore.outputs.cache-hit != 'true'
run: xcodebuild -resolvePackageDependencies -clonedSourcePackagesDirPath .build
- name: Save cache
id: cache-save
uses: actions/cache/save@v4
with:
path: .build
key: ${{ steps.cache-restore.outputs.cache-primary-key }}