Índice
¿Qué es Heroku y Heroku CLI?
Heroku es un PaaS (Platform as a Service) que nos permite desplegar nuestras aplicaciones sin preocuparnos por la infraestructura, soportando además múltiples lenguajes de programación. Todos los servicios que ofrece Heroku están orientados a startups o pequeñas empresas.
Utiliza contenedores Linux, llamados dynos para alojar las aplicaciones, así mismo cuenta con la posibilidad de agregar funcionalidades nuevas mediante add-ons.
Heroku nos ofrece un plan gratuito, lo que hay que tener en cuenta es que si una aplicación no recibe ninguna solicitud en 30 minutos, entrará en modo suspensión, por lo que a la siguiente petición se levantará de nuevo, lo que tardará más tiempo de lo normal la primera petición.
Por su parte, Heroku CLI, nos permite ejecutar Heroku desde nuestra terminal, se puede descargar desde aquí. Antes de usar Heroku y su CLI, nos debemos registrar desde aquí.
Uso de Heroku CLI
Una vez tengamos la cuenta creada en Heroku, y nos hayamos descargado Heroku CLI, vamos a nuestra terminal y comprobamos que heroku está correctamente instalado, para ello escribimos:
heroku --version
Podemos crear la aplicación desde la web de Heroku, o desde Heroku CLI y luego conectarla con nuestro proyecto, nosotros vamos a hacer todo desde el CLI para aprender a manejarlo.
Primero que todo iniciamos sesión en Heroku a través de la terminal, escribimos lo siguiente en la terminal:
heroku login
Una vez hemos iniciado la sesión, vamos al directorio de nuestro proyecto, inicializamos un repositorio de git previamente y ejecutamos lo siguiente:
heroku create --region=eu
Este comando nos crea una nueva aplicación de Heroku totalmente vacía. Si no escribimos nada en el application-name, este nombre es único, por lo que puede que no esté disponible, nos creará una aplicación con un nombre aleatorio. Es muy importante especificar la región, debido que eso condiciona las horas de mantenimiento de los servidores, entre otros factores en los que no vamos a profundizar, tenemos dos regiones para elegir: Estados Unidos y Europa, en nuestro caso elegimos Europa.
Una vez tenemos nuestra aplicación creada en Heroku, podemos añadirle add-ons, estos son funcionalidades o paquetes ‘extra’ a nuestra aplicación. Supongamos que queremos añadir una base de datos MySQL, primero accedemos a esta web, buscamos mysql, nos aparecen múltiples opciones, nosotros vamos a elegir JawsDB con la versión de kitefin, que es gratuita, dentro de la página del add-on vienen las instrucciones para instalarlo mediante la terminal, sería algo así:
heroku addons:create jawsdb:kitefin -a
Ahora para realizar un deploy de nuestra aplicación, sería tan sencillo como hacer un commit de nuestros cambios en este caso usaremos la rama master, y luego ejecutar el siguiente comando:
git push heroku master
Como vemos, en muy pocos comandos tenemos una aplicación creada y desplegada en Heroku, pero, ¿qué ocurre si ya tengo mi aplicación en Heroku creada desde hace tiempo,y ahora quiero enlazarla con código? No pasa nada, en este caso ejecutamos el siguiente comando:
heroku git:remote -a
Esto no romperá los remote que ya tenemos configurados para nuestro repositorio git.
Si queremos eliminar nuestra app de Heroku por cualquier motivo, podremos hacerlo de la siguiente forma:
heroku destroy -a
Nos pedirá confirmación para eliminar la aplicación, si queremos evitar esto, podemos añadir el argumento –confirm, esto hará que se elimine la aplicación sin confirmación.
heroku destroy -a --confirm
Algo muy importante, y que no debemos dejar de mencionar es el hecho de poder usar nuestras contraseñas sin incluirlas en el código, para ello Heroku nos ofrece la opción crear variables de entorno para esto y para otro tipo de variables que queramos incluir. Para hacer esto escribimos el siguiente comando:
heroku config:set CONFIG_VALUE=password
Estos serían los comandos básicos para crear y desplegar una aplicación en Heroku. Heroku CLI tiene muchos más comandos interesantes que podrás consultar aquí de manera más detallada, o escribiendo en la terminal el típico help:
heroku --help
Ejemplo con Spring Boot y Travis
Creación con Spring Boot e integración con Travis:
Ahora vamos a ver un ejemplo completo de un deploy de una aplicación creada en Java, con Spring Boot, si no conoces cómo crear una aplicación con Spring Boot te dejo este tutorial por aquí. A su vez, enlazaremos nuestra aplicación con Travis, que es un servicio de integración continua, si no sabes cómo enlazar un proyecto con Travis, te dejo este otro tutorial por aquí.
Creación de la aplicación en Heroku:
Una vez hemos creado el proyecto e inicializado nuestro repositorio de git y lo tenemos ejecutando perfectamente y enlazado con Travis, procedemos a crear la aplicación de Heroku, para ello nos vamos en nuestra terminal hasta el directorio del proyecto y ejecutamos:
heroku create example-application-demo --region=eu
Una vez creada nos aparecerá esto:
La primera url será la dirección de nuestra aplicación, si accedemos y todo ha ido bien, veremos algo como lo siguiente:
Despliegue de la aplicación:
Aún no hemos desplegado nuestra aplicación en Heroku, solo hemos creado el espacio para poder alojarla.
Nuestra aplicación en Spring Boot va a tener la siguiente organización de ficheros, y como es a modo didáctico, no tendremos bases de datos, simplemente devolveremos un Hello World Heroku!
De manera simple, el controller llamará al service, y este último al repository que en lugar de devolver los datos desde una base de datos nos retornará Hello World Heroku!
Tenemos que tener en cuenta que si nuestra aplicación obtiene los datos desde una BBDD local, una vez subida a Heroku no podrá acceder a ella, por lo que tendremos que usar otro servicio de BBDD, todo ello lo especificaremos en el application.properties de Spring Boot.
Para esto, primero que todo habría que crear un fichero del estilo application-heroku.properties, de esta forma tendremos otro perfil en Spring que se llamará heroku. Ahí colocaremos la url de nuestra BBDD remota, el user, el password y todas las propiedades que sean necesarias que se ejecuten con ese perfil.
Ahora añadiremos el fichero Procfile, este es un mecanismo para declarar que comandos van a ser ejecutados por nuestra aplicación en Heroku, este fichero no debe tener extensión.
Quedaría algo de este estilo:
web: java -Dserver.port=$PORT $JAVA_OPTS -Dspring.profiles.active=heroku -jar target/example-0.0.1-SNAPSHOT.war
Como vemos, en el fichero especificamos el perfil con el que queremos que se despliegue, en este caso con el que acabamos de crear. Bien, una vez hecho todo esto, y con todos nuestros cambios subidos a git en master, procedemos a desplegar nuestra aplicación en Heroku, así que ejecutamos lo siguiente:
git push heroku master
Una vez termine el proceso nos saldrá algo como lo siguiente:
Y si accedemos a la url veremos esto:
Y ya tenemos nuestra aplicación lista en Heroku, si hemos tenido algún problema, podemos mirar el log de Heroku.
heroku logs --tail
A la vez, como tenemos Travis integrado, cada vez que realizamos el despliegue, pasará todo el proceso de integración continua y deberíamos ver algo como lo siguiente en Travis:
Enlaces y referencias:
Spring boot: https://spring.io/projects/spring-boot
Travis: https://travis-ci.org/
Heroku CLI: https://devcenter.heroku.com/articles/heroku-cli
Conclusiones:
Como hemos visto Heroku puede ser muy sencillo de utilizar, además nos lo da todo hecho, sin tener que configurar nada, y es escalable rápidamente. Sin embargo, sus add-ons suelen ser costosos, no nos permite ‘personalizar’ nuestras aplicaciones ya que nos lo da todo hecho y tiene ciertos límites de uso como los que nos mencionan aquí. Seguramente sea una buena opción para aplicaciones pequeñas-medianas o startups.
Excelente, buen artículo! Una pregunta, que pasa si cuando estas haciendoun commit, no te salen los archvios a subir.
y luego que haces el push, al final la app da error. Gracias y saludos.
Buenas tardes le escribo desde Ecuador, quisiera conocer como podemos cancelar el servicio de Heroku que nos debitan todos los meses desde nuestra tarjeta corporativa y esa valor no corresponde a servicios que nosotros hayamos contratado, por favor su ayuda con alguna respuesta.