Saltati al contenuto principale
CI/CD

Automatic Capacitor Android build with GitHub actions

Come configurare una pipeline CI/CD per il tuo app Android Capacitor utilizzando fastlane e azioni GitHub in 5 minuti

Martin Donadieu

Martin Donadieu

Content Marketer

Automatic Capacitor Android build with GitHub actions

Impostare il CI/CD per le app Capacitor può essere complesso e richiede molto tempo. Ecco cosa devi sapere:

Adesso consigliamo di utilizzare Capgo Costruzione con il Capgo CLI per costruzioni native Capacitor. Questa guida Fastlane è conservata per le squadre che mantengono pipeline di azioni GitHub esistenti, ma le nuove costruzioni Android dovrebbero utilizzare il Capgo CLI in modo da non dover mantenere Fastlane, esecutori Gradle, chiavi e script di caricamento da soli.

Requisiti

Prima di iniziare, avrai bisogno di configurare:

  • Un account GitHub con accesso amministrativo
  • L'app già pubblicata su Google Play Store con firma corretta
  • Chiave di firma Android e file keystore
  • Progetto di Google Cloud Console con API Play Store abilitato
  • Account di servizio con autorizzazioni corrette
  • Comprensione dei flussi di lavoro di GitHub Actions
  • Conoscenza della configurazione di Fastlane
  • Tempo per mantenere e debuggare la pipeline

Capgo Build per CI/CD da Capgo

Saltare la manutenzione di Fastlane, Gradle runner, keystore e upload-script. Capgo Build __CAPGO_KEEP_0__ Build esegue costruzioni native Android firmate a partire dal proprio flusso di lavoro CI/CD:

  • Funziona con il proprio flusso di lavoro: Attiva Capgo Build da GitHub Actions, GitLab CI, Jenkins o script locali dopo la costruzione web e npx cap sync.
  • Firma da segreti CI: Mantieni le chiavi Android, gli alias chiave, le password e il file JSON del servizio account Play Console nei propri segreti CI.
  • Nessuna manutenzione del runner nativo: Capgo Build fornisce ambienti di costruzione Android mantenuti, quindi non devi gestire SDK immagini, problemi di cache Gradle o lane Fastlane.
  • Articoli e sottoscrizione: Scarica gli articoli firmati per la QA o invia le costruzioni di rilascio attraverso il Capgo CLI.

Pianificazione dei prezzi

  • Capgo piani iniziano da 12 dollari al mese
  • Includono aggiornamenti OTA e circa 15 costruzioni native al mese
  • Minuti di costruzione aggiuntivi sono fatturati per minuto attraverso crediti

Configura Capgo Build in CI/CD

Guida di configurazione manuale

Ecco cosa devi fare:

Pianificazione dei prezzi GitHub

Prezzo dell'azione GitHub

Pianificazione delle azioni GitHub offre minuti gratuiti in base al tipo di repository:

  • Repository pubblici: 2.000 minuti al mese
  • Repository privati: 2.000 minuti al mese (esecutori Linux)

Per progetti privati, i costi sono di circa $0,008/minuto. Una costruzione tipica richiede 3-5 minuti.

Passaggi di configurazione manuale

  1. Crea Keystore Android
  2. Configura account di servizio Google Play
  3. Configura Fastlane
  4. Configura segreti GitHub
  5. Crea workflow GitHub Actions

1. Crea Keystore Android

Prima di poter firmare e pubblicare il tuo app Android, devi creare un file di keystore. Questo è un setup una volta per tutte.

Genera Keystore con keytool

Esegui questo comando nel tuo terminale:

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

Ti verrà chiesto:

  • Parola di chiave del keystore: Scegli una password forte (avrai bisogno di questa come KEYSTORE_STORE_PASSWORD)
  • Parola di chiave: Scegli una password forte (avrai bisogno di questa come KEYSTORE_KEY_PASSWORD)
  • Nome, organizzazione, ecc.: Inserisci i tuoi dati

Note importanti

  • Salva questi valori in modo sicuro:

    • Posizione del file del keystore (ad es. my-release-key.keystore)
    • Alias della chiave (ad es. my-key-alias) - avrai bisogno di questa come KEYSTORE_KEY_ALIAS
    • Parola di chiave del keystore - avrai bisogno di questa come KEYSTORE_STORE_PASSWORD
    • La chiave di accesso - avrai bisogno di questo come KEYSTORE_KEY_PASSWORD
  • Backup il file del keystore: Se lo perdi, non potrai aggiornare il tuo app pubblicato

  • Tienilo segreto: Non commettere mai il file del keystore a git

  • Conservalo in un luogo sicuro: Conserva più backup in luoghi sicuri

Alternativa: Utilizza Esistente Keystore

Se hai già pubblicato il tuo app, devi utilizzare lo stesso keystore che hai utilizzato inizialmente. Puoi trovarlo:

  • In macchina locale dove hai costruito l'app per la prima volta
  • Nella tua console di Play → Impostazioni → App firmata (se utilizzi la firma di Google Play App Signing)

2. Configura il Servizio di Google Play Account

Per consentire agli GitHub Actions di caricare le build su Google Play, è necessario un account di servizio.

Passo 2.1: Creare un progetto di Google Cloud

  1. Vai a Console di Google Cloud
  2. Crea un nuovo progetto o seleziona uno esistente
  3. Nota l'ID del progetto

Passo 2.2: Abilita il servizio di sviluppatore di Google Play API

  1. In Console di Google Cloud, vai a APIs & ServiziBiblioteca
  2. Cerca “Sviluppatore Android di Google Play API”
  3. Clicca Abilita

Passo 2.3: Crea account di servizio

  1. Vai a IAM & AmministrazioneAccount di servizio
  2. Clicca Crea account di servizio
  3. Inserisci dettagli:
    • Nome: github-actions-uploader
    • Descrizione: "Account di servizio per le GitHub azioni per l'upload dei build"
  4. Clicca Crea e continua
  5. Saltare l'assegnazione del ruolo per ora (clicca Continua, poi Fatto)

Passo 2.4: Crea chiave di account di servizio

  1. Clicca sul nuovo account di servizio creato
  2. Vai a Chiavi tab
  3. Clicca Aggiungi chiaveCrea nuova chiave
  4. Scegli formato JSON formato
  5. Clicca Crea
  6. Un file JSON verrà scaricato - salva questo in modo sicuropotrai averne bisogno in seguito

Passo 2.5: Concedi accesso in Console Play

  1. Vai a Console di Gioco Play
  2. Vai a ConfigurazioneAPI access
  3. Sotto Conti utente, clicca Concedi l'accesso per il tuo account utente
  4. Sul Permessi dell'app aggiungi il tuo app
  5. Sul Permessi dell'account tab, concedi questi permessi:
    • Visualizza informazioni sull'app e scarica rapporti in blocco (lettura solo)
    • Crea, modifica e elimina app bozzetto
    • Pubblica app in piste di testing
    • Pubblica app in produzione, escludi e altre piste
  6. Clicca Invita utente
  7. Clicca Invia invito

Passo 2.6: Verifica la chiave JSON

Il file JSON scaricato dovrebbe avere questo aspetto:

{
  "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": "..."
}

Convertirai questo in base64 nel passo di configurazione dei segreti GitHub.

3. Imposta Fastlane

Crea un fastlane cartella nella radice del tuo progetto e aggiungi un Fastfile con il seguente contenuto:

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. Configura i segreti di GitHub

Ora che hai il tuo keystore e il file JSON del servizio, hai bisogno di archiviarli in modo sicuro in GitHub.

Fase 4.1: Accesso ai segreti di GitHub

  1. Accedi al tuo repository su GitHub
  2. Clicca ImpostazioniSegreti e variabiliAzioni
  3. Clicca Nuova chiave segreta del repository

Passo 4.2: Aggiungi i segreti richiesti

Aggiungi ogni segreto uno per uno:

PLAY_CONFIG_JSON

  1. Prendi il file JSON del servizio account che hai scaricato nel Passo 2.4
  2. Convertilo in base64:

Sul macOS/Linux:

base64 service_account_key.json | pbcopy

Sul Windows (PowerShell):

[Convert]::ToBase64String([IO.File]::ReadAllBytes("service_account_key.json")) | Set-Clipboard
  1. Crea una nuova chiave segreta denominata PLAY_CONFIG_JSON e incolla la stringa base64

ANDROID_KEYSTORE_FILE

  1. Converti il tuo keystore in base64:

Su macOS/Linux:

base64 my-release-key.keystore | pbcopy

Su Windows (PowerShell):

[Convert]::ToBase64String([IO.File]::ReadAllBytes("my-release-key.keystore")) | Set-Clipboard
  1. Crea un nuovo segreto denominato ANDROID_KEYSTORE_FILE e incolla la stringa base64

KEYSTORE_KEY_ALIAS

Crea un nuovo segreto con la chiave alias che hai utilizzato quando hai generato il keystore (ad esempio, my-key-alias)

KEYSTORE_KEY_PASSWORD

Crea un nuovo segreto con la password della chiave che hai impostato quando hai generato il keystore

KEYSTORE_STORE_PASSWORD

Crea un nuovo segreto con la password del keystore che hai impostato quando hai generato il keystore

DEVELOPER_PACKAGE_NAME

Creare un nuovo segreto con il nome del pacchetto della tua app (ad esempio, com.example.app)

Potrai trovare il nome del pacchetto della tua app android/app/build.gradle sotto applicationId

Passo 4.3: Verifica tutti i segreti

Assicurati di avere configurati questi 6 segreti:

  • ✅ PLAY_CONFIG_JSON
  • ✅ ANDROID_KEYSTORE_FILE
  • ✅ KEYSTORE_KEY_ALIAS
  • ✅ KEYSTORE_KEY_PASSWORD
  • ✅ KEYSTORE_STORE_PASSWORD
  • ✅ DEVELOPER_PACKAGE_NAME

5. Crea GitHub Workflow di azioni

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

Cosa Funziona

  1. Crea un tag Git per attivare il flusso di lavoro
  2. GitHub Azioni costruisce il tuo app
  3. Fastlane lo carica sul canale beta di Google Play
  4. La tua app viene aggiornata automaticamente

Tempo e Costi di Costruzione

  • Tempo di costruzione: 3-5 minuti
  • Costo per repository privati: ~$0.04 per costruzione
  • Gratis per progetti open-source

Guida di configurazione CI/CD

Alternative piattaforme di CI/CD

Aggiornamenti in tempo reale & distribuzione

Risorse

Continua dall'aggiornamento Android automatico con Capacitor e dalle azioni di GitHub

Se stai utilizzando L'aggiornamento Android automatico con Capacitor e dalle azioni di GitHub per pianificare l'automazione CI/CD, connettilo con la CI/CD di Capgo per il workflow del prodotto in Capgo CI/CD, Capgo Costruzioni native per il workflow del prodotto in Capgo Costruzioni native, Capgo Integrazioni for the product workflow in Capgo Integrations, per il workflow del prodotto in __CAPGO_KEEP_0__ Integrazioni, Integrazione CI/CD GitHub Actions Integration for the implementation detail in GitHub Actions Integration.

Aggiornamenti in tempo reale per Capacitor app

When a web-layer bug is live, ship the fix through Capgo instead of waiting days for app store approval. Users get the update in the background while native changes stay in the normal review path.

Quando un bug di layer web è attivo, invia la correzione attraverso __CAPGO_KEEP_0__ invece di attendere giorni per l'approvazione della store. Gli utenti ricevono l'aggiornamento in background mentre le modifiche native rimangono nel normale percorso di revisione.

Contesto: Sito di marketing Capgo. Ruolo: Descrizione di supporto o meta descrizione. Visto in: componente GetStarted.astro. Preservare i termini di prodotto/marca e i termini di sviluppatore esattamente. Chiave del messaggio `instant_updates_for_capacitor_apps_description` (Descrizione degli aggiornamenti in tempo reale per le app Capacitor).

Sostegno umano da Martin

Capgo gives you the best insights you need to create a truly professional mobile app.