Saltar al contenido principal
CI/CD

Automatic Capacitor Android build with GitHub actions

How to set up a CI/CD pipeline for your Android Capacitor app using fastlane and GitHub Actions in 5 minutes

Créditos del artículo

Martin Donadieu

Escribidor

Valeria

Revisor

Jordan

Editor

Automatic Capacitor Android build with GitHub actions

Configurando CI/CD para aplicaciones de Capacitor puede ser complejo y tiempo consumidor. Aquí está lo que debes saber:

Ahora recomendamos utilizar Capgo Build con el Capgo CLI para compilaciones nativas de Capacitor. Esta guía de Fastlane se mantiene para equipos que mantienen pipelines de acciones de GitHub existentes, pero nuevos compilados de Android deben utilizar el Capgo CLI para que no tengas que mantener Fastlane, ejecutores de Gradle, keystore y scripts de carga.

Requisitos previos

Antes de empezar, necesitarás configurar:

  • Cuenta de GitHub con acceso administrativo
  • Tu aplicación ya publicada en Google Play Store con firmado correctamente
  • Clave de firma de Android y archivos de keystore
  • Proyecto de Google Cloud Console con Play Store API habilitado
  • Cuenta de servicio con permisos adecuados
  • Conocimiento de los flujos de trabajo de GitHub Actions
  • Conocimiento de la configuración de Fastlane
  • Tiempo para mantener y depurar la pipeline

Capgo Build para CI/CD por Capgo

Saltar la configuración de Fastlane, el ejecutor de Gradle, el keystore y el script de carga. Capgo Build Ejecuta compilaciones nativas de Android firmadas desde tu pipeline de CI/CD existente:

  • Funciona con tu pipeline: Dispara Capgo Build desde GitHub Actions, GitLab CI, Jenkins o scripts locales después de tu compilación web y npx cap sync.
  • Autenticación desde secretos de CI: Mantenga las claves de Android, alias de clave, contraseñas y archivo JSON de servicio de Consola de Play en sus propios secretos de CI.
  • No mantenimiento del ejecutor nativo: Capgo Build proporciona entornos de compilación de Android mantenidos, por lo que no tiene que gestionar SDK imágenes, problemas de caché de Gradle o rutas de Fastlane.
  • Artículos y envío: Descargue los artículos firmados para QA o envíe versiones de lanzamiento a través del Capgo CLI.

Precio

  • : Precio de los planes de Capgo comienza en $12/mes
  • : Incluye actualizaciones OTA y aproximadamente 15 compilaciones nativas por mes
  • : Los minutos adicionales de compilación se facturan por minuto a través de créditos

Configuración de Capgo Build en CI/CD

: Guía de Configuración Manual

Aquí está lo que debes hacer:

GitHub Acciones de Precios

Precio de la Acción GitHub

GitHub Acciones ofrece minutos gratuitos según el tipo de repositorio:

  • Repositorios públicos: 2,000 minutos/mes
  • Repositorios privados: 2,000 minutos/mes (ejecutores de Linux)

Para proyectos privados, los costos son aproximadamente $0.008/minuto. Un build típico dura 3-5 minutos.

Pasos de configuración manual

  1. Crear Keystore de Android
  2. Configurar la cuenta de servicio de Google Play
  3. Configurar Fastlane
  4. Configurar secretos de GitHub
  5. Crear flujo de trabajo de GitHub

1. Crear Keystore de Android

Antes de que puedas firmar y publicar tu aplicación de Android, debes crear un archivo de keystore. Este es un proceso de configuración único.

Generar Keystore con keytool

Ejecuta este comando en tu terminal:

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

Se te pedirá:

  • Contraseña de Keystore: Elige una contraseña fuerte (la necesitarás como KEYSTORE_STORE_PASSWORD)
  • Contraseña de clave: Elige una contraseña fuerte (la necesitarás como KEYSTORE_KEY_PASSWORD)
  • Tu nombre, organización, etc.: Rellena tus detalles

Notas importantes

  • Almacena estos valores de manera segura:

    • Ubicación del archivo de keystore (por ejemplo, my-release-key.keystore)
    • Alias de clave (por ejemplo, my-key-alias) - necesitarás esto como KEYSTORE_KEY_ALIAS
    • Contraseña del keystore - necesitarás esto como KEYSTORE_STORE_PASSWORD
    • Contraseña de clave - necesitarás esto como KEYSTORE_KEY_PASSWORD
  • Haz una copia de seguridad del archivo de keystoreSi lo pierdes, no podrás actualizar tu aplicación publicada

  • Manténlo en secretoNo comitas el archivo de keystore en git

  • Almacénalo a salvo: Mantén múltiples copias de seguridad en ubicaciones seguras

Opción alternativa: Utiliza Keystore existente

Si ya publicaste tu aplicación, debes utilizar el mismo keystore que utilizaste inicialmente. Puedes encontrarlo:

  • En tu máquina local donde construiste la aplicación por primera vez
  • En tu Console de Play → Configuración → Firmado de aplicaciones (si estás utilizando la firma de aplicaciones de Google Play)

2. Configura la cuenta de servicio de Google Play

Para permitir que las GitHub Acciones suban versiones a Google Play, necesitas una cuenta de servicio.

Paso 2.1: Crea proyecto de Google Cloud

  1. Ve a Console de Cloud de Google
  2. Crea un nuevo proyecto o selecciona uno existente
  3. Nota el ID del proyecto

Step 2.2: Habilita el desarrollador de Google Play API

  1. En la Consola de Cloud de Google, vaya a Servicios de API → Biblioteca
  2. Busque "Desarrollador de Android de Google Play API"
  3. Haga clic Habilitar

Step 2.3: Crea cuenta de servicio

  1. Vaya a Administración de IAM → Cuentas de servicio
  2. Haga clic Crear Cuenta de Servicio
  3. Ingrese detalles:
    • Nombre: github-actions-uploader
    • Descripción: “Cuenta de servicio para GitHub Acciones para subir compilaciones”
  4. Haga clic Crear y Continuar
  5. Saltar la asignación de roles por ahora (haga clic ContinuarLuego Hecho)

Paso 2.4: Crear Llave de Cuenta de Servicio

  1. Haga clic en la cuenta de servicio recién creada
  2. Ir a Claves pestaña
  3. Hacer clic Agregar clave → Crear nueva clave
  4. Elegir formato JSON Hacer clic
  5. Crear Se descargará un archivo JSON -
  6. Una vez descargado, puedes utilizarlo en tu proyecto guarda esto de manera segurate lo necesitarás más tarde

Paso 2.5: Otorgar acceso en la consola de Play

  1. Ve a Consola de Play
  2. Ve a Configuración → API access
  3. __CAPGO_KEEP_0__ acceso BajoCuentas de servicio , haz clic en para tu cuenta de servicio
  4. En la Permisos de la aplicación pantalla, agrega tu aplicación
  5. En la Permisos de la cuenta pantalla, concede estos permisos:
    • Ver información de la aplicación y descargar informes en bloque (solo lectura)
    • Crear, editar y eliminar aplicaciones de borrador
    • Publicar aplicaciones en pistas de prueba
    • Publicar aplicaciones en producción, excluir y otras pistas
  6. Hacer clic Invite user
  7. Click Send invite

Paso 2.6: Verificar la clave JSON

El archivo JSON descargado debería tener este aspecto:

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

Convertirás esto a base64 en el paso de configuración de secretos GitHub.

3. Configurar Fastlane

Crear un fastlane carpeta en la raíz de tu proyecto y agregar un Fastfile con este contenido:

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. Configurar secretos GitHub

Ahora que tienes tu keystore y archivo JSON de servicio, debes almacenarlos de manera segura en GitHub.

Step 4.1: Accede a GitHub Secretos protegidos

  1. Dirígete a tu repositorio en GitHub
  2. Hacer clic Ajustes → Secretos y variables → Acciones
  3. Hacer clic Nueva secretos de repositorio

Step 4.2: Agregar Secretos Requeridos

Agregar cada uno de estos secretos uno por uno:

PLAY_CONFIG_JSON

  1. Obtén el archivo JSON de la cuenta de servicio que descargaste en Step 2.4
  2. Convertir a base64:

En macOS/Linux:

base64 service_account_key.json | pbcopy

En Windows (PowerShell):

[Convert]::ToBase64String([IO.File]::ReadAllBytes("service_account_key.json")) | Set-Clipboard
  1. Crear un secreto nuevo llamado PLAY_CONFIG_JSON y pegar la cadena base64

ANDROID_KEYSTORE_FILE

  1. Convertir su keystore a base64:

En macOS/Linux:

base64 my-release-key.keystore | pbcopy

En Windows (PowerShell):

[Convert]::ToBase64String([IO.File]::ReadAllBytes("my-release-key.keystore")) | Set-Clipboard
  1. Crear un secreto nuevo llamado ANDROID_KEYSTORE_FILE y pegar la cadena base64

KEYSTORE_KEY_ALIAS

Crear un nuevo secreto con la clave alias que utilizaste cuando generaste el keystore (por ejemplo, my-key-alias)

Crear un nuevo secreto con la clave de contraseña que estableciste cuando generaste el keystore

Crear un nuevo secreto con la contraseña del keystore que estableciste cuando generaste el keystore

Crear un nuevo secreto con la contraseña del keystore que estableciste cuando generaste el keystore

Crear un nuevo secreto con el nombre de paquete de tu aplicación (por ejemplo,

Puedes encontrar tu nombre de paquete en

bajo com.example.app)

Step 4.3: Verificar todos los secretos android/app/build.gradle Asegúrate de tener configurados estos 6 secretos: applicationId

✅ CONFIGURACIÓN DE JUEGO DE PLAY

✅ PLAY_CONFIG_JSON

  • ✅
  • ✅ ARCHIVO_DE_KEYSTORE_ANDROID
  • ✅ ALINEACIÓN_DE_CLAVE_DE_KEYSTORE
  • ✅ CONTRASEÑA_DE_KEYSTORE
  • ✅ CONTRASEÑA_DE_ALMACÉN_DE_KEYSTORE
  • ✅ NOMBRE_DE_PAQUETE_DEL_DESARROLLADOR

5. Crea GitHub Flujos de Acción

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

¿Cómo Funciona

  1. Crear una etiqueta Git para desencadenar el flujo de trabajo
  2. GitHub Acciones compila tu aplicación
  3. Fastlane la sube a Google Play beta
  4. Tu aplicación se actualiza automáticamente

Tiempo de Construcción y Costos

  • Tiempo de construcción: 3-5 minutos
  • Costo para repositorios privados: ~$0.04 por construcción
  • Gratis para proyectos de código abierto

Guías de Configuración de CI/CD

Plataformas CI/CD Alternativas

Actualizaciones en Vivo y Despliegue

Recursos

Keep going from Automatic Capacitor Android build with GitHub actions

Si estás utilizando Automatic Capacitor Android build with GitHub actions para planificar la automatización de CI/CD, conecta con Capgo automatización de CI/CD para el flujo de trabajo del producto en Capgo automatización de CI/CD, Capgo compilaciones nativas para el flujo de trabajo del producto en Capgo compilaciones nativas, Capgo integraciones para el flujo de trabajo del producto en Capgo integraciones, Integración de CI/CD para los detalles de implementación en la Integración CI/CD, y GitHub Integración de Acciones para los detalles de implementación en GitHub Integración de Acciones.

Actualizaciones en vivo para aplicaciones Capacitor

Cuando haya un error en la capa web, envíe la corrección a través de Capgo en lugar de esperar días para la aprobación de la tienda de aplicaciones. Los usuarios obtienen la actualización en segundo plano mientras los cambios nativos siguen en el camino de revisión normal.

Apoyo humano de Martin

Iniciar Ahora

Últimas noticias de nuestro Blog

Capgo te da las mejores perspectivas que necesitas para crear una aplicación móvil verdaderamente profesional.