loading...

Deploy de aplicación Rocket desde GitHub a Heroku

mattdark profile image Mario García ・4 min read

Si se está desarrollando una aplicación web con Rust y Rocket, 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

También puede crearse desde 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.

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

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

Para recibir notificaciones en Telegram cuando un test termine, se puede usar TravisCI-Telegam-Bot, un bot no oficial, que se puede agregar abriendo el siguiente enlace: https://telegram.me/TravisCI_Telegam_Bot.
TravisCI-Telegram-Bot

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

Heroku

Heroku 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

  • Se busca el repositorio desde donde se hará el deploy y se realiza la conexión.
    App connected to GitHub

  • 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

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

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.

[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í.

Espero que este tutorial les haya servido.

Discussion

pic
Editor guide