En este instructivo, se describe cómo crear una canalización de entrega para dispositivos móviles sin servidores en Google Cloud:
- Primero, te guía en la configuración de una aplicación para Android de prueba que puedes compilar y distribuir con los comandos Gradle en tu máquina local. Con estos comandos, se crea el paquete de aplicación para Android (APK) y se lo sube a Firebase App Distribution con el fin de distribuirlo a los verificadores Beta.
- A continuación, a fin de automatizar este proceso, instala el compilador de Android para Cloud Build y configura un activador de compilación, de modo que se active la compilación y distribución de la aplicación para Android de forma automática con cambios en su código fuente.
Objetivos
- Crear una tarea de compilación que compile un APK firmado
- Crear una tarea de compilación que use Firebase App Distribution para distribuir compilaciones nuevas
- Instalar el compilador de Android con las dependencias del SDK de Android requeridas
- Crear un activador de compilación en Google Cloud que use el compilador de Android para compilar el APK firmado y distribuirlo con Firebase App Distribution
Costos
En este instructivo, se usan componentes facturables de Google Cloud, incluidos los siguientes:
La imagen base del compilador de Android es de alrededor de 1.9 GB. La Calculadora de precios estima que el costo de almacenamiento de un entorno de 2 GB es de alrededor de $0.05 por mes. La compilación de la imagen base del compilador de Android demora alrededor de 11 minutos y cuesta $0.03. Cada compilación adicional debería tomar alrededor de 5 minutos y costar $0.02. Consulta los precios de Cloud Build para obtener más información.
Antes de comenzar
- Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
-
En la página del selector de proyectos de Google Cloud Console, selecciona o crea un proyecto de Google Cloud.
-
Asegúrate de que la facturación esté habilitada para tu proyecto de Cloud. Obtén información sobre cómo verificar si la facturación está habilitada en un proyecto.
-
Habilita la API de Compute Engine.
- Instala y, luego, inicializa Google Cloud CLI.
-
En la página del selector de proyectos de Google Cloud Console, selecciona o crea un proyecto de Google Cloud.
-
Asegúrate de que la facturación esté habilitada para tu proyecto de Cloud. Obtén información sobre cómo verificar si la facturación está habilitada en un proyecto.
-
Habilita la API de Compute Engine.
- Instala y, luego, inicializa Google Cloud CLI.
- Asegúrate de tener Gradle instalado en tu computadora.
- Asegúrate de tener Android Studio instalado en tu computadora.
- Asegúrate de que Git esté instalado en tu computadora.
En este instructivo se supone lo siguiente:
- Ejecutas macOS o Linux. Algunos de estos procedimientos se pueden adaptar a un entorno de Windows, pero el instructivo no proporciona instrucciones completas para ese caso práctico.
- Estás familiarizado con el desarrollo de Android, Android Studio, Gradle y Git.
Haz que la compilación Beta de Android firmada trabaje de forma local
En esta sección, configurarás una aplicación para Android de prueba en Android Studio. La aplicación se puede compilar y distribuir mediante las tareas de compilación de Gradle que se ejecutan en la ventana de la terminal de tu computadora.
Crea una aplicación para Android de prueba a fin de compilarla
En Android Studio, crea un proyecto de Android nuevo que use una actividad vacía.
En las capturas de pantalla siguientes, se muestran los pasos del asistente para realizar esta tarea.
Desde la ventana de la terminal en tu computadora, cambia al directorio en el que creaste tu aplicación de prueba:
cd ${HOME}/android-apps/TestAndroidBuild
En ese directorio, inicializa un repositorio de Git:
git init && git checkout -b develop
Edita el archivo
.gitignore
y agrega los nombres de archivos y extensiones que Git no debe enviar a tu repositorio del código fuente:cat >> .gitignore <<EOF google-services.json app-distro.json keystore.properties EOF
Confirma la aplicación en el repositorio:
git add -A git commit -m "empty application"
Configura Google Cloud CLI para usar tu proyecto. Para
[PROJECT_NAME]
, usa el nombre del proyecto que seleccionaste o creaste.PROJECT=[PROJECT_NAME] gcloud config configurations create $PROJECT gcloud config config set project $PROJECT
Crea un repositorio de Cloud Source Repositories para tu aplicación para Android:
gcloud source repos create android-application
Agrega el repositorio de Cloud Source Repositories como un repositorio remoto de tu aplicación para Android:
git remote add google \ https://source.developers.google.com/p/${PROJECT}/r/android-application
Agrega Firebase a tu aplicación
Ve a Firebase console:
Haz clic en Agregar proyecto.
En Ingresa el nombre de tu proyecto (Enter your project name), selecciona el proyecto de Google Cloud que creaste antes:
.
Confirma el plan de facturación Blaze de Firebase.
Selecciona si deseas habilitar Google Analytics. Para este instructivo, no necesitas usar Analytics.
Espera a que se cree el proyecto Firebase y, luego, haz clic en Continuar.
Sigue las instrucciones de la página sobre cómo agregar Firebase al proyecto de Android a fin de agregar Firebase a tu aplicación para Android.
Asegúrate de que tu archivo
google-services.json
se movió al siguiente directorio:{HOME}/android-apps/TestAndroidBuild
Sigue las instrucciones de la página sobre cómo comenzar a usar Firebase Crashlytics para agregar Firebase Crashlytics a tu proyecto de Android.
Cambia los directorios al directorio de nivel de la app de tu proyecto:
cd {HOME}/android-apps/TestAndroidBuild/app
Crea una cuenta de servicio de Google Cloud con la función de administrador de Firebase:
gcloud iam service-accounts create app-distro --display-name=app-distro APP_DISTRO_SA=$(gcloud iam service-accounts list --filter="displayName:app-distro" --format='value(email)') gcloud projects add-iam-policy-binding $PROJECT --role roles/firebase.admin --member serviceAccount:$APP_DISTRO_SA gcloud iam service-accounts keys create app-distro.json $APP_DISTRO_SA
Crea la clave de firma y el almacén de claves
Si deseas distribuir la aplicación para Android previo al lanzamiento, debes firmar la aplicación con un certificado almacenado en un archivo de almacén de claves (.jks
) de Java.
En la ventana de la terminal, cambia al directorio superior de tu aplicación:
cd ${HOME}/AndroidStudioProjects/TestAndroidBuild
Crea el almacén de claves y la clave de Java a fin de firmar la aplicación, también crea el archivo
keystore.properties
que almacena el alias de la clave, la contraseña y la ruta relativa para el archivo del almacén de claves:JKS_PASSWORD=$(openssl rand -base64 12) keytool -genkey -noprompt -keystore ../signing/android.jks \ -alias android-key \ -dname "CN=example.com, OU=IT, O=Example, L=Sunnyvale, S=California, C=US" \ -storepass ${JKS_PASSWORD} \ -keypass ${JKS_PASSWORD} cat > ../signing/keystore.properties <<EOF storeFile=../signing/android.jks storePassword=${JKS_PASSWORD} keyPassword=${JKS_PASSWORD} keyAlias=android-key EOF
Encripta los archivos de secretos de Android y agrégalos a tu repositorio de código fuente.
Habilita el servicio de administración de claves:
gcloud services enable cloudkms.googleapis.com
Crea un llavero de claves para almacenar tus claves:
gcloud kms keyrings create my-app --location=global
Crea una clave para almacenar tus secretos:
gcloud kms keys create android-builder \ --location=global \ --keyring=my-app \ --purpose=encryption
Agrega la función de encriptación y desencriptación a la cuenta de servicio de Cloud Build:
CLOUDBUILD_ACCOUNT=$(gcloud projects get-iam-policy $PROJECT \ --filter="(bindings.role:roles/cloudbuild.builds.builder)" \ --flatten="bindings[].members" \ --format="value(bindings.members[])" | tail -1) gcloud kms keys add-iam-policy-binding android-builder --location=global \ --keyring=my-app --member="${CLOUDBUILD_ACCOUNT} \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
Encripta el archivo
keystore.properties
:gcloud kms encrypt --plaintext-file=signing/keystore.properties \ --ciphertext-file=signing/keystore.properties.enc --location=global \ --keyring=my-app --key=android-builder
Agrega los archivos de firma a tu repositorio de código fuente:
git add signing git commit -m "encrypted signing information"
Encripta el archivo
google-services.json
:gcloud kms encrypt --plaintext-file=app/google-services.json \ --ciphertext-file=app/google-services.json.enc --location=global \ --keyring=my-app --key=android-builder
Agrega el archivo
google-services.json.enc
a tu repositorio de código fuente:git add app/google-services.json.enc git commit -m "encrypted application account"
Encripta el archivo
app-distro.json
:gcloud kms encrypt --plaintext-file=app-distro.json \ --ciphertext-file=app-distro.json.enc \ --location=global \ --keyring=my-app --key=android-builder
Agrega el archivo
app-distro.json.enc
a tu repositorio de código fuente:git add app-distro.json.enc git commit -m "encrypted service account"
Agrega Firebase App Distribution
- Sigue las instrucciones de la página Distribuye apps para Android a los verificadores con Gradle a fin de agregar Firebase App Distribution a tu aplicación.
Crea un grupo de distribución de Firebase
Ve a Firebase console:
Haz clic en la app que creaste para Firebase. El nombre es similar al nombre del proyecto de Cloud.
Haz clic en Distribución de la app.
Haz clic en Verificadores.
Haz clic en Agregar verificadores.
Ingresa tu dirección de correo electrónico.
Haz clic en Crear un grupo de verificadores.
Ingresa el nombre beta-testers.
Haz clic en Agregar verificadores.
Agrega tu dirección de correo electrónico al grupo beta-testers.
Actualiza el archivo build.gradle de modo que incluya las opciones de configuración de la firma y distribución de Firebase.
Actualiza el archivo
{HOME}/AndroidStudioProjects/TestAndroidBuild/build.gradle
con las líneas en negrita debajo:buildscript { ext.kotlin_version = '1.3.41' repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.5.0' classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version' classpath 'com.google.firebase:firebase-appdistribution-gradle:2.0.0' classpath 'com.google.gms:google-services:4.3.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } }
Agrega los fragmentos siguientes al archivo
{HOME}/AndroidStudioProjects/TestAndroidBuild/app/build.gradle
:android { // ... def debugKeystorePropertiesFile = rootProject.file("signing/keystore.properties") def keystoreProperties = new Properties() keystoreProperties.load(new FileInputStream(debugKeystorePropertiesFile)) //... android { //... signingConfigs { debug { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile file(keystoreProperties['storeFile'].trim()) storePassword keystoreProperties['storePassword'] } } buildTypes { debug { firebaseAppDistribution { releaseNotesFile="release-notes.txt" groups="beta-testers" } } // ... packagingOptions { exclude "app-distro.json" } } }
Corrige la dependencia de prueba en el archivo de Gradle
Asegúrate de que la línea en negrita siguiente esté en tu archivo
${HOME}/AndroidStudioProjects/TestAndroidBuild/app/build.gradle
:dependencies { //... androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' }
Compila y distribuye la app desde tu computadora
En la ventana de la terminal, asegúrate de estar en el directorio superior para tu aplicación de prueba:
{HOME}/AndroidStudioProjects/TestAndroidBuild
Compila y distribuye la app:
gradle assembleDebug appDistributionUploadDebug
Se envía un correo electrónico al grupo de distribución con un vínculo que permite al usuario instalar la aplicación.
Guarda los cambios de la compilación en el repositorio de código fuente
Confirma tus cambios al repositorio de código fuente:
git add app/build.gradle && git commit -m "Update build for distribution."
Crea tu compilación de Android en Cloud Build
En este punto, tienes tareas de compilación de Gradle que compilan y distribuyen tu aplicación para Android. En esta sección, configurarás Cloud Build para que ejecute estas tareas de compilación cada vez que haya un cambio en la rama de la instancia principal del Cloud Source Repository.
Establece la variable de entorno
PROJECT
:export PROJECT=$(gcloud config get-value project)
Crea el bucket de almacenamiento que usará el compilador de Android para guardar sus dependencias entre las compilaciones:
gsutil mb gs://$PROJECT-cache-bucket
Crea el bucket de almacenamiento que usará el compilador de Android para aumentar la cantidad de compilaciones de Android:
gsutil mb gs://$PROJECT-config-bucket
Crea el bucket de almacenamiento que usará el compilador de Android para almacenar artefactos:
gsutil mb gs://$PROJECT-artifact-bucket
Crea el compilador de Android
En una ventana de la terminal, clona el repositorio de compiladores de comunidad en un directorio fuera del directorio de tu aplicación para Android:
git clone https://github.com/GoogleCloudPlatform/cloud-builders-community
El repositorio de GitHub contiene los compiladores mantenidos por la comunidad.
Cambia al directorio que contiene el compilador
tar
:cd cloud-builders-community/tar
Agrega el compilador
tar
a tu proyecto:gcloud builds submit --config=cloudbuild.yaml
Cambia al directorio que contiene el compilador de Android:
cd ../android
Crea el compilador de Android y pasa la versión del SDK de destino como una sustitución:
gcloud builds submit --config=cloudbuild.yaml \ --substitutions=_ANDROID_VERSION=28
Crea el activador de compilación de la aplicación para Android
En esta sección, crearás el activador de compilación de la aplicación que usa el compilador de Android de la sección anterior con el fin de compilar y distribuir la aplicación para Android.
En la ventana de la terminal, copia el archivo de ejemplo
cloudbuild.yaml
desde el directorioexamples/
del compilador de Android en el directorio de tu aplicación para Android de prueba:cd ${HOME}/android-apps/TestAndroidBuild cp ${HOME}/cloud-builders-community/android/examples/build-test-deploy-firebase-distro.yaml \ ./cloudbuild.yaml
Agrega el nuevo archivo
cloudbuild.yaml
a la ramadevelop
de tu repositorio de código fuente:git add cloudbuild.yaml && git commit -m "Add android builder to project."
En la consola, ve a la página Activadores de compilación:
Haz clic en Crear activador.
Selecciona el repositorio android-application.
En Nombre, ingresa android-application-build.
En Configuración, selecciona Archivo de configuración de Cloud Build (yalm o json).
En Ubicación de cloudbuild.yaml , ingresa
/cloudbuild.yaml
.Haz clic en Agregar elemento. Esto te permite establecer variables para la compilación.
Para cada variable de la siguiente tabla, ingresa el nombre de variable (incluido el guión bajo inicial) y, luego, el valor de tu proyecto.
Variable Valor Propósito _CONFIG_BUCKET
El depósito usado para almacenar el número de compilación.gs://[PROJECT_NAME]-config-bucket
La URL del bucket que se usará para almacenar el número de compilación. _CACHE_BUCKET
El depósito que se usará para almacenar en caché las dependencias de compilación.gs://[PROJECT_NAME]-cache-bucket
Evita que Gradle descargue las mismas dependencias de Internet con cada compilación. _ARTIFACT_BUCKET
El depósito de Cloud Storage usado para almacenar artefactos de compilación.gs://[PROJECT_NAME]-artifact-bucket
El compilador de Android almacena aquí artefactos intermedios y de otro tipo durante la compilación. Haz clic en Crear activador.
Ejecuta el activador de compilación de la aplicación
Ahora, puedes probar que el activador de compilación de la aplicación funciona y confirmar que la aplicación se distribuye a tu correo electrónico.
En una ventana de la terminal, cambia los directorios al directorio de nivel superior de tu proyecto de la aplicación para Android de prueba:
cd ${HOME}/android-apps/TestAndroidBuild
Para activar la compilación, envíala a la rama de la instancia principal del repositorio del código fuente:
git push google develop
En la consola, ve a la página de Cloud Build.
Haz clic en la última compilación en progreso para ver el resultado de la compilación de la aplicación.
Limpia
Una vez que hayas terminado el instructivo, debes limpiar los recursos que creaste en Google Cloud para que no se te facturen en el futuro. En las secciones siguientes, se describe cómo borrar o desactivar estos recursos.
Borra el proyecto
La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.
Para borrar el proyecto, sigue estos pasos:
- En la consola, ve a la página Administrar recursos.
- En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
- En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.
Borra registros de imágenes
Borra los registros de imágenes de tu imagen del SDK de Android y la imagen de la aplicación para Android.
- En el menú de navegación a la izquierda en la consola, desplázate a la sección Herramientas y haz clic en Container Registry > Imágenes.
Selecciona todas las imágenes.
Haz clic en Borrar (Delete).
Borra depósitos de Cloud Storage
Borra los depósitos de Cloud Storage que contengan la información de firma de Android y las propiedades de Fabric. En Cloud Shell, usa estos comandos y sustituye tus valores por los marcadores de posición:
Configura la variable de entorno
PROJECT
.export PROJECT=$(gcloud config get-value project)
Borra los depósitos de almacenamiento creados para la compilación.
gsutil rm gs://$PROJECT-cache-bucket gsutil rm gs://$PROJECT-config-bucket gsutil rm gs://$PROJECT-artifact-bucket
Borra los activadores de compilación
- Borra el activador de compilación base del SDK de Android.
- Borra el activador de compilación de Android.
Borra la aplicación de Firebase
Ve a Firebase console.
Selecciona el proyecto de Firebase que creaste para el instructivo. Debe tener un nombre similar a [PROJECT_NAME].
En el menú de configuración, selecciona Configuración del proyecto (Project Settings).
Desplázate hasta la parte inferior de la página y haz clic en
.
¿Qué sigue?
- Revisa la documentación de Android con más detalle.
- Revisa la documentación de Firebase con más detalle.