跳转到内容

持续集成

持续集成 (CI) {#continuous-integration-ci}

Section titled “持续集成 (CI) {#continuous-integration-ci}”

注册表在 CI 上开箱即用,无需任何额外的身份验证设置。默认情况下,未认证的请求按 IP 地址限制为 每分钟 1000 次请求

如果需要更高的速率限制 每分钟 20000 次请求,你可以通过运行 tuist registry login 进行身份验证。这需要设置 TUIST_TOKEN 环境变量。你可以通过按照 此处 的文档创建一个项目令牌。

::: info

只有在需要使用 tuist registry login 来获得更高的速率限制时才需要以下钥匙串设置。在大多数情况下,默认的未认证速率限制是足够的,你可以完全跳过这一步。

此外,只有在使用 Xcode 包集成时才需要创建新的预解锁钥匙串。

:::

由于 tuist registry login 将凭据存储在钥匙串中,你需要确保钥匙串可以在 CI 环境中访问。请注意,一些 CI 提供商或自动化工具(如 Fastlane)已经创建了临时钥匙串或提供了创建钥匙串的内置方法。但是,你也可以通过创建具有以下代码的自定义步骤来创建一个:

Terminal window
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 之前创建并解锁你的默认钥匙串。

跨环境增量解析 {#incremental-resolution-across-environments}

Section titled “跨环境增量解析 {#incremental-resolution-across-environments}”

使用我们的注册表时,清洁/冷解析稍快一些,如果你将解析的依赖项持久化到 CI 构建中,体验会更好。请注意,由于注册表,你需要存储和恢复的目录大小比不使用注册表时小得多,所需时间显著减少。 要在使用默认 Xcode 包集成时缓存依赖项,最好的方法是在通过 xcodebuild 解析依赖项时指定自定义 clonedSourcePackagesDirPath。这可以通过将以下内容添加到你的 Config.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 目录。设置管道时确保路径正确。

以下是在使用默认 Xcode 包集成时解析和缓存依赖项的 GitHub Actions 工作流程示例:

- 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 }}