Heroku_logo

Deploy com um clique no Heroku

Hoje vamos ver algo um pouco diferente, mas um tanto quanto comum em alguns projetos de código aberto, o botão de deploy do Heroku. O Heroku é uma plataforma cloud PaaS, que suporta várias linguagens de programação e você pode fazer o deploy de uma aplicação com apenas um clique em um botão. 😀

É mágica? Não! Mas o processo de criar um botão de deploy é simples, mas irá variar de acordo com o seu projeto. Nem todos projetos são possíveis de fazer deploy com apenas um clique. O artigo de hoje irá descrever como fazer um deploy de uma aplicação simples, sem necessidade de add-ons do Heroku.

Para exemplificar melhor, eu irei utilizar um projeto desenvolvido para uso no blog, que está hospedado no Heroku, e você pode utilizá-lo caso ache-o interessante. O projeto é o Shorter e está disponível no GitHub. O Shorter é uma aplicação em Python/Tornado para gerar links curtos, em nosso caso com o domínio buteco.me.

Para que o projeto seja deployavel com apenas um clique, precisamos de dois arquivos, o app.json e o Procfile. Mas antes de ver como criar estes arquivos vamos entender o que é necessário para executar nossa aplicação fora do Heroku.

No caso do Shorter, basta você executar o comando pip install BitlyShorter para ter o pacote pronto para ser executado. Após instalado, basta executar o comando python -m shorter.app --config=config.yml para colocar o servidor no ar. No arquivo abaixo podemos observar um exemplo de configuração do Shorter.

Agora que sabemos como executar o projeto fora do Heroku, vamos entender o que são os arquivos app.json e Procfile.

app.json

O app.json é o descritor da sua aplicação, nele pode constar variáveis de ambiente, add-ons necessários, scripts de pós instalação e muitas outras configurações. Para uma descrição mais aprofundada eu recomendo a leitura do Schema do app.json.

No exemplo abaixo podemos observar o app.json do Shorter.

Os parâmetros name, description, keywords, repository, e logo são auto explicativos pelo seu nome e conteúdo e são úteis pois irão explicar sua aplicação no momento do deploy no Heroku. O parâmetro env, indica quais varáveis de ambiente são necessárias para a sua aplicação e no momento do deploy no Heroku elas serão solicitadas. No caso o Shorter precisa-se das variáveis BRANDED_DOMAIN e ACCESS_TOKEN. Outro parâmetro importante é a image, que indica qual imagem Docker irá utilizar na aplicação. No nosso caso é uma do Python.

Procfile

O Procfile é um arquivo que declara quais comandos são necessários para executar uma aplicação no Heroku, resumidamente é o ponto de entrada da sua aplicação.

No arquivo abaixo podemos observar o Procfile do Shorte.

Para entender melhor, o Shorter não aceita parâmetros pela linha de comando, a não ser o do arquivo de configuração. Como toda vez que o Heroku inicia a aplicação a porta pode ser outra, é necessário criar o arquivo config.yml antes de executar nossa aplicação. Para isso geramos o config.yml via linha de comando com o seguinte comando:

python -c "import yaml;print(yaml.dump(dict(xsrf_cookies=True, server=dict(port=$PORT, address='0.0.0.0'), bitly=dict(branded_domain='$BRANDED_DOMAIN', access_token='$ACCESS_TOKEN')), default_flow_style=False))">config.yml

O melhor jeito de criar um arquivo YAML é com o Python, passando um dicionário. Se você observar temos três variáveis de ambiente na linha acima, $PORT, $BRANDED_DOMAIN e $ACCESS_TOKEN. Como essas variáveis são dinâmicas, a criação do arquivo também deve ser. Após criar o arquivo podemos iniciar a aplicação com o comando abaixo:

python -m shorter.app --config=config.yml

Agora só falta entender o que é web no início do Procfile. Bem, o Procfile possui o seguinte formato:

<tipo do processo>: <comando>

Os tipos de processos disponíveis são web, worker, urgentworker e clock. No caso de web, indica que nosso projeto é Web. Para saber com mais detalhes, consulte a documentação Tipos de Processos e Procfile

Adicionando o botão de deploy

Agora que você já criou os arquivos necessários para deploy, vamos criar o botão de deploy do Heroku.

Para Markdown você pode usar o exemplo abaixo:

[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/alexandrevicenzi/shorter)

Para outro formato você pode usar HTML:

<a href="https://heroku.com/deploy?template=https://github.com/alexandrevicenzi/shorter"><img src="https://www.herokucdn.com/deploy/button.png" alt="Deploy" /></a>

O que você pode perceber de comum é o link https://heroku.com/deploy?template=<seu repositório>. O parâmetro template é a url do seu projeto no GitHub. Ao fazer deploy no Heroku ele irá procurar pelos arquivos app.json e Procfile na raiz do projeto, se houver alguma inconsistência, no momento do deploy será informado que seu projeto não é valido.

Resultado final

Se você seguiu o passo a passo acima o resultado será o seguinte:

Deploy

Se você quiser fazer um teste de deploy, basta clicar no botão acima.

Espero que tenham gostado. Até a próxima.