Saltati al contenuto principale
CI/CD

Automatic Capacitor Android build with GitLab

Come configurare una pipeline CI/CD per il tuo'app Android Ionic utilizzando fastlane e GitLab in 5 minuti

Crediti dell'articolo

Martin Donadieu

Autore

Valeria

Revisione

Jordan

Editor

Automatic Capacitor Android build with GitLab

Costruzione automatica di Android con GitLab CI

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

Prerequisiti

Prima di iniziare, avrai bisogno di configurare:

  • Un account GitLab con accesso amministrativo
  • L'app già pubblicata sul Google Play Store con firma corretta
  • Chiave di firma Android e file del keystore
  • Progetto Google Cloud Console con Play Store API abilitato
  • Account di servizio con autorizzazioni corrette
  • Conoscenza dei flussi di lavoro di GitLab CI/CD
  • Conoscenza della configurazione di Fastlane
  • Tempo per mantenere e debuggare il pipeline

Capgo Build per CI/CD da Capgo

Svuota la gestione di Fastlane, Gradle runner, keystore e upload-script. Capgo Build __CAPGO_KEEP_0__ Build esegue build nativi Android firmati a partire dal tuo flusso di lavoro CI/CD esistente:

  • Funziona con il tuo flusso di lavoro: Attiva Capgo Build da GitLab CI, GitHub Actions, Jenkins o script locali dopo il build 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 tuoi segreti CI.
  • Nessuna manutenzione del runner nativo: Capgo Build fornisce ambienti di build Android mantenuti, quindi non devi gestire SDK immagini, problemi di cache Gradle o percorsi di Fastlane.
  • Articoli e sottoscrizione: Scarica gli articoli firmati per la QA o invia i build di rilascio attraverso il Capgo CLI.

Prenotazioni

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

Configura Capgo Build in CI/CD

Guida di configurazione manuale

Ecco cosa devi fare:

Passaggi da seguire nel post

  1. Copia i file Fastlane
  2. Memorizza i tuoi segreti in GitLab segreti crittografati
  3. Creazione e memorizzazione della chiave del servizio Google Play
  4. Memorizza la tua chiave di firma Android
  5. Configura il tuo file di flusso di lavoro .yml di GitLab.

1. Copia i file Fastlane.

Fastlane è una libreria Ruby creata per automatizzare le attività comuni di sviluppo mobile. Utilizzando Fastlane, puoi configurare percorsi personalizzati "lanes" che raggruppano una serie di "azioni" che eseguono compiti che normalmente eseguiresti utilizzando Android Studio. Puoi fare molto con Fastlane, ma per gli scopi di questo tutorial, utilizzeremo solo una manciata di azioni di base.

Creare una cartella Fastlane alla radice del tuo progetto e copiare i seguenti file: Fastlane

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'])
				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}")
        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(
					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
    lane :build do
      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}",
        })
    end
    lane :prod_release do
      build_gradle = File.read("../android/app/build.gradle")

      verify_changelog_exists(version_code: build_gradle.match(/versionCode (\d+)/)[1])
      verify_upload_to_staging(version_name: build_gradle.match(/versionName '([\d\.]+)'/)[1])

      supply(
        track_promote_to: 'beta',
        skip_upload_apk: true,
        skip_upload_aab: true,
        skip_upload_metadata: false,
        skip_upload_changelogs: false,
        skip_upload_images: false,
        skip_upload_screenshots: false
      )
    end
end

Memorizza i tuoi segreti nei variabili di GitLab CI/CD.

GitLab fornisce un modo per memorizzare le variabili di CI/CD crittografate, simile ai segreti del repository di GitHub.

  1. Vai al tuo progetto di GitLab e vai alle impostazioni.
  2. Naviga a CI/CD > Variabili.
  3. Aggiungi le seguenti variabili:
  • ANDROID_KEYSTORE_FILE: il file di base64 codificato .jks o .keystore Contenuto HTML di un frammento di testo alternativo (chiave di messaggio `alternatives_cta_questions`). Pagina/Area: pagina di confronto delle alternative per l'aggiornamento in tempo reale di Capacitor. Ruolo: paragrafo di marketing o legale lungo. Visto in: pagina alternatives.astro. Preservare i termini di prodotto e marchio di Capgo e i termini di sviluppatore esattamente. Chiave di messaggio `alternatives_cta_questions` (Domande di azione per le alternative). | Contenuto HTML di un frammento di testo alternativo (chiave di messaggio `appflow_cta_questions`). Pagina/Area: copia di marketing di confronto/migrazione per Appflow. Ruolo: paragrafo di marketing o legale lungo. Visto in: pagina ionic-appflow.astro. Preservare i termini di prodotto e marchio di Capgo e i termini di sviluppatore esattamente. Chiave di messaggio `appflow_cta_questions` (Domande di azione per Appflow). | Contenuto HTML di un frammento di testo alternativo (chiave di messaggio `capwesome_cta_questions`). Pagina/Area: pagina di confronto di Capawesome. Ruolo: paragrafo di marketing o legale lungo. Visto in: pagina capwesome.astro. Preservare i termini di prodotto e marchio di Capgo e i termini di sviluppatore esattamente. Chiave di messaggio `capwesome_cta_questions` (Domande di azione per Capawesome). | Contenuto HTML di un frammento di testo alternativo (chiave di messaggio `consulting_faq_subtitle`). Pagina/Area: pagina dei servizi di consulenza. Ruolo: sottotitolo o didascalia di sezione. Visto in: pagina consulting.astro. Preservare i termini di prodotto e marchio di Capgo e i termini di sviluppatore esattamente. Chiave di messaggio `consulting_faq_subtitle` (Sottotitolo FAQ dei servizi di consulenza). | Pagina/Area: copia di marketing di confronto/migrazione per Appflow. Ruolo: etichetta di navigazione o elemento di navigazione breve. Visto in: pagina ionic-appflow.astro, pagina ionic-enterprise-plugins.astro, pagina soluzioni/ionic-enterprise-plugins.astro. Chiave di messaggio `appflow_plugins_or` (Appflow Plugins O).
  • KEYSTORE_KEY_PASSWORD: la password associata al file del keystore
  • KEYSTORE_KEY_ALIAS: l'alias del keystore
  • KEYSTORE_STORE_PASSWORD: la password della chiave privata
  • DEVELOPER_PACKAGE_NAME: il tuo ID di app Android come ad esempio com.esempio.app
  • PLAY_CONFIG_JSON: La chiave JSON del servizio account codificata in base64.

Creazione di una chiave del servizio Google Play

A generare il PLAY_CONFIG_JSON segreto, segui questi passaggi:

  1. Vai al Console di Google Cloud
  2. Crea un nuovo progetto o seleziona uno esistente
  3. Abilita il Google Play Android Developer API
  4. Crea un account di servizio:
    • Vai a “IAM & Admin” > “Account di servizio”
    • Clicca su “Crea Account di Servizio”
    • Dagli un nome e una descrizione
    • Clicca su “Crea e Continua”
    • Ssaltare l'assegnazione del ruolo e clicca su “Fatto”
  5. Genera una chiave JSON:
    • Trova il tuo account di servizio nella lista
    • Clicca sul menu a tre punti > “Gestisci chiavi”
    • Clicca su “Aggiungi Chiave” > “Crea nuova chiave”
    • Scegli il formato JSON
    • Clicca su “Crea”
  6. Concedi l'accesso all'account del servizio alla tua app nel Console di gioco:
    • Vai a Console di gioco
    • Naviga a "Utenti e autorizzazioni"
    • Clicca su "Invita nuovi utenti"
    • Inserisci l'indirizzo email dell'account del servizio (che termina con @*.iam.gserviceaccount.com)
    • Concedi la "Permessi di rilascio in produzione"
    • Clicca su "Invita utente"
  7. Converte la chiave JSON in base64:
    base64 -i path/to/your/service-account-key.json | pbcopy
  8. Aggiungi la stringa base64 codificata come variabile in GitLab PLAY_CONFIG_JSON Configura la tua pipeline CI/CD di GitLab

Imposta la tua pipeline CI/CD di GitLab

Creare un file .gitlab-ci.yml alla radice del tuo progetto per definire la tua pipeline CI/CD. Ecco un esempio di come puoi strutturare la tua pipeline:


image: mingc/android-build-box:latest

stages:
  - build
  - upload_to_capgo
  - build_and_upload_android

build:
  stage: build
  tags:
    - saas-linux-xlarge-amd64
  cache:
    - key:
        files:
          - bun.lockb
      paths:
        - .node_modules/
  script:
    - npm install
    - npm run build
  artifacts:
    paths:
      - node_modules/
      - dist/
  only:
    - master

upload_to_capgo:
  stage: upload_to_capgo
  tags:
    - saas-linux-xlarge-amd64
  script:
    - npx @capgo/cli@latest bundle upload -a $CAPGO_TOKEN -c dev
  dependencies:
    - build
  when: manual
  only:
    - master

build_and_upload_android:
  tags:
    - saas-linux-xlarge-amd64
  stage:    build_and_upload_android
  cache:
    - key:
        files:
          - android/gradle/wrapper/gradle-wrapper.properties
      paths:
        - ~/.gradle/caches/
  script:
    - npx cap sync android
    - npx cap copy android
    - bundle exec fastlane android beta # We do create a tag for the build to trigger XCode cloud builds
  dependencies:
    - build
  when: manual
  only:
    - master

Attiva la Pipeline

Quando pubblichi un nuovo tag nel tuo repository GitLab, GitLab CI/CD attiverà automaticamente la pipeline definita, che costruirà e distribuirà la tua app Android utilizzando Fastlane.

Assicurati di adattare le percorso e le dipendenze in base alla struttura e alle esigenze del tuo progetto. Questa configurazione ti aiuterà a automatizzare la distribuzione della tua app Android su GitLab CI/CD.

Conclusioni

Configurando GitLab CI/CD con l'immagine Docker mingc/android-build-box, puoi automatizzare il processo di costruzione dell'app Android, rendendo il tuo workflow di sviluppo più efficiente e affidabile. Questa automazione ti consente di dedicare più tempo alle parti centrali dello sviluppo di app, aiutandoti a consegnare app Android di alta qualità in modo più efficiente.

Continua da Automatic Capacitor Android build con GitLab

Se stai utilizzando Automatic Capacitor Android build con GitLab per pianificare l'automazione della CI/CD, collega Capgo CI/CD per il workflow del prodotto in Capgo CI/CD, Capgo Costruzioni native per il flusso di lavoro del prodotto in Capgo Costruzioni native Capgo Integrazioni per il flusso di lavoro del prodotto in Capgo Integrazioni Integrazione CI/CD per la dettaglio di implementazione in Integrazione CI/CD, e GitHub Integrazione azioni per la dettaglio di implementazione in GitHub Integrazione azioni

Aggiornamenti in tempo reale per le app Capacitor

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 nel 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 web di marketing Capgo. Ruolo: frase di descrizione o meta descrizione di supporto. Visto in: componente GetStarted.astro. Preservare i termini del prodotto/marca Capgo e i termini del developer esattamente. Chiave del messaggio `instant_updates_for_capacitor_apps_description` (Aggiornamenti in tempo reale per le app Capacitor Description).

Sostegno umano da parte di Martin

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