Se asume que tanto Firebase como fastlane están instalados y configurados previamente, por lo que solo necesitamos instalar el plugin firebase_app_distribution (repo). Ejecutamos el siguiente comando dentro de nuestro directorio android:

bundle exec fastlane add_plugin firebase_app_distribution

Esto genera cambios en los archivos Gemfile, Gemfile.lock para agregar la configuración del path donde encontraremos los plugins, siendo el defecto el archivo Pluginfile:

source "https://rubygems.org"

gem "fastlane"

plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
eval_gemfile(plugins_path) if File.exist?(plugins_path)

en base a esta configuración se genera un archivo nuevo llamado Pluginfile con el siguiente contenido:

gem 'fastlane-plugin-firebase_app_distribution'

A continuación configuramos el carril en el archivo Fastfile:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
platform :android do
    desc "Enviar Beta a Firebase"
    lane :firebase do
        # Generar un APK de release
        gradle(task: 'assemble', build_type: 'Release')

        # Configuración Firebase
        firebase_app_distribution(
            # App Id:
            app: "x:xxxxxxxxxxxx:android:xxxxxxxxxxxxxxxxxxxxxx",
            
            # Lista de correos de los testers
            testers: "alguien@correo.com, otro@correo.com",
            
            # Notas de Liberación
            release_notes: "Una lista de cambios y su descripción para nuestros testers"  
        )
    end
end

Este pudiera ser el fin de esta entrada del blog pero, por el momento, sigo teniendo la duda de si App Id es un dato sensible que no deba ser agregado al control de versiones por temas de seguridad. Ante la duda lo consideraremos como un secreto por lo que implementaremos otra forma de obtener esa información de configuración sin necesidad de tenerla en el control de versiones.

Y lo mismo va para la lista de testers y las notas de liberación. Todos estos datos son de configuración y cambiarán continuamente por lo que hace sentido almacenarlos en el ambiente.

Nota: Existe una guía llamada The Twelve-Factor App que nos indica, entre otras cosas, que las configuraciones se deben de guardar siempre en el entorno y nunca en el control de versiones.

Estos secretos y/o datos de configuración se almacenarán en un archivo de ambiente el cual quedará siempre fuera del control de versiones. La ventaja de esta alternativa es que podemos definir diferentes ambientes dependiendo de las necesidades.

Para implementar esta solución instalaremos dotenv en la raíz del proyecto android:

En el archivo Gemfile agregar:

gem "dotenv"

y ejecutamos el siguiente comando para instalar todas las dependencias:

bundle update

A continuación creamos el archivo .env.default con las siguientes variables:

FIREBASEAPPDISTRO_APP="x:xxxxxxxxxxxx:android:xxxxxxxxxxxxxxxxxxxxxx"
FIREBASEAPPDISTRO_TESTERS="alguien@correo.com, otro@correo.com"
FIREBASEAPPDISTRO_RELEASE_NOTES="Pruebas pruebas y más"

Este archivo se leerá automáticamente por fastlane para obtener los datos de configuración específicos de este plugin. Cabe mencionar que cada plugin maneja sus propias variables de ambiente por lo que si estamos usando algún otro plugin, tendremos que fijarnos en su documentación para ver que valores tendremos que declarar en el archivo .env.default:

Por último hay que modificar FastFile para eliminar todos estos datos, quedando de la siguiente forma:

desc "Enviar Beta a Firebase"
lane :firebase do
    gradle(task: 'assemble', build_type: 'Release')
    firebase_app_distribution()
end

Para probar, ejecutamos nuestro carril:

bundle exec fastlane firebase

Y comprobamos que todo haya funcionado correctamente.

Un último paso será modificar nuestro archivo .gitignore para NO agregar este archivo al control de versiones:

# Ignore dotenv
.env*