Swift 项目 CI/CD 简介
\n现代 Swift 移动和桌面应用程序开发不仅需要高质量的代码,还需要可靠的变更集成和交付流程。持续集成(CI)和持续交付(CD)是能够自动化构建、测试和部署应用程序的实践。GitHub Actions 是 GitHub 内置的工具,非常适合运行在 iOS 和 macOS 上的 Swift 项目。
\n在本文中,我们将介绍 Swift CI/CD 的完整配置周期:从基本配置到部署到 App Store 和 TestFlight。您将了解如何加速开发、避免“人为因素”并确保应用程序的稳定性。
\n\nSwift CI/CD 的主要组件
\n在开始配置之前,了解 Swift 项目的流水线包含哪些阶段非常重要:
\n- \n
- 构建 (Build) — 使用 Xcode 或 xcodebuild 编译项目。 \n
- 测试 (Test) — 运行单元测试和 UI 测试。 \n
- 代码检查 (Lint) — 检查代码风格(例如,使用 SwiftLint)。 \n
- 归档 (Archive) — 创建用于部署的 .ipa 或 .app 文件。 \n
- 部署 (Deploy) — 将构建版本发送到 TestFlight 或 App Store。 \n
GitHub Actions 允许您将这些步骤全部整合到一个存储在仓库中的 YAML 文件中。
\n\n为 Swift 配置 GitHub Actions:分步指南
\n\n1. 创建工作流文件
\n在仓库根目录下创建文件夹 .github/workflows 并添加文件 ci.yml:
name: Swift CI/CD\n\non:\n push:\n branches: [ main, develop ]\n pull_request:\n branches: [ main ]\n\njobs:\n build-and-test:\n runs-on: macos-latest\n\n steps:\n - uses: actions/checkout@v4\n\n - name: Select Xcode version\n run: sudo xcode-select -s /Applications/Xcode_15.0.app/Contents/Developer\n\n - name: Build and test\n run: |\n xcodebuild clean test \\\n -project YourApp.xcodeproj \\\n -scheme YourApp \\\n -destination 'platform=iOS Simulator,name=iPhone 15,OS=17.0' \\\n -resultBundlePath TestResults \\\n CODE_SIGNING_ALLOWED=NO\n - name: Upload test results\n uses: actions/upload-artifact@v4\n with:\n name: test-results\n path: TestResults.xcresult\n此工作流在每次推送到 main 和 develop 分支以及拉取请求时触发。它会在搭载 iOS 17 的 iPhone 15 模拟器上执行干净构建并运行所有测试。
\n\n2. 添加代码检查和静态分析
\n为了保持统一的代码风格,添加一个 SwiftLint 步骤:
\n- name: Run SwiftLint\n run: |\n brew install swiftlint\n swiftlint --strict\n如果您使用 SPM(Swift Package Manager),可以通过 swift analyze(Swift 5.9+ 可用)添加静态分析:
- name: Static analysis\n run: swift analyze --strict\n\n3. 配置 CD:部署到 TestFlight
\n为了自动将构建版本交付到 TestFlight,需要证书和签名描述文件。最安全的方法是使用 GitHub Secrets 存储密钥:
\njobs:\n deploy:\n needs: build-and-test\n runs-on: macos-latest\n if: github.ref == 'refs/heads/main'\n\n steps:\n - uses: actions/checkout@v4\n\n - name: Install provisioning profile\n env:\n PROVISIONING_PROFILE: ${{ secrets.PROVISIONING_PROFILE_BASE64 }}\n run: |\n echo "$PROVISIONING_PROFILE" | base64 --decode > ~/Library/MobileDevice/Provisioning\\ Profiles/profile.mobileprovision\n\n - name: Build and archive\n run: |\n xcodebuild archive \\\n -project YourApp.xcodeproj \\\n -scheme YourApp \\\n -archivePath $