Passer à la navigation principale

Automatic Capacitor Android build with GitHub actions

Comment configurer une chaîne d'intégration/continu pour votre application Android Capacitor à l'aide de fastlane et des actions GitHub en 5 minutes

Crédits de l'article

Martin Donadieu

Auteur

Valeria

Relecteur

Jordan

Éditeur

Automatic Capacitor Android build with GitHub actions

Configurer la CI/CD pour les applications Capacitor peut être complexe et chronophage. Voici ce dont vous avez besoin de savoir :

Nous recommandons maintenant d'utiliser Capgo Build avec le Capgo CLI pour les constructions natives Capacitor. Cette guide Fastlane est conservé pour les équipes qui maintiennent des pipelines d'actions GitHub existants, mais les nouvelles constructions Android devraient utiliser le Capgo CLI afin que vous ne deviez pas maintenir Fastlane, les exécutants Gradle, les clés de stockage et les scripts d'envoi vous-même.

Prérequis

Avant de commencer, vous devrez configurer :

  • Un compte GitHub avec un accès administrateur
  • Votre application déjà publiée sur Google Play Store avec un signe approprié
  • Clé de signature Android et fichiers de clés de stockage
  • Projet Google Cloud Console avec le magasin Play API activé
  • Compte de service avec les permissions appropriées
  • Compréhension des workflows d'GitHub Actions
  • Connaissance de la configuration de Fastlane
  • Temps pour maintenir et déboguer la pipeline

Capgo Build pour CI/CD par Capgo

Évitez la maintenance de Fastlane, du runner Gradle, du keystore et de l'upload-script. Capgo Build exécute des builds natifs Android signés à partir de votre pipeline CI/CD existant :

  • Compatibilité avec votre pipeline: Déclenchez Capgo Build à partir d'GitHub Actions, GitLab CI, Jenkins ou scripts locaux après votre build web et npx cap sync.
  • Signature à partir de secrets CI: Gardez les clés Android, les alias de clés, les mots de passe et le JSON du compte de service de la console Google Play dans vos propres secrets CI.
  • No runner natif à entretenir: Capgo Build fournit des environnements de construction Android maintenus, vous n'avez donc pas à gérer les SDK images, les problèmes de cache Gradle ou les voies de Fastlane.
  • Artéfacts et soumission: Téléchargez les artefacts signés pour les tests ou soumettez des builds de version finale à travers le Capgo CLI.

Tarifs

  • Plans Capgo commencent à 12 $/mois
  • Inclut les mises à jour OTA et environ 15 constructions natives par mois
  • Les minutes de construction supplémentaires sont facturées par minute par crédits

Configurez Capgo Build dans CI/CD

Guide de configuration manuel

Ici est ce que vous devez faire :

Tarifs GitHub Actions

Coût d'action GitHub

GitHub Actions offre des minutes gratuites en fonction du type de votre dépôt :

  • Les dépôts publics : 2 000 minutes/mois
  • Les dépôts privés : 2 000 minutes/mois (exécutants Linux)

Pour les projets privés, les coûts sont d'environ 0,008 $ la minute. Une construction typique prend 3 à 5 minutes.

Étapes de configuration manuelle

  1. Créer un clé de stockage Android
  2. Configurer un compte de service Google Play
  3. Configurer Fastlane
  4. Configurer les secrets GitHub
  5. Créer un flux de travail GitHub Actions

1. Créer une clé de stockage Android

Avant de pouvoir signer et publier votre application Android, vous devez créer un fichier de clé de stockage. C'est une configuration unique.

Générez clé de stockage avec keytool

Exécutez cette commande dans votre terminal :

keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

Vous serez invité à saisir :

  • Mot de passe de clé de stockage: Choisissez un mot de passe fort (vous en aurez besoin comme KEYSTORE_STORE_PASSWORD)
  • Mot de passe de clé: Choisissez un mot de passe fort (vous en aurez besoin comme KEYSTORE_KEY_PASSWORD)
  • Votre nom, votre organisation, etc.: Remplissez vos informations

Notes importantes

  • Enregistrez ces valeurs de manière sécurisée:

    • Emplacement du fichier de clé de stockage (par exemple, my-release-key.keystore)
    • Alias de clé (par exemple, my-key-alias) - vous aurez besoin de cela comme KEYSTORE_KEY_ALIAS
    • Mot de passe de clé de stockage - vous aurez besoin de cela comme KEYSTORE_STORE_PASSWORD
    • Mot de passe de clé - vous aurez besoin de cela comme KEYSTORE_KEY_PASSWORD
  • Sauvegarder le fichier de clé de stockage: Si vous le perdez, vous ne pourrez pas mettre à jour votre application publiée

  • Le gardez secret: Ne jamais commiter le fichier de clé de stockage dans git

  • Le stockez en toute sécurité: Gardez plusieurs sauvegardes dans des emplacements sécurisés

Alternative : Utiliser une Clé de Stockage Existant

If vous avez déjà publié votre application, vous devez utiliser le même coffre-fort que vous avez utilisé initialement. Vous pouvez le trouver :

  • Sur votre machine locale où vous avez construit l'application pour la première fois
  • Dans votre Console Google Play → Paramètres → Signature de l'application (si vous utilisez la signature de l'application Google Play)

2. Configurez le compte d'utilisateur de Google Play

Pour permettre aux GitHub Actions d'uploader des builds sur Google Play, vous avez besoin d'un compte d'utilisateur.

Étape 2.1 : Créez un projet Google Cloud

  1. Allez à Console Google Cloud
  2. Créez un nouveau projet ou sélectionnez un projet existant
  3. Notez l'ID du projet

Étape 2.2 : Activez le développeur de Google Play API

  1. Dans la Console Google Cloud, allez à APIs & ServicesBibliothèque
  2. Recherchez « Développeur Android Google Play API »
  3. Cliquez Activer

Étape 2.3 : Créer un compte d'exploitation

  1. Allez à IAM & AdminComptes d'exploitation
  2. Cliquez Créer un compte d'exploitation
  3. Entrer les détails :
    • Nom : github-actions-uploader
    • Description : « Compte de service pour les GitHub Actions d'upload des builds »
  4. Cliquez Créer et Continuer
  5. Passer la mise en relation de rôle pour l'instant (cliquez Continuer, puis Terminé)

Étape 2.4 : Créer la clé du compte de service

  1. Cliquez sur le nouveau compte de service créé
  2. Allez à Clés onglet
  3. Cliquez Ajouter une cléCréer une nouvelle clé
  4. Choisissez format JSON Cliquez
  5. Créer Un fichier JSON téléchargera -
  6. sauvegardez ceci de manière sécurisée vous en aurez besoin plus tardonglet

Étape 2.5 : Accorder l'accès dans le console Google Play

  1. Allez à Google Play Console
  2. Allez à ConfigurationAPI access
  3. Sous Comptes de serviceCliquez Accorder l'accès pour votre compte de service
  4. Sur le Permissions de l'application Onglet, ajoutez votre application
  5. Sur l'onglet Permissions de compte Onglet, accordez ces permissions :
    • Afficher les informations de l'application et télécharger des rapports de masse (lecture seule)
    • Créer, modifier et supprimer des applications de brouillon
    • Publier des applications sur des pistes de test
    • Publier des applications sur production, exclure et autres pistes
  6. Cliquez Inviter un utilisateur
  7. Cliquez Envoyer une invitation

Étape 2.6 : Vérifiez la clé JSON

Le fichier JSON téléchargé devrait ressembler à ceci :

{
  "type": "service_account",
  "project_id": "your-project-id",
  "private_key_id": "...",
  "private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n",
  "client_email": "github-actions-uploader@your-project-id.iam.gserviceaccount.com",
  "client_id": "...",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "..."
}

Vous convertirez cela en base64 dans l'étape de configuration des secrets GitHub.

3. Configurer Fastlane

Créez un fastlane dossier à votre racine de projet et ajoutez un Fastfile contenant le contenu suivant :

default_platform(:android)

KEYSTORE_KEY_ALIAS = ENV["KEYSTORE_KEY_ALIAS"]
KEYSTORE_KEY_PASSWORD = ENV["KEYSTORE_KEY_PASSWORD"]
KEYSTORE_STORE_PASSWORD = ENV["KEYSTORE_STORE_PASSWORD"]

platform :android do
    desc "Deploy a beta version to the Google Play"
    private_lane :verify_changelog_exists do |version_code: |
      changelog_path = "android/metadata/en-US/changelogs/#{version_code}.txt"
      UI.user_error!("Missing changelog file at #{changelog_path}") unless File.exist?(changelog_path)
      UI.message("Changelog exists for version code #{version_code}")
    end

    private_lane :verify_upload_to_staging do |version_name: |
      UI.message "Skipping staging verification step"
    end
    
    lane :beta do
        keystore_path = "#{Dir.tmpdir}/build_keystore.keystore"
        File.write(keystore_path, Base64.decode64(ENV['ANDROID_KEYSTORE_FILE']))
        json_key_data = Base64.decode64(ENV['PLAY_CONFIG_JSON'])
        
        # Get previous build number and increment
        previous_build_number = google_play_track_version_codes(
            package_name: ENV['DEVELOPER_PACKAGE_NAME'],
            track: "internal",
            json_key_data: json_key_data,
        )[0]
        current_build_number = previous_build_number + 1
        sh("export NEW_BUILD_NUMBER=#{current_build_number}")
        
        # Build the app
        gradle(
          task: "clean bundleRelease",
          project_dir: 'android/',
          print_command: false,
          properties: {
            "android.injected.signing.store.file" => "#{keystore_path}",
            "android.injected.signing.store.password" => "#{KEYSTORE_STORE_PASSWORD}",
            "android.injected.signing.key.alias" => "#{KEYSTORE_KEY_ALIAS}",
            "android.injected.signing.key.password" => "#{KEYSTORE_KEY_PASSWORD}",
            'versionCode' => current_build_number
          })
        
        # Upload to Play Store
        upload_to_play_store(
            package_name: ENV['DEVELOPER_PACKAGE_NAME'],
            json_key_data: json_key_data,
            track: 'internal',
            release_status: 'completed',
            skip_upload_metadata: true,
            skip_upload_changelogs: true,
            skip_upload_images: true,
            skip_upload_screenshots: true,
        )
    end
end

4. Configurer les secrets GitHub

Maintenant que vous avez votre clé de stockage et votre fichier JSON de compte de service, vous devez les stocker de manière sécurisée dans GitHub.

Étape 4.1 : Accéder aux secrets GitHub

  1. Allez sur votre dépôt sur GitHub
  2. Cliquez ParamètresSecrets et variablesActions
  3. Cliquez Nouveau secret de repository

Étape 4.2 : Ajouter les secrets requis

Ajoutez chaque de ces secrets un par un :

PLAY_CONFIG_JSON

  1. Prenez le fichier JSON de compte de service que vous avez téléchargé à l'étape 2.4
  2. Convertissez-l’en base64 :

Sur macOS/Linux :

base64 service_account_key.json | pbcopy

Sur Windows (PowerShell) :

[Convert]::ToBase64String([IO.File]::ReadAllBytes("service_account_key.json")) | Set-Clipboard
  1. Créez un nouveau secret nommé PLAY_CONFIG_JSON et collez la chaîne base64

ANDROID_KEYSTORE_FILE

  1. Convertissez votre clé de stockage en base64 :

Sur macOS/Linux :

base64 my-release-key.keystore | pbcopy

Sur Windows (PowerShell) :

[Convert]::ToBase64String([IO.File]::ReadAllBytes("my-release-key.keystore")) | Set-Clipboard
  1. Créez un nouveau secret nommé ANDROID_KEYSTORE_FILE et collez la chaîne base64

KEYSTORE_KEY_ALIAS

Créez un nouveau secret avec l'alias de clé que vous avez utilisé lors de la génération de la clé de stockage (par exemple, my-key-alias)

KEYSTORE_KEY_PASSWORD

Créez un nouveau secret avec la clé mot de passe que vous avez défini lors de la génération du coffre-fort

KEYSTORE_STORE_PASSWORD

Créez un nouveau secret avec le mot de passe du coffre-fort que vous avez défini lors de la génération du coffre-fort

DEVELOPER_PACKAGE_NAME

Créez un nouveau secret avec le nom de votre application (par exemple, com.example.app)

Vous pouvez trouver votre nom de package dans android/app/build.gradle sous applicationId

Étape 4.3 : Vérifiez tous les secrets

Assurez-vous d'avoir ces 6 secrets configurés :

  • ✅ PLAY_CONFIG_JSON
  • ✅ ANDROID_KEYSTORE_FILE
  • ✅ KEYSTORE_KEY_ALIAS
  • ✅ MOT DE Passe DE LA CLÉ DE STOCKAGE
  • ✅ MOT DE Passe DE LA CLÉ DE STOCKAGE
  • ✅ NOM DE PAQUET DU DÉVELOPPEUR

5. Créez GitHub Actions Workflow

Créer .github/workflows/build-upload-android.yml:

name: Build and Deploy Android App

on:
  push:
    tags:
      - '*'

jobs:
  build_android:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      
      - name: Setup Node.js
        uses: actions/setup-node@v6
        with:
          node-version: 24
          cache: npm
          
      - name: Install dependencies
        run: npm ci
        
      - name: Cache Gradle
        uses: actions/cache@v5
        with:
          path: |
            ~/.gradle/caches
            ~/.gradle/wrapper
          key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
          restore-keys: |
            ${{ runner.os }}-gradle-
            
      - name: Build app
        run: npm run build
        
      - name: Sync Capacitor
        run: npx cap sync
        
      - name: Setup Java
        uses: actions/setup-node@v5
        with:
            distribution: 'zulu'
            java-version: '17'
            
      - name: Setup Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: '3.0'
          bundler-cache: true
          
      - name: Run Fastlane
        uses: maierj/fastlane-action@v3.1.0
        env:
          PLAY_CONFIG_JSON: ${{ secrets.PLAY_CONFIG_JSON }}
          ANDROID_KEYSTORE_FILE: ${{ secrets.ANDROID_KEYSTORE_FILE }}
          DEVELOPER_PACKAGE_NAME: ${{ secrets.DEVELOPER_PACKAGE_NAME }}
          KEYSTORE_KEY_ALIAS: ${{ secrets.KEYSTORE_KEY_ALIAS }}
          KEYSTORE_KEY_PASSWORD: ${{ secrets.KEYSTORE_KEY_PASSWORD }}
          KEYSTORE_STORE_PASSWORD: ${{ secrets.KEYSTORE_STORE_PASSWORD }}
        with:
          lane: android beta
          
      - name: Upload artifact
        uses: actions/upload-artifact@v2
        with:
          name: android-release
          path: ./android/app/build/outputs/bundle/release/app-release.aab
          retention-days: 10

Comment ça marche

  1. Créez un tag Git pour déclencher le workflow
  2. GitHub Actions construit votre application
  3. Fastlane la télécharge sur le canal bêta de Google Play
  4. Votre application est automatiquement mise à jour

Temps et coûts de la construction

  • Temps de construction : 3-5 minutes
  • Coût pour les dépôts privés : ~$0.04 par build
  • Gratuit pour les projets open-source

Guides de configuration CI/CD

Plateformes CI/CD alternatives

Mises à jour en temps réel & Déploiement

Ressources

Keep going from Automatic Capacitor Android build with GitHub actions

If vous utilisez Automatic Capacitor build Android automatique avec GitHub actions pour planifier l'automatisation CI/CD, connectez-l’avec Capgo CI/CD pour le flux de workflow du produit dans Capgo CI/CD, Capgo Builds natifs pour le flux de workflow du produit dans Capgo Builds natifs, Capgo Intégrations pour le flux de workflow du produit dans Capgo Intégrations, Intégration CI/CD pour les détails d'implémentation dans Intégration CI/CD, et GitHub Intégration d'actions pour les détails d'implémentation dans les intégrations GitHub

Mises à jour en temps réel pour les applications Capacitor

When un bug se trouve dans la couche web, expédiez la correction par Capgo au lieu d'attendre des jours pour l'approbation de la boutique d'applications. Les utilisateurs reçoivent la mise à jour en arrière-plan tandis que les changements natifs restent dans la voie de revue normale.

Un soutien humain de la part de Martin

Commencez maintenant

Dernières actualités de notre blog

Capgo vous donne les meilleures informations dont vous avez besoin pour créer une application mobile vraiment professionnelle.