Deploy de aplicación Rocket desde GitHub a Heroku
Tags: rust, git, github
Published: 2019-04-05 23:47:37

Si se está desarrollando una aplicación web con **[Rust](https://rust-lang.org/)** y **[Rocket](https://rocket.rs/)**, y se desea configurar Travis CI para probar los cambios enviados al repositorio de GitHub y posteriormente hacer el deploy a Heroku, en este artículo voy a explicar como hacerlo.

## .gitignore
Para pruebas realizadas desde el entorno de desarrollo local, se debe crear el archivo `.gitignore`, para evitar que los archivos generados durante la compilación se sincronicen con el repositorio. El archivo debe contener lo siguiente:

```
# Generated by Cargo
# will have compiled files and executables
/target/

# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
Cargo.lock

# These are backup files generated by rustfmt
**/*.rs.bk
```

Este archivo puede generarse desde la creación de un nuevo repositorio, seleccionando el lenguaje en el que se está desarrollando el proyecto.
![Rust .gitignore file](https://thepracticaldev.s3.amazonaws.com/i/65iqtti0edm2ss112w59.png)

También puede crearse desde **[gitignore.io](https://gitignore.io/)**, descargar el archivo y agregarlo al repositorio.

## Travis CI
**Travis CI** es un sistema distribuido de integración continua, usado para construir y realizar pruebas de proyectos alojados en GitHub. Tiene soporte para múltiples lenguajes, como Python, Ruby, Go, PHP y Rust. Cuenta con una versión gratuita para proyectos de código abierto, disponible en **[travis-ci.org](https://travis-ci.org/)**.

Para acceder a Travis CI no es necesario crear una cuenta, solo se debe iniciar sesión en GitHub y autorizar el acceso.
![Travis CI login](https://thepracticaldev.s3.amazonaws.com/i/ywe08xxjwgtvz3psunpd.png)

Una vez que se ha conectado Travis CI a la cuenta de GitHub, se debe crear un archivo en el repositorio del proyecto en el que se indica la versión de Rust que se está usando.

En seguida, en el repositorio, se crea un archivo llamado `.travis.yml` que debe contener lo siguiente:

```
language: rust
rust:
  - nightly
cache: cargo
```

Se especifica el lenguaje del proyecto, se indica la versión de Rust que se está usando, Rocket ocupa Nightly, y será la que Travis CI descargará para realizar las pruebas, luego se genera una cache de las dependencias, para evitar que se descarguen y compilen si no existe una versión nueva.

Una vez que se ha agregado este archivo, Travis CI realizará el primer test al proyecto. Con cada cambio que se envíe al repositorio se realizará un test nuevo. Los tests se pueden ver en tiempo real desde la URL generada por Travis CI, como: `https://travis-ci.org/usuario/repositorio`. Y si no ha habido ningún error, mostrará lo siguiente:
![Travis CI test](https://thepracticaldev.s3.amazonaws.com/i/zjagw1wrjhs3ifgjx6ov.png)

Para recibir notificaciones en Telegram cuando un test termine, se puede usar **[TravisCI-Telegam-Bot](https://github.com/artemgurzhii/TravisCI-Telegam-Bot)**, un bot no oficial, que se puede agregar abriendo el siguiente enlace: ` https://telegram.me/TravisCI_Telegam_Bot`.
![TravisCI-Telegram-Bot](https://thepracticaldev.s3.amazonaws.com/i/5jgwwap4bkmzj1mz7c42.png)

Para indicar de que proyecto debe enviar notificaciones, solo se le pasa la URL y devuelve el siguiente mensaje, y a partir de ahí estará enviando notificaciones.
![TravisCI-Telegram-Bot](https://thepracticaldev.s3.amazonaws.com/i/rjhsnyykefireuhqmbvw.png)

## Heroku
**[Heroku](https://heroku.com/)** tiene soporte para lenguajes y tecnologías como Node.js, Ruby, Java, PHP, Python y Go, y para lenguajes como Rust a través de paquetes de construcción (build packs) desarrollados por la comunidad.

Después de crear la aplicación en Heroku, se realiza la configuración correspondiente.

En el panel de la aplicación, en el apartado `Deploy`, se modifica lo siguiente:

* Se selecciona GitHub como método de deployment.
![Deployment method](https://thepracticaldev.s3.amazonaws.com/i/uqejg8tvtmyj4zg3uwkn.png)

* Se busca el repositorio desde donde se hará el deploy y se realiza la conexión.
![App connected to GitHub](https://thepracticaldev.s3.amazonaws.com/i/yqtjy11aq69z4ilp6dqq.png)

* Se habilita el deploy automático, para ello se selecciona la rama desde donde se hará el deploy y se marca la opción `Wait for CI to pass before deploy` para indicar que el deploy se realizará una vez que Travis CI haya completado el test y que este se haya realizado con éxito.
![Automatic deploys](https://thepracticaldev.s3.amazonaws.com/i/yhczvg5tq7068mzkdk86.png)

En seguida en el apartado `Settings` se realiza la siguiente configuración:

* Se agrega la URL del paquete de construcción correspondiente, que para Rust es `https://github.com/emk/heroku-buildpack-rust.git`.
![Buildpacks](https://thepracticaldev.s3.amazonaws.com/i/5pwan62x1dt5lay21muj.png)

La URL desde donde se puede acceder a la aplicación tiene el formato `https://nombre-aplicacion.herokuapp.com`.

En seguida se crean los archivos `Rocket.toml`, `RustConfig` y `Procfile` en el repositorio.

En el archivo `Procfile` se indica la versión de Rust que deberá usar Heroku para el deployment, ya que por defecto descarga la versión Stable y para Rocket se necesita Nightly.

```
VERSION = nightly
```

En el archivo Rocket.toml se configura la dirección de la aplicación, tal y como se indica en la [documentación oficial](https://rocket.rs/guide/configuration/#rockettoml).

```toml
[global]
limits = { forms = 32768, json = 32768 }

[development]
address = "localhost"
port = 8000
log = "normal"

[staging]
address = "0.0.0.0"
port = 8000
log = "normal"

[production]
base_url = "https://nombre-aplicacion.herokuapp.com"
log = "critical"
```

Por último, en el archivo `Procfile` se escribe la instrucción que iniciará la aplicación.

```
ROCKET_PORT=$PORT ROCKET_ENV=prod ./target/release/nombre-binario
```

Heroku asigna el puerto de manera dinámica, es por eso que este no se especifica en el archivo `Rocket.toml`, ya que el puerto se obtiene con `ROCKET_PORT=$PORT`, además se indica que la aplicación se ejecuta en entorno de producción mediante `ROCKET_ENV=prod` y la ruta del binario correspondiente `./target/release/nombre-binario`, según lo indicado en `Cargo.toml`.

Una vez que se realiza la configuración, se envía un pequeño cambio al repositorio, para que Travis CI realice el test y posteriormente el deploy a Heroku.

En esta URL se puede ver un ejemplo: https://reveal-gallery.herokuapp.com/ y el repositorio de GitHub [aquí](https://github.com/mattdark/reveal.js-gallery).

Espero que este tutorial les haya servido.