CI/CD pour projets Swift : GitHub Actions niveau avancé

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

CI/CD avancé pour projets Swift : optimisation des pipelines avec GitHub Actions



L'automatisation du build, des tests et du déploiement est une partie essentielle du développement iOS et macOS moderne. Les pipelines CI/CD de base résolvent des problèmes simples, mais dans les projets réels avec Swift, Swift Package Manager (SPM), plusieurs cibles et des dépendances complexes, une approche avancée est nécessaire. Dans cet article, nous allons voir comment faire passer votre processus CI/CD au niveau supérieur avec GitHub Actions, en utilisant des builds matriciels, l'optimisation du cache, les tests parallèles et le déploiement automatique vers TestFlight / App Store.



1. Build matriciel (Matrix Builds) pour la multiplateforme



L'une des fonctionnalités clés de GitHub Actions est la stratégie matricielle. Elle permet d'exécuter le même workflow avec différents paramètres (version Xcode, schéma de build, plateforme). C'est particulièrement utile pour les projets Swift qui prennent en charge iOS, macOS, tvOS et watchOS.



Exemple de configuration matricielle pour un projet Swift :



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


Cette approche permet, en un seul push, de vérifier le build sur toutes les plateformes et versions Xcode prises en charge, économisant ainsi du temps de développement.



2. Mise en cache avancée : accélérer le build de 2 à 3 fois



Le build des projets Swift est un processus gourmand en ressources. La mise en cache des dépendances SPM et de DerivedData peut réduire le temps du pipeline de 50 à 70 %. Au lieu d'un cache de base, utilisez des clés personnalisées tenant compte des versions des dépendances.



Cache optimisé pour SPM et 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-


Important : Utilisez hashFiles('**/Package.resolved') pour une invalidation précise du cache lors des modifications de dépendances. Pour DerivedData, la clé peut être le hash de tous les fichiers Swift — cela garantit que le cache ne sera mis à jour qu'en cas de modifications réelles du code.



3. Tests parallèles et rapports



Pour les grands projets Swift avec des centaines de tests unitaires, une exécution séquentielle peut prendre 20 à 30 minutes. La solution consiste à diviser les tests en groupes et à les exécuter en parallèle sur plusieurs runners.



Implémentation des tests parallèles :



test:  strategy:    matrix:      test-group: [1, 2, 3, 4]  runs-on: macos-14  steps:    - uses: actions/checkout@v4    - name: Run tests (Group ${{ 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: Upload test results      if: always()      uses: actions/upload-artifact@v4      with:                

Blogs

Book Recommendations