• slidebg1

Fastlane: desplegando Apps fácilmente


¿Fastlane? ¿Qué es Fastlane? ¿Y por qué debería importarte Fastlane?

Te cuento una historia: ¿conoces la sensación de haberse "matado" para preparar una beta y cuando llega el momento crucial no tienes los certificados correctos? ¿hay que renovar el Provisioning Profile? o lo que es peor, ¿todavía te falta subir las traducciones y las capturas de pantalla de 5 idiomas para darle a "enviar a revisión"? ¡Fastlane llega al rescate!

Fastlane te va a permitir dejar de odiar -o casi - a Apple por la firma de Apps.

Esa tentación que hemos tenido todos...

Esa tentación que hemos tenido todos...

 

 

¿Qué es Fastlane?

Fastlane no son más que una serie de herramientas que nos van a facilitar la vida -especialmente a los desarrolladores de iOS- para automatizar la preparación y envío de versiones de nuestras Apps a la AppStore o bien como beta o despliegue interno. Surgen debido a la necesidad de simplificar  el despliegue de los desarrollos.

Y dicho y hecho: Felix Krause, que así se llama su creador, decidió que ya estaba bien de perder horas en desplegar una App, después de haber pasado horas desarrollándola con lo que decidió ponerse manos a la obra.

Felix Krause - Creador de Fastlane

Felix Krause - Creador de Fastlane

En vez de crear una "navaja suiza" que lo hiciera todo en una sola app, Felix creó varios programas en Ruby que nos permiten hacer varias tareas:

  • Deliver: Es el "core" de la herramienta. Permite subir los screenshots, metadatos, binarios, etc. a la AppStore. Todo de una.
  • Snapshot: Usando los UI Tests, permite tomar capturas de pantalla del simulador en enviarlas con Deliver. ¿Os imagináis lo que significa eso cuando desarrollas en 7 u 8 idiomas para 4 o 5 dispositivos distintos? 
  • FrameIt: Permite añadirles un "marco" a tus screenshots, para que aparezcan enmarcada en la AppStore. Muchas Apps hacen este tipo de montajes.
  • Pem: Genera automáticamente certificados push para nuestras Apps.
  • Sigh: Añade la posibilidad de Descargar, Renovar, Reparar y Crear los famosos PROVISIONING PROFILES. Puedes tener varias cuentas, equipos, etc. Sin problemas, Sigh es capaz de manejarlo todo.
  • Produce: Produce permite crear nuevas Apps en iTunesConnect para no tener que hacerlo de forma manual.
  • Cert: Crea y mantiene los certificados de firma para tus Apps.
  • Pilot: Permite gestionar betas en testflight, desde enviarlas, a añadir/enviar testers.
  • Boarding: Crea un portal para que puedas hacer una beta pública con TestFlight y tus usuarios puedan inscribirse.
  • Gym: Es el generador de IPAs.
  • Scan: Lanza los test de tu App.
  • Match: Y por último, pero no por eso menos importante, Match. Esta es la última incorporación de Fastlane. Permite que todo un equipo comparta los certificados/provisioning profiles de los proyectos. Solo es necesario un repositorio y una cuenta común para trabajar y ¡Se acabó lo de "revocar por error" el certificado del compañero! (?)

No obstante, mediante el comando "fastlane" podemos ejecutarlos todos. ¿Queréis saber cómo?

p9yyik

Entrando en materia

Instalando

sudo gem install fastlane

Quick and dirty ;)

Inicializando "the easy way"

Las herramientas pueden ser ejecutadas de forma independiente, o bien pueden ser lanzadas mediante calles (lanes) usando el comando Fastlane. Fastlane se compone de un fichero de configuración "lanes" (calles,carriles) llamado Fastfile que ejecutan diferentes tareas una tras otra. Normalmente cuando instalas por primera vez el programa deberías ir al directorio donde tengas tu proyecto y ejecutar:

fastlane init

Esto te llevará por un configurador que irá preparando Fastlane para realizar todas las tareas necesarias. Creará un directorio llamado fastlane y meterá el fichero de configuración "Fastfile" dentro. El problema... es que todavía queda toda la configuración, pero para eso estamos aquí, ¿no? ?

Nota: Los directorios desde donde ejecutas Fastlane son importantes. Cuando ejecutes fastlane, debes hacerlo desde el directorio del proyecto (justo el anterior al directorio ./fastlane) para que fastlane encuentre la configuración

Configurando "Develapps way"

Para tener una configuración de Fastlane potente vamos a seguir los siguientes pasos:

  1. Crear un Fastfile: Os dejo al final del post el nuestro, que podéis usar libremente.
  2. Configurar fastlane usando un fichero Configuration: Os dejo nuestro fichero configuración, a la que tendréis que ponerle vuestros valores: usuarios, api secrets, etc. Este fichero debe estar en el directorio ./fastlane.
  3. Configurar el fichero AppFile: Es un fichero con dos líneas muy fácil de configurar. Este fichero debe estar en el directorio ./fastlane.
  4. Crear el directorio Metadata: este directorio guardará las descripciones, palabras clave, etc. de la App en todos los idiomas.
  5. Crear el fichero de configuración de capturas de pantalla Snapfile y preparar las capturas: Nos permitirá configurar de qué dispositivos e idiomas necesitamos capturas. Este fichero debe estar en el directorio ./fastlane. Luego generaremos los UI tests para indicar cómo hacer las capturas.
  6. Generar el repo de Match: Generar un repositorio para que se guarden nuestros certificados y provisioning profiles.

 

1.- Creando un Fastfile

Configurar Fastlane es lo más complicado de todo. Por ello, conviene tener un fichero base y configurar solo lo necesario. En nuestro caso, usamos un fichero común Fastfile de configuración y los parámetros configurables los importamos de otro fichero. De esta forma el fichero Fastlane se copia entre proyectos y solo se modifican los usuarios, cuentas, grupos, etc. Al final del post tenéis los ficheros que usamos listos para ser usados en vuestro proyecto.

Así, la primera línea ejecutable de nuestro fichero Fastfile importa el fichero de configuración.

import "./Configuration"

El resto del fichero lo que hace es crear "lanes" para las distintas tareas que podemos realizar.

pablo$ fastlane
[09:19:56]: -------------------------------------------------
[09:19:56]: --- Step: Verifying required fastlane version ---
[09:19:56]: -------------------------------------------------
[09:19:56]: fastlane version valid
[09:19:56]: ------------------------------
[09:19:56]: --- Step: default_platform ---
[09:19:56]: ------------------------------
[09:19:56]: You must provide a lane to drive. Available lanes:
[09:19:56]: 1) ios testflight
[09:19:56]: 2) ios crashlytics
[09:19:56]: 3) ios fabric
[09:19:56]: 4) ios appstore
[09:19:56]: 5) ios ipa_create
[09:19:56]: 6) ios snapshot
[09:19:56]: 7) ios push_certificate_production
[09:19:56]: 8) ios push_certificate_development
[09:19:56]: 9) ios match_certificates_dev_readonly
[09:19:56]: 10) ios match_certificates_dev
[09:19:56]: 11) ios match_certificates_adhoc_readonly
[09:19:56]: 12) ios match_certificates_adhoc
[09:19:56]: 13) ios match_certificates_appstore_readonly
[09:19:56]: 14) ios match_certificates_appstore
[09:19:56]: 15) ios tests

Como podéis ver, tenemos configurados muchísimos "lanes" que pueden seros de utilidad.

  • El primero, actualiza los certificados con Match, compila una versión con Gym y envía una versión beta a Testflight.
  • El segundo y tercero, actualiza los certificados con Match, compila una versión con Gym y genera una versión en Crashlytics/Fabric.
  • El cuarto actualiza los certificados con Match, opcionalmente corre los test y sube las capturas de pantalla, compila una versión con Gym, y la envia con deliver. Todo en un comando. (Manos arriba quien haya soñado con esto --> ?)
  • El quinto simplemente crea un IPA redistribuible.
  • El sexto genera las capturas de pantalla y las prepara en un directorio dentro del directorio fastlane.
  • El séptimo y octavo generan los certificados push.
  • El 9 descarga un certificado y provisioning profile del repositorio de Match. Si no existe NO crea uno.
  • El 10 descarga un certificado y provisioning profile del repositorio de Match. Si no existe, crea uno.
  • El 11 y el 12 son análogos a 9 y 10, pero para certificados/provisioning Adhoc.
  • El 13 y 14 igual, para AppStore.
  • El 15 simplemente ejecuta los tests.

 

2.- Configurar Fastlane con el fichero Configuration

Este fichero es el que contiene la configuración. Entre otras cosas necesitamos añadir nuestra cuenta de desarrollo (para certificados, provisioning profiles, etc.), el usuario de itunesconnect, el teamId si tenemos varios, el teamId de iTunesConnect si tenemos varios, el nombre del owner del certificado de producción, el bundleId, etc.

USERNAME = “nuestra_cuenta_de_desarrollo@develapps.es" # For certificate and provisioning profile purposes
ITUNESCONNECT_USERNAME = "nuestra_cuenta_de_desarrollo@develapps.es" # Might be different for itunesconnect
TEAM_ID = “UNTEAMID” # Necessary if you have several teams
ITUNESCONNECT_TEAM_ID = "UNITUNESCONNECTTEAMID" # Necessary if you have several teams
ITUNESCONNECT_TEAM_NAME = “ELNOMBREDELTEAM”
PRODUCTION_CERTIFICATE_OWNER = “EL NOMBRE DEL OWNER DEL CERTIFICADO” # cert id used by the provisioning profile. 
SIGNING_IDENTITY_ADHOC = "iPhone Distribution: La identidad del certificado de distribución” # Configure your development certificate identifier -for crashlytics/fabric-. USE NAME!
SIGNING_IDENTITY_PRODUCTION = "iPhone Distribution: La identidad del certificado de distribución" # Configure your production certificate identifier -for appstore-
BUNDLE_ID = “el.bundle.id” # Bundle ID of the app
CRASHLYTICS_API_TOKEN = “el token de crashlytics/fabric” # crashlytics develapps api token. Change if custom.
CRASHLYTICS_BUILD_SECRET = “el secret de crashlytics/fabric“ # crashlytics develapps secret. Change if custom.
BUILD_SCHEME = “El build scheme de vuestra app“ # Scheme to build the App
UNIT_TEST_SCHEME = "El build scheme de vuestros tests” # Scheme to build the Unit tests - if different
# Enable if you want to upload the icon too
APP_ICON_PATH = nil #"./fastlane/metadata/AppIcon.png"
...

 

3.- Configurar el fichero AppFile

Al crear la estructura del directorio con "fastlane init" generamos automáticamente un fichero AppFile. Si lo habéis hecho bien deberíais tenerlo ya con el siguiente contenido:

app_identifier "el.bundle.identifier" # The bundle identifier of your app
 apple_id "vuestro_apple_id@develapps.es" # Your Apple email address
 # You can uncomment any of the lines below and add your own
 # team selection in case you're in multiple teams
 # team_name "Felix Krause"
 # team_id "Q2CBPJ58CA"
 # you can even provide different app identifiers, Apple IDs and team names per lane:
 # https://github.com/KrauseFx/fastlane/blob/master/docs/Appfile.md

 

4.- Creando el directorio Metadata

El directorio metadata es necesario para poder gestionar desde Fastlane las descripciones, palabras clave, categorías, etc de la AppStore. Para ello basta con usar

deliver init

Y Fastlane se encargará de  realizar todo el trabajo por nosotros, descargando (si las hay) todas las descripciones en todos los idiomas. Además, creará un fichero "DeliverFile" que no vamos a usar, ya que toda la configuración ya está en el fichero "Configuration".

 

5.- Configurar el fichero SnapFile y generar las capturas

Por último, si necesitáis generar capturas de pantalla, hay que inicializar el fichero SnapFile, -os dejo el nuestro abajo por si queréis copiarlo- que le dirá a Fastlane qué dispositivos y en qué idiomas debe hacer las capturas.

Snapshot 2016-03-22 a las 10.49.51

Es conveniente generar un schema aparte para las capturas de pantalla[/caption] Y finalmente hay que crear uno (o varios) UI Tests para generar las capturas de pantalla.

Mi recomendación es que os creéis un esquema totalmente distinto al de los UI Tests, de forma que no os molesten cuando corráis los tests de verdad. Fastlane usa un "truco" para generar las capturas. Tenéis que añadir a vuestros UI Tests un fichero swift que se llama "SnapshotHelper.swift" que nos permitirá llamar a la función snapshot. Cuando la llamemos Fastlane generará un snapshot.

CURIOSIDAD: ¿Cómo se las apaña Fastlane para reconocer un gesto en el simulador? Pues lo que hace es que cuando llamas a snapshot, se hace un gesto de arrastre fuera de la pantalla -que es imposible de hacer manualmente- y cuando lo detecta genera una captura.

Es conveniente que a estos test los numeremos, para que se suban en el order que queremos, por ejemplo "01 PIN", "02 MAIN", etc.

¿Y qué aspecto tiene un UI Test para los snapshots? Pues algo así:

...
        snapshot("01 PIN") // Captures the pin screen
        app.otherElements["pinView"].childrenMatchingType(.TextField).element.typeText("3323") // Inserts a code
        if isRegistering{
            app.otherElements["pinView"].childrenMatchingType(.TextField).element.typeText("3323") // Inserts the code again
        }
        let mainScreen = app.descendantsMatchingType(XCUIElementType.Any)["mainScreen"] // Waits for the main screen to load
        self.waitforElementToExist(mainScreen)
        snapshot("02 MAIN") // Captures the main screen
...

Esta es la parte más compleja, pero si tienes varios dispositivos y/o idiomas, vale la pena currársela.

 

6.- Generando el repo de Match

Match va a permitir utilizar el mismo certificado y provisioning profile a todos los miembros de un equipo. Para ello, necesita usar un repositorio GIT donde almacenarlos -encriptados, evidentemente-. Si has configurado el fichero Configuration habrás visto que hay una url a un GIT para Match. Para inicializar el repo necesitas hacer un:

match init

Y ya está. Con eso se habrá creado la estructura.

Recapitulando

Aunque solo por el sistema de subida a la AppStore, renovación de certificados y capturas de screenshots vale su peso en oro, cada día van apareciendo más y más acciones que se pueden añadir al comportamiento "básico" de Fastlane que lo van haciendo cada vez más imprescindible para mucha gente. Incluso están trabajando en herramientas para Android como Screengrab o Supply.

j5a1if

La comunidad Fastlane es tremendamente activa y no para de reportar y arreglar bugs -yo mismo suelo hacerlo-. Incluso el mismo Felix suele ayudar con los errores si se trata de algo crucial.

Tal ha sido el éxito entre los desarrolladores que Twitter le ha contratado para integrar Fastlane en Fabric. ¿Significa esto que sólo se podrá usar en Fabric? No, al ser opensource cualquiera puede añadir acciones a Fastlane, con lo que se mantendrá siempre abierto. Lo que realmente significa es que Twitter va a apoyar el trabajo de Felix y eso es una muy buena noticia.

Recursos

Nuestro Fastfile (quitadle la extensión txt)

Nuestro Configuration (quitadle la extensión txt y configurad vuestros datos ;) )

Nuestro Snapfile (quitadle la extensión y configurad los screenshots con vuestros dispositivos/idiomas)

Públicado el 23/03/2016

Comparte este post: