Quarkus :: Deploy no Heroku pt.1

Lírio
Devspoint
Published in
5 min readDec 21, 2021

Nesse artigo aprenderemos a fazer um deploy no Heroku de uma aplicação Quarkus, a quarkus-intro criado no artigo anterior.

Heroku é uma plataforma como serviço (PaaS) que permite aos desenvolvedores construir, executar e manter suas aplicações na nuvem, suportando várias linguagens de programação. É uma das primeiras plataformas em nuvem, o Heroku está em desenvolvimento desde junho de 2007, quando suportava apenas a linguagem de programação Ruby, mas agora suporta Java, Node.js, Scala, Clojure, Python, PHP e Go, através de seus Buildpacks.

O que vamos aprender?

  • Instalar heroku-cli
  • Configurar Banco de Dados
  • Hibernate ORM
  • Deploy no Heroku :)

Os pré-requisitos para esse artigo são:

Acesse esse link para instalar o Heroku-CLI para Linux, Mac ou Windows. Após a instalação, podemos verificar a versão e realizar o Login:

Criando uma Aplicação no Heroku

Para criar uma aplicação no Heroku é muito simples, bastar executar o comando heroku create, nosso app terá um nome aleatório, por exemplo:

Passaremos como argumento o nome quarkus-intro, assim seguimos com o mesmo nome no heroku, isso ajuda a identificar a aplicação na plataforma.

Quando criamos um app no Heroku automaticamente também criamos um alias para o servidor git do Heroku, com o comando git remote -v podemos ver os alias origin (apontando para o github) e o novo alias heroku.

Deploy

Existem algumas formas de realizar um deploy no Heroku, uma delas é através do git. Execute o comando git push heroku main para fazer o deploy no Heroku.

No Heroku somente é permitido realizar o Deploy com as Branchs nomeadas como main ou master.

Deploy Failed

Para realizar o deploy com sucesso e evitar o erro acima reproduzido na imagem Gif, antes precisaremos preparar a aplicação Quarkus para realizar o deploy. São 3 itens para isso:

  1. Porta da aplicação
  2. Versão do Java
  3. Como o Heroku iniciará a aplicação.

O Heroku atribui a porta que a aplicação será executada, e o Quarkus por default roda na porta 8080, para deixar uma maneira fácil de executar a aplicação em ambiente local e também no Heroku podemos configurar a property quarkus.http.port=${PORT:8080} no arquivo application.properties em src/main/resources/, assim usando a variável de ambiente PORT o Heroku poderá atribuir a porta para a aplicação.

Vamos precisar de 2 arquivos novos no root na aplicação.

  • system.properties para configurar a versão do Java
  • Procfile para configurar como o Heroku inicia a aplicação.
# PORT
echo "quarkus.http.port=\${PORT:8080}" >> src/main/resources/application.properties
# Java Version
echo "java.runtime.version=11" >> system.properties
# java -jar
echo "web: java \$JAVA_OPTS -jar target/quarkus-app/quarkus-run.jar" >> Procfile

A aplicação utiliza o Banco de Dados Embutido H2, não configuramos a String de Conexão para rodar em ambiente local, mas para subir no Heroku precisamos deixar isso explicito, vamos configurar o tipo do BD e a url no arquivo application.properties.

Arquivos Procfile e system.properties criados e a String Connection do BD configuradas para o deploy.

Vamos comitar as alterações e fazer o deploy novamente.

No deploy temos os buildpacks do Heroku identificando a aplicação como um App Java — Java app detected.

Vamos testar a API GET /customers desenvolvido no artigo anterior.

Ao realizar o request GET /customers recebemos o erro abaixo:

{“details”:”Error id f46b8fe9-bdf7–4310–822e-4eb6d8c4b0bb-1",”stack”:””}

Para saber mais detalhes do erro utilizamos o comando heroku logs --tail, o erro nos mostra que a tabela CUSTOMERENTITY não foi encontrada. 🤔

2021–12–06T12:06:35.623378+00:00 app[web.1]: Caused by: org.h2.jdbc.JdbcSQLException: Table “CUSTOMERENTITY” not found; SQL statement:
2021–12–06T12:06:35.623378+00:00 app[web.1]: select customeren0_.id as id1_0_, customeren0_.firstname as firstnam2_0_, customeren0_.lastname as lastname3_0_ from CustomerEntity customeren0_ [42102–197]

Quarkus e Hibernate ORM

O Quarkus também utiliza as vantagens da utilização do Hibernate, implementando a especificação do JPA para mapear os objetos da sua aplicação para as Entidades do Banco de Dados Relacional.

O erro acima aconteceu pelo fato da tabela não ter sido criada de modo automático no nosso banco de dados H2, podemos contornar esse erro com uma configuração no arquivo application.properties.

quarkus.hibernate-orm.database.generation=[__VALOR__]

Para manipular o Schema do banco podemos utilizar os valores:

quarkus.http.port=${PORT:8080}quarkus.datasource.db-kind=h2
quarkus.datasource.jdbc.url=jdbc:h2:mem:test
quarkus.hibernate-orm.database.generation=drop-and-create

Não é recomendado usar o drop-and-create em produção ou ambientes de teste, muitas equipes utilizam o none e executam scripts com usuários do banco de dados diferente do usuário da aplicação com permissionamento de alterar schema do Banco (DDL) e o usuário da aplicação tem perimissões somente de comandos DML.

Vamos comitar e fazer o deploy novamente com git push heroku main e testar a API novamente.

--

--