Saltar al contenido principal

Entrega continua con Flutter

Cómo automatizar la compilación y el lanzamiento continuos de tu aplicación Flutter.

Sigue las mejores prácticas de entrega continua con Flutter para asegurarte de que tu aplicación se entregue a tus probadores beta y se valide con frecuencia sin tener que recurrir a flujos de trabajo manuales.

Opciones de CI/CD

#

Hay varias opciones de integración continua (CI) y entrega continua (CD) disponibles para ayudar a automatizar la entrega de tu aplicación.

Opciones todo en uno con funcionalidad Flutter integrada

#

Integrar fastlane con flujos de trabajo existentes

#

Puedes usar fastlane con las siguientes herramientas:

Esta guía muestra cómo configurar fastlane y luego integrarlo con tus flujos de trabajo existentes de prueba e integración continua (CI). Para más información, consulta "Integrar fastlane con flujos de trabajo existentes".

fastlane

#

fastlane es una suite de herramientas de código abierto para automatizar lanzamientos y despliegues para tu aplicación.

Configuración local

#

Se recomienda probar el proceso de compilación y despliegue localmente antes de migrar a un sistema basado en la nube. También puedes optar por realizar la entrega continua desde una máquina local.

  1. Instala fastlane usando gem install fastlane o brew install fastlane. Visita las instrucciones de fastlane para más información.
  2. Crea una variable de entorno llamada FLUTTER_ROOT, y establécela en el directorio raíz de tu SDK de Flutter. (Esto es necesario para los scripts que realizan el despliegue para iOS).
  3. Create your Flutter project, and when ready, make sure that your project builds via
    • Android flutter build appbundle; y
    • iOS flutter build ipa.
  4. Initialize the fastlane projects for each platform.
    • Android En tu directorio [project]/android, ejecuta fastlane init.
    • iOS En tu directorio [project]/ios, ejecuta fastlane init.
  5. Edit the Appfiles to ensure they have adequate metadata for your app.
    • Android Comprueba que el package_name en [project]/android/fastlane/Appfile coincide con tu nombre de paquete en AndroidManifest.xml.
    • iOS Comprueba que el app_identifier en [project]/ios/fastlane/Appfile también coincide con el identificador de bundle de Info.plist. Completa apple_id, itc_team_id, team_id con la información de tu cuenta respectiva.
  6. Set up your local login credentials for the stores.
    • Android Sigue los pasos de configuración de Supply y asegúrate de que fastlane supply init sincronice con éxito los datos de tu consola de Play Store. Trata el archivo .json como si fuera tu contraseña y no lo subas a ningún repositorio de control de código fuente público.
    • iOS Tu nombre de usuario de iTunes Connect ya está en el campo apple_id de tu Appfile. Define la variable de entorno de la shell FASTLANE_PASSWORD con tu contraseña de iTunes Connect. De lo contrario, se te solicitará cuando realices la subida a iTunes/TestFlight.
  7. Set up code signing.
    • Android Sigue los pasos de firma de la aplicación Android.
    • iOS On iOS, create and sign using a distribution certificate instead of a development certificate when you're ready to test and deploy using TestFlight or App Store.
  8. Create a Fastfile script for each platform.
    • Android En Android, sigue la guía de despliegue beta de fastlane para Android. Tu edición podría ser tan simple como añadir una lane que llame a upload_to_play_store. Establece el argumento aab en ../build/app/outputs/bundle/release/app-release.aab para usar el app bundle que flutter build ya construyó.

    • iOS En iOS, sigue la guía de despliegue beta de fastlane para iOS. Puedes especificar la ruta del archivo (archive path) para evitar reconstruir el proyecto. Por ejemplo:

      ruby
      build_app(
        skip_build_archive: true,
        archive_path: "../build/ios/archive/Runner.xcarchive",
      )
      upload_to_testflight
      

Ahora estás listo para realizar despliegues localmente o migrar el proceso de despliegue a un sistema de integración continua (CI).

Ejecutar el despliegue localmente

#
  1. Build the release mode app.
    • Android flutter build appbundle.
    • iOS flutter build ipa.
  2. Run the Fastfile script on each platform.
    • Android cd android y luego fastlane [nombre de la lane que creaste].
    • iOS cd ios y luego fastlane [nombre de la lane que creaste].

Configuración de compilación y despliegue en la nube

#

Primero, sigue la sección de configuración local descrita en 'Configuración local' para asegurarte de que el proceso funcione antes de migrar a un sistema en la nube como Travis.

Lo principal a considerar es que, dado que las instancias en la nube son efímeras y no confiables, no dejarás tus credenciales (como el JSON de la cuenta de servicio de Play Store o tu certificado de distribución de iTunes) en el servidor.

Los sistemas de integración continua (CI) generalmente admiten variables de entorno encriptadas para almacenar datos privados. Puedes pasar estas variables de entorno usando --dart-define MY_VAR=MY_VALUE mientras compilas la aplicación.

Ten la precaución de no volver a mostrar los valores de esas variables en la consola en tus scripts de prueba. Esas variables tampoco están disponibles en las solicitudes de extracción (pull requests) hasta que se fusionen para garantizar que actores maliciosos no puedan crear una pull request que imprima estos secretos. Ten cuidado con las interacciones con estos secretos en las pull requests que aceptes y fusiones.

  1. Hacer que las credenciales de inicio de sesión sean efímeras.

    • Android On Android:
      • Remove the json_key_file field from Appfile and store the string content of the JSON in your CI system's encrypted variable. Read the environment variable directly in your Fastfile.
        upload_to_play_store(
          ...
          json_key_data: ENV['<variable name>']
        )
        
      • Serialize your upload key (for example, using base64) and save it as an encrypted environment variable. You can deserialize it on your CI system during the install phase with
        bash
        echo "$PLAY_STORE_UPLOAD_KEY" | base64 --decode > [path to your upload keystore]
        
    • iOS On iOS:
      • Mueve la variable de entorno local FASTLANE_PASSWORD para usar variables de entorno encriptadas en el sistema de CI.
      • El sistema de CI necesita acceso a tu certificado de distribución. Se recomienda el sistema Match de fastlane para sincronizar tus certificados entre máquinas.
  2. Se recomienda usar un Gemfile en lugar de utilizar un comando indeterminado gem install fastlane en el sistema de CI cada vez para garantizar que las dependencias de fastlane sean estables y reproducibles entre las máquinas locales y en la nube. Sin embargo, este paso es opcional.

    • In both your [project]/android and [project]/ios folders, create a Gemfile containing the following content:
      source "https://rubygems.org"
      
      gem "fastlane"
      
    • En ambos directorios, ejecuta bundle update y sube tanto Gemfile como Gemfile.lock al control de código fuente.
    • Cuando ejecutes localmente, usa bundle exec fastlane en lugar de fastlane.
  3. Crea el script de prueba de CI como .travis.yml o .cirrus.yml en la raíz de tu repositorio.

    • Consulta la documentación de fastlane CI para la configuración específica de CI.
    • Fragmentar tu script para que se ejecute tanto en plataformas Linux como macOS.
    • During the setup phase of the CI task, do the following:
      • Asegúrate de que Bundler esté disponible usando gem install bundler.
      • Ejecuta bundle install en [project]/android o [project]/ios.
      • Asegúrate de que el SDK de Flutter esté disponible y establecido en el PATH.
      • Para Android, asegúrate de que el SDK de Android esté disponible y de que la ruta ANDROID_SDK_ROOT esté configurada.
      • Para iOS, es posible que tengas que especificar una dependencia de Xcode (por ejemplo, osx_image: xcode9.2).
    • In the script phase of the CI task:
      • Ejecuta flutter build appbundle o flutter build ios --release --no-codesign --config-only, dependiendo de la plataforma.
      • cd android o cd ios
      • bundle exec fastlane [nombre de la lane]

Xcode Cloud

#

Xcode Cloud es un servicio de integración y entrega continua para compilar, probar y distribuir aplicaciones y frameworks para plataformas de Apple.

Requisitos

#

Script de compilación personalizado

#

Xcode Cloud reconoce scripts de compilación personalizados que se pueden usar para realizar tareas adicionales en un momento designado. También incluye un conjunto de variables de entorno predefinidas, como $CI_WORKSPACE, que es la ubicación de tu repositorio clonado.

Script post-clonación

#

Aprovecha el script de compilación personalizado posterior a la clonación que se ejecuta después de que Xcode Cloud clone tu repositorio de Git utilizando las siguientes instrucciones:

Crea un archivo en ios/ci_scripts/ci_post_clone.sh y agrega el contenido a continuación.

sh
#!/bin/sh

# Fail this script if any subcommand fails.
set -e

# The default execution directory of this script is the ci_scripts directory.
cd $CI_PRIMARY_REPOSITORY_PATH # change working directory to the root of your cloned repo.

# Install Flutter using git.
git clone https://github.com/flutter/flutter.git --depth 1 -b stable $HOME/flutter
export PATH="$PATH:$HOME/flutter/bin"

# Install Flutter artifacts for iOS (--ios), or macOS (--macos) platforms.
flutter precache --ios

# Install Flutter dependencies.
flutter pub get

# Install CocoaPods using Homebrew.
HOMEBREW_NO_AUTO_UPDATE=1 # disable homebrew's automatic updates.
brew install cocoapods

# Install CocoaPods dependencies.
cd ios && pod install # run `pod install` in the `ios` directory.

exit 0

Este archivo debe agregarse a tu repositorio de git y marcarse como ejecutable.

git add --chmod=+x ios/ci_scripts/ci_post_clone.sh

Configuración del flujo de trabajo

#

Un flujo de trabajo de Xcode Cloud define los pasos realizados en el proceso de CI/CD cuando se activa tu flujo de trabajo.

Para crear un nuevo flujo de trabajo en Xcode, sigue las siguientes instrucciones:

  1. Elige Product > Xcode Cloud > Create Workflow para abrir la hoja Create Workflow.

  2. Selecciona el producto (aplicación) al que se debe adjuntar el flujo de trabajo, luego haz clic en el botón Next.

  3. La siguiente hoja muestra una descripción general del flujo de trabajo predeterminado proporcionado por Xcode, y se puede personalizar haciendo clic en el botón Edit Workflow.

Cambios en las ramas

#

De forma predeterminada, Xcode sugiere la condición Cambios en las Ramas (Branch Changes) que inicia una nueva compilación para cada cambio en la rama predeterminada de tu repositorio de Git.

Para la variante de iOS de tu aplicación, es razonable que desees que Xcode Cloud active tu flujo de trabajo después de realizar cambios en tus paquetes de Flutter, o de modificar los archivos de código fuente de Dart o iOS dentro de los directorios lib\ y ios\.

Esto se puede lograr utilizando las siguientes condiciones de Archivos y Carpetas:

Cambios en las ramas del flujo de trabajo de Xcode

Siguiente número de compilación

#

Xcode Cloud establece de forma predeterminada el número de compilación para nuevos flujos de trabajo en 1 e incrementa este valor por cada compilación exitosa. Si estás utilizando una aplicación existente con un número de compilación más alto, deberás configurar Xcode Cloud para que use el número de compilación correcto para sus compilaciones simplemente especificando el Siguiente número de compilación en tu iteración.

Consulta Configurar el siguiente número de compilación para las compilaciones de Xcode Cloud para obtener más información.