Introdução ao CI/CD para projetos Swift
\nO desenvolvimento moderno de aplicativos móveis e desktop em Swift exige não apenas código de qualidade, mas também um processo confiável de integração e entrega de mudanças. Continuous Integration (CI) e Continuous Delivery (CD) são práticas que permitem automatizar a compilação, os testes e a implantação de aplicativos. GitHub Actions é uma ferramenta integrada do GitHub que é ideal para projetos Swift que rodam em iOS e macOS.
\nNeste artigo, abordaremos o ciclo completo de configuração de CI/CD para Swift: desde a configuração básica até a implantação na App Store e no TestFlight. Você aprenderá como acelerar o desenvolvimento, evitar o "fator humano" e garantir a estabilidade do seu aplicativo.
\n\nComponentes principais do CI/CD para Swift
\nAntes de prosseguir com a configuração, é importante entender em quais etapas consiste o pipeline para projetos Swift:
\n- \n
- Compilação (Build) — compilação do projeto usando Xcode ou xcodebuild. \n
- Testes (Test) — execução de testes unitários e testes de UI. \n
- Linting (Lint) — verificação do estilo do código (por exemplo, com SwiftLint). \n
- Arquivamento (Archive) — criação do arquivo .ipa ou .app para implantação. \n
- Implantação (Deploy) — envio da compilação para o TestFlight ou App Store. \n
O GitHub Actions permite combinar todas essas etapas em um único arquivo YAML, que é armazenado no repositório.
\n\nConfiguração do GitHub Actions para Swift: guia passo a passo
\n\n1. Criando o arquivo de workflow
\nCrie a pasta .github/workflows na raiz do repositório e adicione o arquivo 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\nEste workflow é executado a cada push para main e develop, bem como em pull requests. Ele realiza uma compilação limpa e executa todos os testes no simulador do iPhone 15 com iOS 17.
\n\n2. Adicionando linting e análise estática
\nPara manter um estilo de código consistente, adicione uma etapa com SwiftLint:
\n- name: Run SwiftLint\n run: |\n brew install swiftlint\n swiftlint --strict\nSe você usa SPM (Swift Package Manager), pode adicionar análise estática com swift analyze (disponível no Swift 5.9+):
- name: Static analysis\n run: swift analyze --strict\n\n3. Configurando CD: implantação no TestFlight
\nPara entrega automática de compilações ao TestFlight, serão necessários certificados e perfis de provisionamento. A maneira mais segura é usar GitHub Secrets para armazenar as chaves:
\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 $