Introducción a CI/CD para Proyectos Swift
El desarrollo moderno de aplicaciones móviles y de escritorio en Swift requiere no solo código de alta calidad, sino también un proceso confiable de integración y entrega. CI/CD (Integración Continua / Despliegue Continuo) es una práctica que permite automatizar la compilación, las pruebas y el despliegue de aplicaciones. Para proyectos Swift, especialmente para iOS y macOS, GitHub Actions es una de las herramientas más convenientes y populares.
En este artículo, recorreremos cómo configurar un pipeline completo de CI/CD para proyectos Swift usando GitHub Actions. Aprenderás a automatizar la compilación, ejecutar pruebas unitarias e incluso enviar la aplicación a TestFlight o a la Mac App Store.
¿Por qué GitHub Actions para Swift?
GitHub Actions proporciona capacidades integradas para trabajar con el ecosistema Apple. A diferencia de servicios de terceros, está completamente integrado con el repositorio y no requiere configuración adicional de plugins. Las principales ventajas son:
- Minutos gratuitos para repositorios públicos (hasta 2000 minutos por mes)
- Acciones listas para Xcode, SwiftLint, CocoaPods y SPM
- Soporte para runners macOS con Xcode preinstalado
- Configuración flexible mediante archivos YAML
Configuración Básica de CI para un Proyecto Swift
Comencemos con un pipeline simple que compile el proyecto y ejecute pruebas en cada push a la rama main o cuando se cree un Pull Request.
Crea un archivo .github/workflows/swift-ci.yml en la raíz del repositorio:
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: Seleccionar versión de Xcode run: sudo xcode-select -s /Applications/Xcode_15.2.app - name: Compilar run: xcodebuild build -scheme MyApp -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 15,OS=17.2' | xcpretty - name: Ejecutar pruebas run: xcodebuild test -scheme MyApp -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 15,OS=17.2' | xcprettyEste flujo de trabajo realiza dos pasos principales: compilar el proyecto y ejecutar pruebas. Observa el uso de xcpretty — una utilidad que formatea la salida de Xcodebuild en un formato legible.
Verificación Adicional de Calidad de Código
Agreguemos análisis estático usando SwiftLint. Esto ayudará a mantener un estilo de código consistente dentro del equipo:
jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: SwiftLint uses: norio-nomura/action-swiftlint@3.2.1 with: args: --strictAhora, en cada commit, el código será verificado contra las reglas de SwiftLint. Si se encuentran violaciones, el flujo de trabajo fallará con un error.
CI/CD Avanzado: Pruebas y Despliegue
Después de la configuración básica, puedes pasar a escenarios más complejos. Consideremos un pipeline que incluya:
- Compilación para múltiples simuladores
- Pruebas con cobertura de código
- Publicación automática en TestFlight (para iOS) o en la Mac App Store
Compilación y Pruebas con Cobertura
Para recopilar datos de cobertura de pruebas, usa la bandera -enableCodeCoverage YES:
jobs: test-coverage: runs-on: macos-latest steps: - uses: actions/checkout@v4 - name: Pruebas con cobertura run: | xcodebuild test \ -scheme MyApp \ -sdk iphonesimulator \ -destination 'platform=iOS Simulator,name=iPhone 15,OS=17.2' \ -enableCodeCoverage YES \ -derivedDataPath Build/DerivedData | xcpretty - name: Subir cobertura a Codecov uses: codecov/cod