Swift 项目的 CI/CD:配置 GitHub Actions

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Swift 项目的 CI/CD 简介

现代 Swift 移动和桌面应用程序开发不仅需要高质量的代码,还需要可靠的集成和交付流程。CI/CD(持续集成 / 持续部署)是一种能够自动化构建、测试和部署应用程序的实践。对于 Swift 项目,尤其是针对 iOS 和 macOS 的项目,GitHub Actions 是最方便且最流行的工具之一。

在本文中,我们将介绍如何使用 GitHub Actions 为 Swift 项目配置完整的 CI/CD 管道。您将学习如何自动化构建、运行单元测试,甚至将应用程序提交到 TestFlight 或 Mac App Store。



为什么选择 GitHub Actions 用于 Swift?

GitHub Actions 提供了与 Apple 生态系统配合使用的内置功能。与第三方服务不同,它与仓库完全集成,无需额外配置插件。主要优势包括:

  • 免费分钟数适用于公共仓库(每月最多 2000 分钟)
  • 现成的 Actions适用于 Xcode、SwiftLint、CocoaPods 和 SPM
  • 支持 macOS 运行器并预装 Xcode
  • 灵活的配置通过 YAML 文件实现


Swift 项目的基本 CI 配置

我们从简单的管道开始,该管道将在每次推送到 main 分支或创建 Pull Request 时构建项目并运行测试。

在仓库根目录创建文件 .github/workflows/swift-ci.yml:

name: Swift CI

on: push: branches: [ main ] pull_request: branches: [ main ]

jobs: build-and-test: runs-on: macos-latest steps: - uses: actions/checkout@v4 - name: Select Xcode version run: sudo xcode-select -s /Applications/Xcode_15.2.app - name: Build run: xcodebuild build -scheme MyApp -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 15,OS=17.2' | xcpretty - name: Run tests run: xcodebuild test -scheme MyApp -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 15,OS=17.2' | xcpretty

该 workflow 执行两个主要步骤:项目构建和测试运行。请注意使用了 xcpretty——这是一个将 Xcodebuild 输出格式化为可读形式的工具。



额外的代码质量检查

我们使用 SwiftLint 添加静态分析。这将有助于在团队中保持统一的代码风格:

jobs:  lint:    runs-on: ubuntu-latest    steps:    - uses: actions/checkout@v4    - name: SwiftLint      uses: norio-nomura/action-swiftlint@3.2.1      with:        args: --strict

现在每次提交都会检查代码是否符合 SwiftLint 规则。如果发现违规,workflow 将以错误结束。



高级 CI/CD:测试和部署

基本配置完成后,可以转向更复杂的场景。我们考虑一个包含以下内容的管道:

  • 为多个模拟器构建
  • 带代码覆盖率的测试
  • 自动发布到 TestFlight(适用于 iOS)或 Mac App Store


带覆盖率的构建和测试

要收集测试覆盖率数据,请使用 -enableCodeCoverage YES 标志:

jobs:  test-coverage:    runs-on: macos-latest    steps:    - uses: actions/checkout@v4        - name: Test with coverage      run: |        xcodebuild test \          -scheme MyApp \          -sdk iphonesimulator \          -destination 'platform=iOS Simulator,name=iPhone 15,OS=17.2' \          -enableCodeCoverage YES \          -derivedDataPath Build/DerivedData | xcpretty        - name: Upload coverage to Codecov      uses: codecov/cod                

博客

书籍推荐