Introducción a CI/CD para proyectos Swift
\nEl desarrollo moderno de aplicaciones móviles y de escritorio en Swift requiere no solo código de calidad, sino también un proceso confiable de integración y entrega de cambios. Continuous Integration (CI) y Continuous Delivery (CD) son prácticas que permiten automatizar la compilación, las pruebas y el despliegue de aplicaciones. GitHub Actions es una herramienta integrada de GitHub que es ideal para proyectos Swift que se ejecutan en iOS y macOS.
\nEn este artículo, analizaremos el ciclo completo de configuración de CI/CD para Swift: desde la configuración básica hasta la implementación en App Store y TestFlight. Aprenderá cómo acelerar el desarrollo, evitar el "factor humano" y garantizar la estabilidad de su aplicación.
\n\nComponentes principales de CI/CD para Swift
\nAntes de pasar a la configuración, es importante entender en qué etapas consiste el pipeline para proyectos Swift:
\n- \n
- Compilación (Build) — compilación del proyecto con Xcode o xcodebuild. \n
- Pruebas (Test) — ejecución de pruebas unitarias y pruebas de UI. \n
- Linting (Lint) — verificación del estilo del código (por ejemplo, con SwiftLint). \n
- Archivado (Archive) — creación del archivo .ipa o .app para el despliegue. \n
- Despliegue (Deploy) — envío de la compilación a TestFlight o App Store. \n
GitHub Actions permite combinar todos estos pasos en un solo archivo YAML que se almacena en el repositorio.
\n\nConfiguración de GitHub Actions para Swift: guía paso a paso
\n\n1. Creación del archivo de workflow
\nCree en la raíz del repositorio la carpeta .github/workflows y agregue el archivo 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 se ejecuta en cada push a main y develop, así como en pull requests. Realiza una compilación limpia y ejecuta todas las pruebas en el simulador de iPhone 15 con iOS 17.
\n\n2. Adición de linting y análisis estático
\nPara mantener un estilo de código uniforme, agregue un paso con SwiftLint:
\n- name: Run SwiftLint\n run: |\n brew install swiftlint\n swiftlint --strict\nSi usa SPM (Swift Package Manager), puede agregar análisis estático con swift analyze (disponible en Swift 5.9+):
- name: Static analysis\n run: swift analyze --strict\n\n3. Configuración de CD: despliegue en TestFlight
\nPara la entrega automática de compilaciones a TestFlight, se necesitarán certificados y perfiles de firma. La forma más segura es usar GitHub Secrets para almacenar las claves:
\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 $