CI/CD para proyectos Swift: GitHub Actions de la A a la Z

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción a CI/CD para proyectos Swift

\n

El 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.

\n

En 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\n

Componentes principales de CI/CD para Swift

\n

Antes 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
\n

GitHub Actions permite combinar todos estos pasos en un solo archivo YAML que se almacena en el repositorio.

\n\n

Configuración de GitHub Actions para Swift: guía paso a paso

\n\n

1. Creación del archivo de workflow

\n

Cree en la raíz del repositorio la carpeta .github/workflows y agregue el archivo ci.yml:

\n
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
\n

Este 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\n

2. Adición de linting y análisis estático

\n

Para 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
\n

Si usa SPM (Swift Package Manager), puede agregar análisis estático con swift analyze (disponible en Swift 5.9+):

\n
- name: Static analysis\n  run: swift analyze --strict
\n\n

3. Configuración de CD: despliegue en TestFlight

\n

Para 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:

\n
jobs:\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 $                

Blogs

Book Recommendations