Despliega automáticamente tus aplicaciones móviles con prácticas modernas DevOps en AWS

Claudia Márquez
Caleidos
Published in
4 min readNov 16, 2021

Es algo muy común que los equipos desarrolladores de aplicaciones móviles aún no aprovechan los beneficios de la integración contínua y el despliegue continuo. Si tu equipo todavía realiza los builds de manera manual en una computadora local para luego cargarlos a las tiendas de Google y Apple, este tutorial tiene lo necesario para que empiecen a utilizar prácticas modernas de DevOps.

En este post vamos a ver en detalle cómo realizar la integración continua para una aplicación Android desarrollada en Flutter utilizando AWS CodeCommit, AWS Codebuild y AWS Codepipeline. Si bien las aplicaciones de Flutter son híbridas, el proceso de compilación para Android y iOS tiene pasos distintos por los requerimientos de sistemas operativos y en este post nos enfocaremos en Android.

Configuración para firmar la aplicación

Para generar un build de la aplicación que pueda subirse al Play Store es importante configurar la aplicación para utilizar llaves para realizar la firma. Puedes seguir la documentación de Flutter para realizar esta configuración.

Creación de secretos en Parameter Store

Es importante que el archivo upload-keystore.jks no sea versionado y que manejemos los parámetros de la firma de manera segura. Para poder manejar seguramente los parámetros de la firma de la aplicación vamos a utilizar el servicio AWS SSM Parameter Store para almacenarlos y luego pasarlos como variable de entorno en el proyecto de CodeBuild.

Pasos para crear el secreto para guardar la contraseña de la firma

  1. Ingresa al servicio AWS SSM Parameter Store y selecciona el botón Create Parameter
  2. En el campo name escribir /FLUTTER/KEYPASSWORD
  3. En Type seleccionar SecureString
  4. En el campo Value escribir la clave del keystore

Pasos para crear el secreto para guardar la clave de la firma:

  1. Debemos encriptar los contenidos del archivo upload-keystore.jks en base64 con el siguiente comando:
    base64 ~/upload-keystore.jks > encoded-keystore.txt
  2. Ingresa al servicio AWS SSM Parameter Store y selecciona el botón Create Parameter
  3. En el campo name escribir /FLUTTER/KEYSTORE
  4. En Type seleccionar SecureString
  5. En el campo Value pegar el contenido del archivo encoded-keystore.txt

Creación de buildspec.yaml

AWS Codebuild utiliza el archivo buildspec.yaml para poder especificar los pasos que realizará durante la compilación de la aplicación.

En la compilación de una aplicación de Flutter debemos tener en cuenta que realizaremos los siguientes pasos:

  • Instalación de sdk de Android
  • Instalación de flutter
  • Configuración de archivo de llaves para firma de aplicación
  • Compilación de aplicación

El siguiente buildspec.yaml cuenta con los pasos. Debemos crear este archivo en la raíz de nuestro proyecto.

version: 0.2phases:  install:    runtime-versions:      # Usamos el runtime de android y java provisto por CodeBuild      android: 29      java: openjdk8    commands:      # Aceptar licencias de SDK e instalar líneas de comando      - $ANDROID_HOME/tools/bin/sdkmanager --licenses      - $ANDROID_HOME/tools/bin/sdkmanager --install "cmdline-tools;latest"      # Instalar Flutter      - wget -nv https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_2.5.3-stable.tar.xz      - tar xf flutter_linux_2.5.3-stable.tar.xz      - export PATH="$PATH:`pwd`/flutter/bin"      # Realizar precache de flutter y validar la configuración con flutter doctor      - flutter precache      - flutter doctor  build:    commands:      # Obtener los parametros de SSM y generar el archivo keystore      - KEY=`aws ssm get-parameter --name "$KEYSTORE" --with-decryption --query 'Parameter.Value' --output text`      - PASSWORD=`aws ssm get-parameter --name "$KEYPASSWORD" --with-decryption --query 'Parameter.Value' --output text`      - echo "$KEY" | base64 --decode  >> `pwd`/keystore.jks      - echo "storePassword=$PASSWORD" >> android/key.properties      - echo "keyPassword=$PASSWORD" >> android/key.properties      - echo "keyAlias=upload" >> android/key.properties      - echo "storeFile=`pwd`/keystore.jks" >> android/key.properties      # Realizar la configuración      - flutter build appbundleartifacts:  files:    # Exportamos el build como artefacto    - build/app/outputs/bundle/release/*  discard-paths: yes

AWS Codebuild cuenta con versiones de tiempo de ejecución que ya cuentan con el sdk de android instalado, por lo que simplificará varios pasos del archivo.

Creación de un pipeline de integración continua

Hemos preparado una plantilla Cloudformation que realizar la creación de los siguientes elementos:

  • El pipeline de AWS CodeDeploy
  • El proyecto de AWS CodeBuild
  • El repositorio de AWS CodeCommit

Haz click aquí para lanzar la plantilla ahora

Puedes modificar los parámetros del key y el bucket apuntando a unos propios donde tengas el código fuente de tu aplicación. De otra manera, se creará el repositorio AWS CodeCommit con una aplicación básica de Flutter, incluyendo las modificaciones mencionadas en el post.

Ejecución del flujo de integración continua

Una vez desplegada la plantilla podemos ir a AWS CodePipeline para revisar nuestro flujo de despliegue. En este momento tendrá dos pasos:

  1. La obtención del código fuente de AWS CodeCommit
  2. La compilación con AWS CodeBuild

En el paso de compilación podemos hacer clic en “Details” para entrar a ver el detalle de la compilación. Podemos hacer click en Build Details y en el apartado de Artifacts estará el enlace para poder descargar el artefacto en S3 que contendrá el app bundle creado.

En un próximo post veremos cómo podemos crear un paso adicional en nuestro flujo de despliegue que permitirá realizar el despliegue contínuo utilizando Fastlane para poder subir nuestra aplicación automáticamente a la tienda de Play Store.

¿Tu empresa quiere implementar prácticas DevOps? Contáctanos para ayudarte con tu iniciativa. En Caleidos hacemos que la innovación suceda.

--

--