Hablemos de Fastlane y de como usarlo

Hola, te presento a Fastlane

Recuerdo aun esos días de invierno cuando generaba mis certificates y provisioning profile de forma manual, la verdad es que eran buenos tiempos, todo hasta que empiezas a gestionar más aplicaciones, las cuales a su vez empiezan a tener widgets, una aplicación para Apple Watch y así, a eso agrégale que tu equipo va aumentando y uno de ellos revoca un certificado o quieres pasarte a otra maquina por X razones, mis días de invierno se convirtieron en días de infierno y de los queman con intensidad.

Un día cualquiera en facebook me pongo a ver una presentación de un Programador Random que estaba enseñando a generar certificates para hacer push notification, hasta ese momento todos los pasos que hizo el Programador Random eran demasiados, hasta que me puse a ver los comentarios y vi uno muy peculiar.

No entiendo porque haces todo eso, si con pem lo puedes hacer en un momento

Hasta ese momento pensé que Pem era una solución chica para solucionar solo eso, pero cuando hice la búsqueda respectiva ¡Boom! me encontré con algo grande y alucinante.

Pem pertenecía a toda una colección de herramientas que te permitía automatizar muchas tareas pensadas para un desarrollo mobile, este conjunto de herramientas se llama Fastlane.

La familia Fastlane

Recuerdo que ese día le conte a mi líder sobre las posibilidades que nos ofrecía Fastlane en el caso que lo agregemos en nuestro flujo de trabajo, en ese momento vino una colección de preguntas y respuestas sobre Fastlane.

— ¿Fastlane gestiona los certificates?
 — Sí, para eso tiene Cert

— ¿Entonces me imagino que también hace la gestión de provisioning profile?
 — ¡Claro! para eso usa Sigh

— Pero, recuerdo que tienen muchos conflictos con la configuración de code signing identity en el xcode al hacer merge, ¿También les ayuda con eso?
 — Bueno, para ese caso usaría Match, porque gestiona mis certificates y provisioning profiles en un repositorio de git usando un usuario único para todos, con eso evitamos los conflictos.

— ¿También nos ayudaría para renovar los certificados para el servicio de push notification, no?
 — ¡Claro! Para eso se usa Pem, pero recuerda que también tenemos la opción de APNs Auth Key, para olvidarnos de la renovación de certificados

— ¿Y en que más nos ayuda?
 — Nos ayuda a generar los builds usando Gym, correr las pruebas con Scan, también nos permite crear los screenshoots para la AppStore, a eso agrégale que podemos hacer los screenshoots para los modelos e idiomas que necesitamos con Snapshot y si quieres agregarle un marco de iphone o ipad a los screenshoots generados con un mensaje explicando lo que hace esa pantalla puedes usar Frameit en ese caso.

— ¡Genial! aunque las subida de toda esa cantidad de screenshots ¿no sería tediosa?
 — ¡Cierto! Eso lo hace Deliver con su respectiva actualización de metadata y subida de ipa para su respectiva versión. 😎

— Y también …
 — ¿Qué? ¿hay más? 😱
 — Si, que también puedes crear una nueva app en iTunes Connect y Developer Portal usando Produce y mandar un build a TestFlight usando Pilot.

Implementado Fastlane

Para mostrarles el potencial de Fastlane crearé un proyecto que se llame “Weriklandia” y usaremos cocoapods para gestionar nuestras dependencias y a su vez haremos que el número de build aumente, pero esperen, aún no he instalado Fastlane. 😅

Instalación de Fastlane

La página web de Fastlane ofrece un inicio rápido, en esta página puedes realizar una configuración para tu Fastlane que es un archivo Fastfile y además obtener Fastlane el cuál tienes que descargar en un zip, descomprimirlo y agregarlo a tu projecto.

Desde está web obtienes Fastlane
Luego lo colocas en tu projecto

Y correr el comando installer/install en la ruta de proyecto por terminal

Ejecutas el comando y estaremos listos

Una vez terminada la instalación puedes eliminar la carpeta installer. Hasta este punto ya tienes Fastlane.
Cabe resaltar que Fastlane al ser un proyecto desarrollado en Ruby también lo podemos instalar mediante Rubygems.

Match

Antes de todo crearemos e instalaremos el certificate y provisioning profile para desarrollar nuestra aplicación, si trabajas solo, no hay ningún inconveniente que uses tu usuario personal, pero si trabajas en equipo lo más recomendable para que Match trabaje sin ningún problema y aparte para no tener conflictos con las configuraciones de los code signing identity es mejor tener un usuario único para todo el equipo, tanto en el apple developer center como en tu plataforma de versionamiento de confianza (github o bitbucket, por dar un ejemplo).
Lo único que tendríamos que hacer es escribir “match” en nuestro terminal y brindarle a Match la información que nos pida para que haga su magia.

Ya tenemos nuestros certificates instalados :D

¡Listo! Ahora abriremos nuestro xcode y veremos que ya tenemos nuestros provisioning profile listo para usar. 😎

No olvides de seleccionar los provisioning profile

¿Qué pasa si queremos instalar más provisioning profile a la vez?
Para eso tenemos que crear un Matchfile en nuestra carpeta fastlane de nuestro proyecto.

En el caso que no quieras crear provisioning profile de desarrollo, sino de ad-hoc o para producción tendrías que escribir en tu terminal “match ad-hoc” o “match app-store” respectivamente.

Más adelante veremos que podemos crear provisioning profile para development, ad-hoc, app-store y enterprise de una sola.

Gym

Gym será el que nos ayude a generar nuestro ipa, para el desarrollo de nuestro ejemplo usaremos dos configuraciones básicas que sera scheme y export_method.

gym(
scheme: "Weriklandia",
export_method: "development"
)

Scheme lo estoy considerando ya que puede darse casos donde tengamos scheme con diferentes configuraciones, por ejemplo que nuestros servicios apunten hacia preProducción o producción y export_method porque abran ocaciones donde tendremos que que generar un ipa de tipo ad-hoc.

Gym puede ser usado desde terminal, por ejemplo:

fastlane gym --scheme "Weriklandia" --export_method "development"

Y también desde un Gymfile que es donde podemos agregar valores para decirle a Gym con que nombre se generará el ipa o hasta donde tendría que exportar el ipa, por ejemplo:

scheme "WeriklandiaBeta"

sdk "iphoneos9.0"

clean true

output_directory "./build" # Donde se exportara el ipa
output_name "Weriklandia"

Pilot

Pilot nos permite gestionar nuestro builds y beta tester de una manera más eficiente, podemos subir nuestros builds como a su vez agregar y quitar beta tester, para nuestra demo usaremos la siguiente configuración.

pilot(skip_waiting_for_build_processing:true)

El skip_waiting_for_build_processing nos permitirá obviar el envío del binario a nuestros testers, recuerda que al igual que Gym, Pilot también puede ser ejecutado por terminal.

Lane

Un lane vendría a ser como una colección de acciones que programarás según tu workflow, es aquí donde empezaremos a mezclar el potencial de la familia Fastlane y lo veremos reflejado cuando usemos un Fastfile. Un ejemplo de lane sería el siguiente:

lane :prueba do
gym(
scheme: "Weriklandia",
export_method: "development"
)
pilot(skip_waiting_for_build_processing:true)
end

En el lane anterior hemos mezclado dos herramientas de la familia fastlane Gym y Pilot, este lane lo podemos correr desde terminal de la siguiente manera:

$ fastlane prueba

Si ejecutamos este lane lo que pasará es que Gym generaría un ipa y el ipa generado lo subirá pilot a Testflight, ahora veremos que podemos agregar más acciones a nuestro lane y armar un flujo más elaborado.

Fastfile

¿Recuerdas que configuramos una archivo Fastfile en la web al momento de descargar Fastlane?, ese archivo es donde le vamos a decirle a Fastlane que es lo que tiene que hacer mediante el uso de lanes y vamos a explicar rápido lo que configuramos en la web.

Ya tenemos una lane llamado “Beta” la cual ejecutarías por tu terminal en la raíz de tu proyecto y realizará lo siguiente:

  1. Instalará todo los pods que hemos puesto en nuestro Podfile
  2. Incrementará el numero de nuestro build
  3. Creará un ipa con Gym
  4. Subirá nuestro ipa a Testflight, pero para esta primera prueba lo comentaremos
  5. Y si posees un webhook para slack, te avisara por un channel o a un usuario en especial que se ha terminado de ejecutar nuestro lane
  6. Luego tenemos que decir ¡Wow!

Ahora probemos el lane “beta”

¿listos?
¡Éxito!, en caso que haya fallado no dudes en preguntar en los comentarios o por twitter @erikfloresq
Esto es lo que obtendríamos en nuestra carpeta de proyecto

Como pudimos ver anteriormente si quieres que el ipa se genere en otra ubicación tendríamos que jugar con la configuraciones de gym, en este caso como usamos una configuración por default, genera el ipa en la raíz del proyecto.

Utilizando Acciones

Aparte de las herramientas que te ofrece Fastlane, nos ofrece un colección de acciones que nos ayudará a armar flujos mas complejos, por ejemplo ya hemos usado dos acciones en nuestros Fastfile, estos son “cocoapods”, “slack” e “increment_build_number”, para profundizar en el uso de acciones haremos lo siguiente:

  1. Instalando varios certificates y provisioning profile usando un lane y luego notificar por slack que el lane ha terminado.

Recuerda que los bundle identifier de los cuales se generar los provisioning profile los gestionaremos en un Matchfile para mayor comodidad, este archivo estará en nuestra carpeta Fastlane de nuestro proyecto.

2. Ahora le vamos agregar interacción con git, agregaremos acciones antes y después de ejecutar los lane para realizar una instalación ad-hoc

3. Aumentamos un poco más las exigencias y vamos a generar un prerelease el cual incluirá el agregado de tag, incremento de versión de la app y de número de build, para estas últimas acciones realizaremos funciones propias , además ejecutaremos unos comandos de terminal, actualizaremos nuestro changelog y nuestro readme.

Acabamos realizar un flujo un poco más completo con Fastlane, pero hay un detalle al momento de crear el readme, el cual lo hacemos de la siguiente manera.

sh("ios-readme-generator 
-n '#{application_name}'
-i '#{application_id}'
-a '#{get_version_number}'
-b '#{get_build_number}'
-l '#{application_language}'
-d '#{application_deploy_target}'
-f '#{readme_generation_output}'
")

Como nos podemos dar cuenta son muchas variables y gestionar eso por la acción de sh puede ser un poco tedioso, para este caso podemos usar algo más que Fastlane nos ofrece y es la creación de plugins.

Creación de plugins para Fastlane

La creación de un plugin para Fastlane es muy fácil, por ejemplo crearemos un plugin para crear nuestro readme usando ios-readme-generator.

fastlane new_plugin ios_readme_generator

El comando que ejecutamos creerá toda al estructura que necesitamos para nuestro plugin

Los archivos donde pondremos toda nuestra lógica sería el ios_readme_generator_action.rb y el ios_readme_generator_helper.rb, para entender un poco la implementación les mostraré lo que desarrollé en el ios_readme_generator_action.rb

Si desean, el plugin se encuentra en mi github para que le puedan dar una mejor revisada.
Una vez desarrollado el plugin lo puedes subir a RubyGem o gestionarlo por github como se explica en la documentación de plugins.
Ahora en vez de usar la acción de sh para crear el readme instalaría el plugin el cual lo tengo publicado en rubyGem

$ fastlane add_plugin fastlane-plugin-ios_readme_generate

Y ahora podremos usarlo así en nuestro lane

ios_readme_generate(
app_name: "Weriklandia",
app_id: "pe.com.orbis.weriklandia",
app_version: "1.0",
build: "10",
language: "swift 3",
deployment_target: "iOS 9",
file_destination: "./README.md"
)

Siguientes pasos

  • No se olviden que Fastlane tiene mas herramientas que mencionamos en un principio y que podemos ir agregando a nuestros flujos.
  • Podemos integrar Fastlane con Jenkins con esto podríamos tener un flujo de continuous delivery con continuous integration.
  • El post se dedicó a usar Fastlane con un proyecto iOS pero también se puede usar Fastlane para un proyecto android y un proyecto para macOS.

En resumen

Fastlane es algo que deberíamos adoptar en nuestros flujos de trabajos, tanto para la generación de betas para QA como para liberar versiones a producción .
Gracias a que es un proyecto bastante activo en github, promete que su potencial seguirá creciendo con el tiempo.
Lo mas irónico del caso es que este proyecto ahora le pertenece a google y soluciona temas del mundo apple. ¯\_(ツ)_/¯

Bonus Track

  • Fastlane fue desarrollado por Felix Krause .
  • Fastlane es parte de Fabric un proyecto que se basa en mejorar los flujos del desarrollo mobile (fastlane) y además de ofrecer analíticas sobre los crashes (crashlytics) que tiene tu aplicación, entre muchas cosas más, es un proyecto que vale la pena probar.
  • Fastlane fue adquirido por Twitter para ser parte de Fabric en primera instancia, actualmente le pertenece a Google.
One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.