CI/CD para proyectos Swift: GitHub Actions nivel avanzado

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

CI/CD Avanzado para proyectos Swift: optimización de pipelines con GitHub Actions



La automatización de la compilación, las pruebas y el despliegue es una parte esencial del desarrollo moderno de iOS y macOS. Los pipelines básicos de CI/CD resuelven tareas simples, pero en proyectos reales con Swift, Swift Package Manager (SPM), múltiples objetivos y dependencias complejas, se requiere un enfoque avanzado. En este artículo, analizaremos cómo llevar su proceso de CI/CD al siguiente nivel con GitHub Actions, utilizando compilaciones matriciales, optimización del almacenamiento en caché, pruebas paralelas y despliegue automático en TestFlight / App Store.



1. Compilación Matricial (Matrix Builds) para multiplataforma



Una de las capacidades clave de GitHub Actions es la estrategia matricial. Permite ejecutar el mismo workflow con diferentes parámetros (versión de Xcode, esquema de compilación, plataforma). Esto es especialmente útil para proyectos Swift que soportan iOS, macOS, tvOS y watchOS.



Ejemplo de configuración de matriz para un proyecto Swift:



jobs:  build:    strategy:      matrix:        platform: [iOS, macOS, tvOS]        xcode-version: ['15.0', '15.2']        exclude:          - platform: tvOS            xcode-version: '15.0'  # Excluimos combinación incompatible    runs-on: macos-14    steps:      - uses: actions/checkout@v4      - name: Seleccionar Xcode ${{ matrix.xcode-version }}        run: sudo xcode-select -s /Applications/Xcode_${{ matrix.xcode-version }}.app      - name: Compilar para ${{ matrix.platform }}        run: |          xcodebuild clean build \            -scheme MyApp \            -destination "platform=${{ matrix.platform }}" \            CODE_SIGN_IDENTITY="" \            CODE_SIGNING_REQUIRED=NO


Este enfoque permite verificar la compilación en todas las plataformas y versiones de Xcode compatibles con un solo push, ahorrando tiempo al desarrollador.



2. Almacenamiento en caché avanzado: acelera la compilación 2-3 veces



La compilación de proyectos Swift es un proceso que consume muchos recursos. El almacenamiento en caché de las dependencias de SPM y DerivedData puede reducir el tiempo del pipeline en un 50-70%. En lugar de una caché básica, utilice claves personalizadas que tengan en cuenta las versiones de las dependencias.



Caché optimizada para SPM y Xcode:



- name: Cache SPM  uses: actions/cache@v3  with:    path: |      .build      SourcePackages    key: ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }}    restore-keys: |      ${{ runner.os }}-spm-

- name: Cache DerivedData uses: actions/cache@v3 with: path: ~/Library/Developer/Xcode/DerivedData key: ${{ runner.os }}-derived-${{ hashFiles('**/*.swift') }} restore-keys: | ${{ runner.os }}-derived-


Importante: Utilice hashFiles('**/Package.resolved') para invalidar con precisión la caché cuando cambien las dependencias. Para DerivedData, la clave puede ser el hash de todos los archivos Swift; esto garantiza que la caché solo se actualice con cambios reales en el código.



3. Pruebas paralelas y generación de informes



Para proyectos Swift grandes con cientos de pruebas unitarias, la ejecución secuencial puede llevar de 20 a 30 minutos. La solución es dividir las pruebas en grupos y ejecutarlas en paralelo en varios runners.



Implementación de pruebas paralelas:



test:  strategy:    matrix:      test-group: [1, 2, 3, 4]  runs-on: macos-14  steps:    - uses: actions/checkout@v4    - name: Ejecutar pruebas (Grupo ${{ matrix.test-group }})      run: |        xcodebuild test \          -scheme MyApp \          -destination "platform=iOS Simulator,name=iPhone 15 Pro" \          -only-testing:MyAppTests/TestGroup${{ matrix.test-group }} \          CODE_SIGN_IDENTITY="" \          CODE_SIGNING_REQUIRED=NO    - name: Subir resultados de pruebas      if: always()      uses: actions/upload-artifact@v4      with:                

Blogs

Book Recommendations