Saltar al contenido principal
CI/CD

Automatic Capacitor IOS build with GitHub actions using match

Cómo configurar una pipeline de CI/CD para tu aplicación de IOS Ionic utilizando fastlane y GitHub Actions en 5 minutos (2022)

Créditos del artículo

Martin Donadieu

Escritor

Valeria

Revisor

Jordan

Editor

Automatic Capacitor IOS build with GitHub actions using match

Automatic Builds de iOS con Acciones de GitHub utilizando Match

Configuración de CI/CD para aplicaciones de Capacitor puede ser compleja y consume mucho tiempo. Aquí está lo que debes saber:

Ahora recomendamos utilizar Capgo Build con el Capgo CLI para construcciones nativas de Capacitor. Esta guía de Fastlane Match se mantiene para equipos que mantienen existentes pipelines de Acciones de GitHub, pero nuevos builds de iOS deben utilizar el Capgo CLI para que no tengas que mantener repositorios de Fastlane, Match, ejecutores de Xcode, certificados y scripts de carga.

Capgo Build para CI/CD por Capgo

Saltar la configuración de Fastlane Match, ejecutor de Xcode, certificado, perfil de provisión y script de carga. Capgo Build realiza construcciones nativas de iOS firmadas desde tu pipeline de CI/CD existente:

  • Funciona con tu pipeline: Disparar Capgo desde GitHub Actions, GitLab CI, Jenkins o scripts locales después de su compilación web y npx cap sync.
  • La firma desde secretos de CI: Mantenga las claves de App Store Connect, certificados, perfiles de provisión, contraseñas y IDs de equipo en sus propios secretos de CI.
  • No mantenimiento de ejecutor nativo: Capgo Build proporciona entornos de compilación Apple mantenidos, por lo que no tiene que gestionar ejecutores macOS, imágenes de Xcode, Fastlane o repositorios de Match.
  • Artículos y presentación: Descargue artículos firmados para QA o presente compilaciones 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

: Establezca Capgo Build en CI/CD

Guía de Configuración Manual

Aquí está lo que debes hacer:

Entrega Continua para iOS utilizando Fastlane y GitHub Acciones utilizando match

Requisitos previos

Antes de continuar con el tutorial…

Importante sobre el precio.

Precio GitHub Acción

https://github.com/features/actions

El servicio es ‘gratuito’ hasta la limitación, dependiendo de la máquina elegida.
Vamos a utilizar una máquina macOS puedes ver en la captura su precio y límites (precios a la creación del tutorial, podrían sufrir cambios en el futuro)

🔴 Una vez advertidos de los requisitos y precios, si te gusta, continuamos…

📣 En el post asumimos que tenemos la aplicación creada en iTunes connect, tenemos los certificados del ecosistema de Apple, todo se copiará con Fastlane!

¡Vamos a sumergirnos!

Pasos a seguir en el post

  1. Usando App Store Connect API con Fastlane Match
  2. Requisitos
  3. Crear una clave de App Store Connect API
  4. Usar una clave de App Store Connect API
  5. Copiar archivos de Fastlane
  6. Configurar Fastlane match

1. Usando App Store Connect API con Fastlane Match

Desde el
Soporte de Apple Para empezar con match es necesario revocar sus certificados existentes. Pero no se preocupe, tendrá el nuevo directamente.

Requisitos

Starting February 2021, two-factor authentication or two-step verification is required for all users to sign in to App Store Connect. This extra layer of security for your Apple ID helps ensure that you’re the only person who can access your account.

Para poder utilizar App Store Connect API, Fastlane necesita tres cosas.

  1. Identificador de emisor.
  2. Identificador de clave.
  3. Archivo de clave o contenido de clave.

Crear una clave de App Store Connect API

Para generar claves, debe tener permiso de Administrador en App Store Connect. Si no tiene ese permiso, puede dirigir a la persona relevante a este artículo y seguir las instrucciones siguientes.

1 — Iniciar sesión en App Store Connect.

2 — Seleccionar Usuarios y Acceso.

Acceso de usuario a App Store Connect

3 — Selecciona la pestaña de Integración.

App Store Connect API Integración

4 — Haz clic en Generar API clave o en el botón de agregar (+).

App Store Connect API claves crean

5 — Ingresa un nombre para la clave. El nombre es solo para tu referencia y no forma parte de la clave en sí.

App Store Connect API claves crean nombre

6 — En Acceso, selecciona el rol para la clave. Los roles que se aplican a las claves son los mismos roles que se aplican a los usuarios en tu equipo. Consulta permisos de rol. Recomendamos seleccionar Administrador de la App.

7 — Haz clic en Generar.

Una clave API no puede tener acceso limitado a aplicaciones específicas.

El nombre de la nueva clave, el ID de la clave, un enlace de descarga y otra información aparecen en la página.

Descargas de claves de App Store Connect

Puedes obtener toda la información necesaria aquí.
1. Identificador de la incidencia.
2. Identificador de la clave.
3. Haz clic en "Descargar clave API" para descargar tu clave privada API. El enlace de descarga aparece solo si la clave privada no se ha descargado aún. Apple no almacena una copia de la clave privada. Por lo tanto, solo puedes descargarla una vez.

🔴 Almacena tu clave privada en un lugar seguro. Nunca debes compartir tus claves, almacenar claves en un repositorio code o incluir claves en el lado del cliente code.

Uso de una clave API de App Store Connect

La clave API (archivo p8 que descargas), el ID de la clave y el ID del emisor son necesarios para crear el token JWT de autorización. Hay varias formas en que estos elementos de información se pueden ingresar en Fastlane utilizando la nueva acción de Fastlane. app_store_connect_api_keyPuedes aprender otras formas en Documentación de Fastlane. Muestro este método porque creo que es la forma más fácil de trabajar con la mayoría de las CI allí, donde puedes establecer variables de entorno.

Ahora podemos gestionar Fastlane con la clave de App Store Connect API, ¡genial!

2. Copiar archivos de Fastlane

Fastlane es una biblioteca de Ruby creada para automatizar tareas comunes de desarrollo móvil. Al utilizar Fastlane, puedes configurar

lanes

default_platform(:ios)

DEVELOPER_APP_IDENTIFIER = ENV["DEVELOPER_APP_IDENTIFIER"]
DEVELOPER_APP_ID = ENV["DEVELOPER_APP_ID"]
PROVISIONING_PROFILE_SPECIFIER = ENV["PROVISIONING_PROFILE_SPECIFIER"]
TEMP_KEYCHAIN_USER = ENV["TEMP_KEYCHAIN_USER"]
TEMP_KEYCHAIN_PASSWORD = ENV["TEMP_KEYCHAIN_PASSWORD"]
APPLE_ISSUER_ID = ENV["APPLE_ISSUER_ID"]
APPLE_KEY_ID = ENV["APPLE_KEY_ID"]
APPLE_KEY_CONTENT = ENV["APPLE_KEY_CONTENT"]
GIT_USERNAME = ENV["GIT_USERNAME"]
GIT_TOKEN = ENV["GIT_TOKEN"]

def delete_temp_keychain(name)
  delete_keychain(
    name: name
  ) if File.exist? File.expand_path("~/Library/Keychains/#{name}-db")
end

def create_temp_keychain(name, password)
  create_keychain(
    name: name,
    password: password,
    unlock: false,
    timeout: 0
  )
end

def ensure_temp_keychain(name, password)
  delete_temp_keychain(name)
  create_temp_keychain(name, password)
end

platform :ios do
  lane :build do
    build_app(
      configuration: "Release",
      workspace: "./ios/App/App.xcworkspace",
      scheme: "App",
      export_method: "app-store",
      export_options: {
        provisioningProfiles: { 
            DEVELOPER_APP_ID => "#{PROVISIONING_PROFILE_SPECIFIER}"
        }
      }
    )
  end
  lane :refresh_profiles do
    match(
      type: "development",
      force: true)
    match(
      type: "adhoc",
      force: true)
  end
  desc "Register new device"
  lane :register_new_device do  |options|
      device_name = prompt(text: "Enter the device name: ")
      device_udid = prompt(text: "Enter the device UDID: ")
      device_hash = {}
      device_hash[device_name] = device_udid
      register_devices(
                       devices: device_hash
                       )
    refresh_profiles
  end
  lane :closed_beta do
    keychain_name = TEMP_KEYCHAIN_USER
    keychain_password = TEMP_KEYCHAIN_PASSWORD
    ensure_temp_keychain(keychain_name, keychain_password)

    api_key = app_store_connect_api_key(
      key_id: APPLE_KEY_ID,
      issuer_id: APPLE_ISSUER_ID,
      key_content: APPLE_KEY_CONTENT,            
      duration: 1200,            
      in_house: false
    )

    match(
      type: 'appstore',
      git_basic_authorization: Base64.strict_encode64("#{GIT_USERNAME}:#{GIT_TOKEN}"),
      readonly: true,
      keychain_name: keychain_name,
      keychain_password: keychain_password,
      api_key: api_key
    )

    gym(
      configuration: "Release",
      workspace: "./ios/App/App.xcworkspace",
      scheme: "App",
      export_method: "app-store",
      export_options: {
        provisioningProfiles: { 
            DEVELOPER_APP_ID => "#{PROVISIONING_PROFILE_SPECIFIER}"
        }
      }
    )

    pilot(
      apple_id: "#{DEVELOPER_APP_ID}",
      app_identifier: "#{DEVELOPER_APP_IDENTIFIER}",
      skip_waiting_for_build_processing: true,
      skip_submission: true,
      distribute_external: false,
      notify_external_testers: false,
      ipa: "./App.ipa"
    )

    delete_temp_keychain(keychain_name)
  end
  lane :submit_review do
    version = ''
    Dir.chdir("..") do
      file = File.read("package.json")
      data = JSON.parse(file)
      version = data["version"]
    end
    deliver(
      app_version: version,
      submit_for_review: true,
      automatic_release: true,
      force: true, # Skip HTMl report verification
      skip_metadata: false,
      skip_screenshots: false,
      skip_binary_upload: true
    )
  end
end

personalizados que agrupan una serie de

app_identifier(ENV["DEVELOPER_APP_IDENTIFIER"])
apple_id(ENV["FASTLANE_APPLE_ID"])
itc_team_id(ENV["APP_STORE_CONNECT_TEAM_ID"])
team_id(ENV["DEVELOPER_PORTAL_TEAM_ID"])

acciones

que realizan tareas que normalmente realizarías utilizando Android Studio. Puedes hacer mucho con Fastlane, pero para los propósitos de este tutorial, utilizaremos solo una pequeña cantidad de acciones básicas. Crea un carpeta de Fastlane en la raíz de tu proyecto y copia los siguientes archivos: Fastfile is a new approach to iOS’s code signing. Fastlane match makes it easy for teams to manage the required certificates and provisioning profiles for your iOS apps.

Configura Fastlane match certificatesFastlane match es una nueva aproximación al firmado de iOS GitHub. Fastlane match facilita a los equipos la gestión de los certificados y perfiles de configuración necesarios para tus aplicaciones de iOS.

Inicia Fastlane match para tu aplicación iOS.

fastlane match init

Luego selecciona la opción #1 (Almacenamiento Git).

[01:00:00]: fastlane match supports multiple storage modes, please select the one you want to use:1. git2. google_cloud3. s3?

Asigna la URL del repositorio creado recientemente.

[01:00:00]: Please create a new, private git repository to store the certificates and profiles there[01:00:00]: URL of the Git Repo: <YOUR_CERTIFICATES_REPO_URL>

Ahora tienes dentro de la carpeta de Fastlane un archivo llamado Matchfile y _git_url_Debería estar configurado con la URL HTTPS del repositorio de certificados. Opcionalmente, también puedes utilizar SSH, pero requiere un paso diferente para ejecutar.

# ios/Matchfilegit_url("https://github.com/gitusername/certificates")storage_mode("git")type("appstore")

A continuación, vamos a generar los certificados y entrarás a tus credenciales cuando se te pregunte con Fastlane Match.

Te pedirán que ingreses una contraseña. Recuerda correctamente porque se utilizará más tarde por las Acciones de GitHub para descifrar tu repositorio de certificados.

fastlane match appstore

Si todo salió bien, deberías ver algo así:

[01:40:52]: All required keys, certificates and provisioning profiles are installed 🙌

Si experimentaste algún problema con GitHub y los permisos necesarios, tal vez esta publicación te ayudará a generar tokens de autenticación para Git.

Los certificados y perfiles de configuración generados se suben a la carpeta de recursos de certificados.

Certificados de App Store Connect

Por último, abre tu project en Xcode, y actualiza el perfil de configuración de provisión para la configuración de lanzamiento de tu aplicación.

Certificados de XCode

Algunas cosas a tener en cuenta 💡

MATCH

Para que la CI/CD importe los certificados y perfiles de configuración, necesita tener acceso a la carpeta de certificados. Puedes hacer esto generando un token de acceso personal (que se debe haber utilizado antes) que tenga el alcance para acceder o leer repositorios privados.

En GitHub, ve a ConfiguraciónConfiguración de desarrolladorTokens de acceso personal → haz clic Generate New Token → marca la casilla repo scope → haz clic luego Generate token.

Crear token de acceso personal

Tener una copia del token de acceso personal generado. Lo utilizarás más tarde para la variable de entorno GIT_TOKEN.

Reemplaza luego tu archivo match generado en la carpeta de Fastlane por Matchfile

CERTIFICATE_STORE_URL = ENV["CERTIFICATE_STORE_URL"]
GIT_USERNAME = ENV["GIT_USERNAME"]
GIT_TOKEN = ENV["GIT_TOKEN"]
FASTLANE_APPLE_ID = ENV["FASTLANE_APPLE_ID"]

git_url(CERTIFICATE_STORE_URL)
storage_mode("git")
type("appstore")
git_basic_authorization(Base64.strict_encode64("#{GIT_USERNAME}:#{GIT_TOKEN}"))
username(FASTLANE_APPLE_ID)

Se utilizará por las Acciones de GitHub para importar los certificados y perfiles de configuración de la aplicación. Y la variable se establecerá en GitHub Secrets, en lugar de codificarlos en el archivo.

Procesamiento de construcción

En las Acciones de GitHub se facturan según los minutos que has utilizado para ejecutar tu flujo de trabajo de CI/CD. De la experiencia, tarda unos 10–15 minutos antes de que una construcción pueda ser procesada en App Store Connect.

Para proyectos privados, el costo estimado por build puede llegar a $0.08/min x 15 min = $1.2, o más, dependiendo de la configuración o dependencias de tu proyecto.

Si compartes las mismas preocupaciones por el precio que yo tengo para proyectos privados, puedes mantener el skip_waiting_for_build_processing ¿Qué hay de malo? Tienes que actualizar manualmente la conformidad de tu aplicación en App Store Connect después de que se haya procesado el build, para poder distribuir el build a tus usuarios. true.

Este es solo un parámetro opcional para actualizar si quieres ahorrar minutos de build para proyectos privados. Para proyectos gratuitos, esto no debería ser un problema en absoluto. Consulta

precios 3. Configura __CAPGO_KEEP_0__ Acciones.

Configura GitHub secretos

Configure GitHub secrets

? Bueno, ya no es un secreto – provienen de tu proyecto secreto. 🤦 ENV para proyectos privados, el costo estimado por build puede llegar a ser más alto, dependiendo de la configuración o dependencias de tu proyecto.

Establecer GitHub secretos

1. APP_STORE_CONNECT_TEAM_ID - el ID de tu equipo de App Store Connect si estás en múltiples equipos.

2. DEVELOPER_APP_ID - en App Store Connect, ve a la aplicación → Información de la aplicación → Desplázate hacia abajo hasta la General Information sección de tu aplicación y busca Apple ID.

3. DEVELOPER_APP_IDENTIFIER - el identificador de paquete de tu aplicación.

4. DEVELOPER_PORTAL_TEAM_ID - el ID de tu equipo de Developer Portal si estás en múltiples equipos.

5. FASTLANE_APPLE_ID - el ID de Apple o correo electrónico del desarrollador que utilizas para administrar la aplicación.

6. GIT_USERNAME &amp; GIT_TOKEN - Tu nombre de usuario de Git y tu token de acceso personal.

7. MATCH_PASSWORD - la passphrase que asignaste al inicializar match, se utilizará para descifrar los certificados y perfiles de configuración de la aplicación.

8. PROVISIONING_PROFILE_SPECIFIER - match AppStore <YOUR_APP_BUNDLE_IDENTIFIER>, por ejemplo. match AppStore com.domain.blabla.demo.

9. TEMP_KEYCHAIN_USER &amp; TEMP_KEYCHAIN_PASSWORD - asigna un usuario y contraseña de una cuenta temporal para tu flujo de trabajo.

10. APPLE_KEY_ID — App Store Connect API Clave 🔺ID de Clave.

11. APPLE_ISSUER_ID — App Store Connect API Clave 🔺ID de Emisor.

12. APPLE_KEY_CONTENT — App Store Connect API Clave 🔺 Archivo de Clave o contenido de la Clave de .p8, verificarlo

13. CERTIFICATE_STORE_URL — La URL del repositorio de tus claves Match (por ejemplo: https://github.com/***/fastlane_match.git)

4. Configura el archivo de flujo de trabajo GitHub.

Crear un directorio de flujo de trabajo GitHub.

cd .github/workflows

Inside the workflow carpeta, crea un archivo llamado build-upload-ios.ymly agrega lo siguiente.

name: Build source code on ios

on:
  push:
    tags:
      - '*'

jobs:
  build_ios:
    runs-on: macOS-latest
    steps:
      - uses: actions/checkout@v6
      - name: set Node.js
        uses: actions/setup-node@v6
        with:
          node-version: '24'
          cache: npm
      - name: Install dependencies
        id: install_code
        run: npm ci
      - name: Build
        id: build_code
        run: npm run build
      - uses: actions/cache@v5
        with:
          path: ios/App/Pods
          key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }}
          restore-keys: |
            ${{ runner.os }}-pods-
      - name: Sync
        id: sync_code
        run: npx cap sync
      - uses: ruby/setup-ruby@v1
        with:
          ruby-version: 2.7.2
      - uses: maierj/fastlane-action@v2.3.0
        env:
          DEVELOPER_APP_IDENTIFIER: ${{ secrets.DEVELOPER_APP_IDENTIFIER }}
          DEVELOPER_APP_ID: ${{ secrets.DEVELOPER_APP_ID }}
          PROVISIONING_PROFILE_SPECIFIER: match AppStore ${{ secrets.DEVELOPER_APP_IDENTIFIER }}
          TEMP_KEYCHAIN_USER: ${{ secrets.TEMP_KEYCHAIN_USER }}
          TEMP_KEYCHAIN_PASSWORD: ${{ secrets.TEMP_KEYCHAIN_PASSWORD }}
          APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }}
          APPLE_KEY_ID: ${{ secrets.APPLE_KEY_ID }}
          APPLE_KEY_CONTENT: ${{ secrets.APPLE_KEY_CONTENT }}
          CERTIFICATE_STORE_URL: https://github.com/${{ secrets.CERTIFICATE_STORE_REPO }}.git
          GIT_USERNAME: ${{ secrets.GIT_USERNAME }}
          GIT_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
          FASTLANE_APPLE_ID: ${{ secrets.FASTLANE_APPLE_ID }}
          MATCH_USERNAME: ${{ secrets.FASTLANE_APPLE_ID }}
          MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
          APP_STORE_CONNECT_TEAM_ID: ${{ secrets.APP_STORE_CONNECT_TEAM_ID }}
          DEVELOPER_PORTAL_TEAM_ID: ${{ secrets.DEVELOPER_PORTAL_TEAM_ID }}
        with:
          lane: closed_beta
      - name: Upload release bundle
        uses: actions/upload-artifact@v2
        with:
          name: ios-release
          path: ./App.ipa
          retention-days: 60

This workflow should be triggered after each GitHub etiquetasi necesitas automatizar la etiqueta, por favor, consulta Automatic build and release with GitHub actions acciones

primero.

Luego, este flujo de trabajo extraerá tus dependencias NodeJS, las instalará y construirá tu aplicación de JavaScript.

Your App doesn’t need to use Ionic, only Capacitor base is mandatory., it can have old Cordova module, but Capacitor JS plugin should be preferred.

No es necesario que tu aplicación utilice Ionic, solo es necesario que tenga una base de

Haz un commit

Hacer un commitAl hacerlo, deberías ver el flujo de trabajo activo en el repositorio.

Activar el flujo de trabajo

Pushear los nuevos commits a la rama main o development ¿Cómo desencadenar el flujo de trabajo?

Para desencadenar el flujo de trabajo

Comenzado con commit

Después de unos minutos, el build debería estar disponible en tu panel de control de App Store Connect.

Panel de control de Testflight

Sí, puedes, y es sencillo.

Imagina que tienes un repositorio privado, y has utilizado los minutos del plan gratuito y no quieres pagar por nuevas versiones, o tal vez prefieres enviar la aplicación manualmente.

Vamos por ello

Ok, primero debemos crear en mi_proyecto_path/fastlane un archivo llamado .env, justo en el mismo camino que Fastfile, para poder crear las mismas propiedades secretas encontradas en nuestro ___CAPGO_KEEP_0__, a_s a continuación: properties found in our _GitHub, a_s below:

.archivo de entorno para desplegar desde la máquina local

Ahora, puedes ir al terminal y lanzar el Fastlane desde tu máquina:

fastlane closed_beta

❌ Esencial sobre el archivo de entorno ya que preferimos no exponer esta información, debemos agregarlo en nuestro .gitignore, algo así: ❌

fastlane/*.env

Debería funcionar de la misma manera que sucede desde GitHub Acciones en la máquina remota pero en nuestra máquina local. 🍻

Correr Fastlane local

Ejecución en Terminal: $ Fastlane closed_beta

Si has llegado hasta aquí, mi felicitación, ahora tienes un proceso automatizado completo para tus aplicaciones iOS con Fastlane y GitHub Acciones.

Cada vez que envíes un nuevo commit, se construirá una versión en el console de Google Play, canal beta. Me gustaría mejorar este blog con tus retroalimentaciones, si tienes alguna pregunta o sugerencia, por favor házmelo saber por correo electrónico martin@capgo.app

Construir en tu dispositivo

Si todavía necesitas construir en tu dispositivo, debes agregarlos manualmente a la provisionamiento. Conecta tu dispositivo a tu Mac y abre el menú de dispositivo encontrar dispositivo menú iOS Luego copia tu identificador encontrar identificador iOS Y luego inicia el comando: fastlane register_new_device Te pedirá que establezcas un nombre de dispositivo y el identificador: establecer identificador ios

si tienes problemas

Si tienes problemas con el dispositivo de desarrollo no puedes probar, etc. generalmente se resuelve con esto.

Hay un comando mágico que puede salvarte:

fastlane match nuke development
fastlane match development

Luego: Limpia el proyecto manteniendo presionada la tecla Shift(⇧)+Command(⌘)+K o seleccionando Product &gt; Limpia (puede estar etiquetado como &quot;Limpia carpeta de compilación&quot;)

Luego intenta ejecutar de nuevo la aplicación en tu dispositivo.

Gracias

Este blog se basa en los siguientes artículos:

Keep going from Automatic Capacitor IOS build with GitHub actions using match

If estás utilizando Automatico Capacitor build de IOS con GitHub acciones utilizando match 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 Integración de CI/CD, y GitHub integración de acciones para los detalles de implementación en GitHub Acciones de Integración.

Actualizaciones en vivo para aplicaciones de Capacitor

Cuando un bug en la capa web está activo, 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.

soporte humano de Martin

Comience ahora

Últimas noticias de nuestro Blog

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