Libera 🚀 aplicaciones de React Native con✨ Fastlane✨
Tags: reactnative, react, mobile, fastlane
Published: 2019-06-10 00:04:18

Crear aplicaciones usando React Native (JavaScript) es como un cuento de hadas ❤️❤️. Todo es color de rosa hasta el momento de lanzar una nueva versión de la aplicación🤦 , especialmente si no estás familiarizado con iOS o Android en lenguaje nativo.
El proceso para enviar una aplicación a las tiendas de App Store y Play Store es una experiencia muchas de las veces frustrante, lenta o desesperante 🤷. Y aunque existe mucha documentación, no siempre es clara o simplemente se pierden muchos pasos importantes, por que hay mucho que digerir .

Ahí es cuando ✨Fastlane ✨ viene al rescate ⛑! 
En este artículo te explicaré cómo automatizar el proceso de lanzamiento para una aplicación iOS🍎y Android. 🤖Manejar las tareas más comunes, tales como: Certificados, Compilaciones de aplicaciones, Distribución Beta y mucho más.

Fastlane es una herramienta para desarrolladores de iOS y Android que les ayuda a automatizar tareas tediosas, tales como generar capturas de pantalla, tratar con certificados y lanzar tu aplicación.
Testimonio real: 

>🙇Desde que empecé a usar ✨Fastlane ✨, mi vida cambió, ahora tengo más tiempo para tomar café 🤛y relajarme en mi escritorio mientras Fastlane se encarga de todo. 🙇


##Empezando
Antes de instalar ✨Fastlane ✨, asegúrese de tener instaladas las últimas herramientas de línea de comandos de Xcode, luego instale ✨Fastlane ✨ ⬇️.

`brew cask install fastlane;`
Una vez instalado, crea una carpeta fastlane / 📁 dentro de tu proyecto de React Native a nivel raíz. Luego, crea un archivo llamado Fastfile dentro de este directorio ☝️ (sin extensión, solo Fastlane).

El archivo Fastfile es el lugar donde vamos a codificar los carriles (lanes). Un carril contiene un grupo de acciones que se ejecutarán sincrónicamente para automatizar un proceso. Una acción, es una función que realiza una tarea.

Comencemos con esta plantilla base de *Fastfile*, como puede ver, hay un enlace before_all, que básicamente realiza una comprobación de estado 👨‍⚕️, con tres acciones, para garantizar que esté en la última rama (branch) “Master” con un estado limpio.
```
fastlane_version '2.53.1'

before_all do
  ensure_git_branch
  ensure_git_status_clean
  git_pull
end

platform :ios do
   # iOS Lanes
end

platform :android do
  # Android Lanes
end
```

##Certificados
Cuando se trata de lanzar una aplicación nueva, todo esta perfecto hasta que tienes que firmar y controlar los certificados de la aplicación.

###iOS🍎
La mejor manera de firmar tu código es usando match ; Antes de integrar march en un carril (lane), primero debes seguir los siguientes pasos :

1- Usa Nuke para borrar los perfiles y certificados existentes.

2- Inicia la configuración de match a través del comando init .

`Fastlane match init`
3- Cree un carril en la plataforma de ios que use el emparejamiento.
```
desc 'Fetch certificates and provisioning profiles'
  lane :certificates do
  match(app_identifier: 'com.app.bundle', type: 'development', readonly: true)
  match(app_identifier: 'com.app.bundle', type: 'appstore', readonly: true)
End
```

Después de eso ya puedes usar el comando fastlane ios certificates o usar certificates como una función en otro carril. Match guardará automáticamente los perfiles y certificados de en su llavero (Keychain) OS X.

###Android 🤖
Cuando compilas una aplicación de Android usando la tarea de ensamblar (assemble) en el modo Release, la aplicación se firmará automáticamente. Pero primero necesitas generar o tener generada previamente la clave para firma y agregarla al proyecto, no te preocupes puedes consultar esta guía de Facebook para saber cómo hacerlo.

##Compilación (build)
###iOS🍎
Para generar una compilación (build) firmada, vamos a crear un carril (lane) que use el carril de certificados que ya creamos antes y usaremos gym para compilar nuestra aplicación de una manera rápida y sencilla. Al final del proceso, vamos a incrementar el número de compilación para enviar nuestra aplicación a los servicios de *prueba beta*
```
desc 'Build the iOS application.'
private_lane :build do
  certificates
  increment_build_number(xcodeproj: './ios/name.xcodeproj')
  gym(scheme: 'name', project: './ios/name.xcodeproj')
end
```

###Android 🤖
Para generar un .apk firmado, vamos a crear un carril de compilación. Como puedes ver, estamos usando una acción de gradle, para limpiar el proyecto y armar una versión de lanzamiento, con tareas de [gradle](https://docs.gradle.org/current/userguide/userguide.html).
```
desc 'Build the Android application.'
private_lane :build do
  gradle(task: 'clean', project_dir: 'android/')
  gradle(task: 'assemble', build_type: 'Release', project_dir: 'android/')
end
```
Luego, automatiza el incremento de *VersionCode*, conectando el *assembleRelease* con esta pequeña tarea.

##Distribución
###iOS🍎
TestFlight ✈️ es el camino a seguir cuando se trata de pruebas beta de iOS. Funciona realmente bien, aunque el Portal de desarrolladores es un poco confuso. Con pilot podemos gestionar nuestras compilaciones de TestFlight.

El carril beta utilizará el carril de compilación para proporcionar un .ipa firmado a pilot, luego enviará los elementos a git e impulsará los cambios producidos al aumentar el número de compilación y, finalmente, cargará la compilación local a Testflight. 🎉
```
desc 'Ship to Testflight.'
  lane :beta do
    build
    pilot
    commit_version_bump(message: 'Bump build', xcodeproj: './ios/name.xcodeproj')
    push_to_git_remote
end
```

###Android 🤖
Android usa Playstore para compartir versiones beta. ¡Podemos automatizar eso también con fastlane!

El carril beta para Android es casi el mismo que iOS, usa el carril de compilación para generar el .apk firmado, confirma los cambios del código de versión y el uso de supply promueve la compilación local de Playstore como versión beta. ✨
```
desc 'Ship to Playstore Beta.'
lane :beta do
    build
    supply(track: 'beta', track_promote_to: 'beta')
    git_commit(path: ['./android/gradle.properties'], message: 'Bump versionCode')
    push_to_git_remote
end
```

Al final 🙇 🙇 🙇
Tu Fastfile debe lucir muy parecido a el que muestro a continuación
```
fastlane_version '2.53.1'

before_all do
  ensure_git_branch
  ensure_git_status_clean
  git_pull
end

platform :ios do
   # iOS Lanes
  desc 'Fetch certificates and provisioning profiles'
  lane :certificates do
    match(app_identifier: 'com.app.bundle', type: 'development', readonly: true)
    match(app_identifier: 'com.app.bundle', type: 'appstore', readonly: true)
  end
  desc 'Build the iOS application.'
  private_lane :build do
    certificates
    increment_build_number(xcodeproj: './ios/name.xcodeproj')
    gym(scheme: 'name', project: './ios/name.xcodeproj')
  end
  desc 'Ship to Testflight.'
  lane :beta do
    build
    pilot
    commit_version_bump(message: 'Bump build', xcodeproj: './ios/name.xcodeproj')
    push_to_git_remote
  end
end

platform :android do
  # Android Lanes
  desc 'Build the Android application.'
  private_lane :build do
    gradle(task: 'clean', project_dir: 'android/')
    gradle(task: 'assemble', build_type: 'Release', project_dir: 'android/')
  end
  desc 'Ship to Playstore Beta.'
  lane :beta do
      build
      supply(track: 'beta', track_promote_to: 'beta')
      git_commit(path: ['./android/gradle.properties'], message: 'Bump versionCode')
      push_to_git_remote
  end
end
```

**Agradecimientos** 🤛🤛🤛
Felix Krause, Carlos Cuesta

To my beautiful Ammy for the Amazing support!
Necesitas ayuda?
Mándame un mensaje y con gusto te ayudo!

Javier Munoz Barrios 
(@JavyMB) | Twitter