Introdução ao CI/CD para Projetos Swift
O desenvolvimento moderno de aplicativos móveis e desktop em Swift requer não apenas código de qualidade, mas também um processo confiável de integração e entrega. CI/CD (Continuous Integration / Continuous Deployment) é uma prática que permite automatizar a construção, teste e implantação de aplicativos. Para projetos Swift, especialmente para iOS e macOS, o GitHub Actions é uma das ferramentas mais convenientes e populares.
Neste artigo, vamos abordar como configurar um pipeline CI/CD completo para projetos Swift usando GitHub Actions. Você aprenderá como automatizar a construção, executar testes unitários e até mesmo enviar o aplicativo para o TestFlight ou para a Mac App Store.
Por que GitHub Actions para Swift?
O GitHub Actions oferece recursos integrados para trabalhar com o ecossistema Apple. Ao contrário de serviços de terceiros, ele é totalmente integrado ao repositório e não requer configuração adicional de plugins. As principais vantagens são:
- Minutos gratuitos para repositórios públicos (até 2000 minutos por mês)
- Ações prontas para Xcode, SwiftLint, CocoaPods e SPM
- Suporte a runners macOS com Xcode pré-instalado
- Configuração flexível através de arquivos YAML
Configuração básica de CI para projeto Swift
Vamos começar com um pipeline simples que irá construir o projeto e executar testes a cada push no branch main ou ao criar um Pull Request.
Crie o arquivo .github/workflows/swift-ci.yml na raiz do repositório:
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' | xcprettyEste workflow executa duas etapas principais: a construção do projeto e a execução dos testes. Observe o uso do xcpretty — um utilitário que formata a saída do Xcodebuild em um formato legível.
Verificação adicional de qualidade de código
Vamos adicionar análise estática com SwiftLint. Isso ajudará a manter um estilo de código consistente na equipe:
jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: SwiftLint uses: norio-nomura/action-swiftlint@3.2.1 with: args: --strictAgora, a cada commit, será verificado se o código está em conformidade com as regras do SwiftLint. Se forem encontradas violações, o workflow será encerrado com erro.
CI/CD Avançado: Testes e Deploy
Após a configuração básica, podemos passar para cenários mais complexos. Vamos considerar um pipeline que inclui:
- Construção para múltiplos simuladores
- Testes com cobertura de código
- Publicação automática no TestFlight (para iOS) ou na Mac App Store
Construção e testes com cobertura
Para coletar dados de cobertura de testes, use a flag -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