Press ESC to close

Como fazer deploy de imagem docker no Heroku utilizando Spring Boot

Hey, pessoal, como vai!?

Atualmente (2019-2020), o mercado de TI tem evoluído.

Novas tendências têm surgido e ganhado espaço e umas das tendências é o CI, que é o “Continuous Integration” (em livre tradução “Integração Contínua”).

Juntamente com o CD, que é o “Continuous Delivery” (em livre tradução “Entrega Contínua” ou em alguns casos pode ser entendido como “Deploy Contínuo”).

O texto em questão tem como objetivo explicar como fazer o deploy de uma imagem docker na plataforma do Heroku através do Bitbucket, sendo mais preciso, utilizando a ferramenta “bitbucket-pipeline”.

Desta forma, será realizado um deploy assim que um “commit” for feito no Bitbucket.

O texto é destinado para estudos, como escolha da linguagem de programação será utilizado Java, utilizando “Springboot” com “maven”.

Conhecimento prévio para o deploy

Importante informar que, cabe a cada um aperfeiçoar e/ou modificar o que está sendo passado aqui para melhor atender a suas necessidades e preferências.

Presume-se aqui que, para chegar até este ponto o leitor tem alguma familiaridade com o BitBucket (muito mais que um versionador
de arquivo), no caso, utilizar “git”.

E, certa familiaridade com o Heroku e que talvez tenha conta em ambos.

Para quem não tem conhecimento recomenda-se procurar sobre o assunto, tanto sobre o Bitbucket quanto sobre Heroku.

Para fazer este exemplo foi utilizado como IDE o “Intellij Community” e como sistema operacional “Ubuntu 18.04 LTS”.

A árvore do projeto fica da seguinte forma:

Existir essa raíz é fundamental

Observe que existe o arquivo bibtbucket-pipeline.yml na raíz do
projeto e isso é fundamental para que se possa ter sucesso.

Porém, será falado um pouco mais sobre ele e alguns outros pontos mais a
frente.

Heroku

Será feita a configuração correspondente ao Heroku.

Neste momento será criada a aplicação, será adicionado as variáveis de ambiente e será gerada a “API key”.

Criar a aplicação no Heroku

criar uma aplicação no heroku
Fácil e rápido

Adicionar variável de ambiente

O motivo de se ter variável de ambiente é por conta de que será informado qual o “Profile” será utilizado para inicializar a aplicação no Heroku.

No caso, como exemplo, é possível que se queira ter um ambiente de teste, ou de desenvolvimento, ou produção e por conta disto, será passada essa informação através da variável de ambiente.

Para adicionar uma variável de ambiente, é necessário que na área
do projeto criado

  • Vá em “Settings”;
  • Clique em “Reveal Config Vars”;
  • Informe as variáveis, que neste caso será informado como
    key: SPRING_PROFILE e como value: heroku;
  • Após informar, é só clicar no botão add.
Variável adicionada!

API key

Neste momento deve-se guardar a “API Key”, pois essa chave que possibilitará fazer o deploy de fora da plataforma do Heroku.

Para tal, vá em “Account settings” e em seguida vá ao campo “API Key”, se a chave não existir, crie uma.

Criação de uma API key
Criação de uma API key

BitBucket

Chega-se a parte do Bitbucket que é onde a mágica acontece!

Nesta etapa será habilitado o “Bitbucket Pipeline” e será adicionado as
variáveis de ambiente.

Habilitar Pipeline

Na plataforma do Bitbucket será habilitado o “pipeline” e para isso precisa ir até as configurações do projeto que foi criado, depois na opção “Pipeline > Settings” e ativar a opção.

ativando o pipeline
Ativando o pipeline

Adicionar variável de ambiente

Próximo passo será adicionar as variáveis de ambiente ao projeto.

Para isso, deve-se retornar até as configurações do projeto e ir em Pipeline > Repository variables.

Serão adicionadas as variáveis de ambiente HEROKU_API_KEY, essa que foi gerada no passo API Key do Heroku e será adicionada a chave HEROKU_APP_NAME, essa que é o nome da aplicação criada no Heroku.

Tudo isso no repositório de variáveis

Aplicação

Momento de configurar a aplicação para que assim que for realizado um “commit” no “branch master” o “pipeline” entre em ação e faça o deploy no Heroku.

Ressalto que, a linguagem de programação utilizada para este texto está sendo Java com “Springboot”, como IDE está sendo utilizado o “Intellij Community”.

Application.yml

Será criado o arquivo “application.yml” dentro da pasta “resource” do projeto, mesmo nível que o “application.properties”.

Repare que, existem dois “profiles”, um é para desenvolvimento (profile “dev”) e outro é o qual o Heroku (profile “heroku”) irá utilizar na inicialização da aplicação.

Application.yml
Neste arquivo será informado o nome do “profile” e a porta que a aplicação irá inicializar

Bitbucket-pipeline.yml

Neste ponto é necessário criar o arquivo “bitbucket-pipeline.yml” na raíz do projeto.

Ele contém a fórmula que será lida e executada dentro do Bitbucket

Repare que existe “branch: master:”, neste caso, o “pipeline” será executado toda vez que um “commit” for feito no “branch master”.

Dentro desta hierarquia têm os “steps”, esses passos que serão executados através do “script” logo após o “commit” no “branch master” for feito.

  • No “step” com nome “Create Artifact” será executado o comando “mvn -B package” (se por ventura tiver testes os mesmos serão executados).

    Em seguida será guardado temporariamente a pasta “target”, pasta essa que é gerada na execução do comando “mvn -B package”.

    Porque nessa pasta contém os arquivos que serão utilizados na criação da aplicação no “container docker”
  • No “step” com nome “Push docker image to the Heroku” será utilizado o “services” do “docker” para gerar a imagem e em seguida será executado o “script”.

    No script, o primeiro passo é instalar o “heroku standalone” (comando utilizado para instalar: curl https://cli-assets.heroku.com/install-ubuntu.sh | sh).

    Depois logar-se no sistema do Heroku e neste momento ele usará a “API Key” (que colocamos como variável de ambiente) como chave de acesso ao Heroku.

    Em seguida, a imagem docker gerada será enviada e o deploy será feito.

Dockerfile

Nessa etapa será criado o arquivo que será utilizado para criar a imagem docker.

O “Dockerfile” deverá ser criado na raíz do projeto, não deve ter extensão,

criar imagem docker
Ou seja, nada de “Dockerfile.txt”, ou “Dockerfile.yml”, ou “Dockerfile.doc”, ou “Dockerfile.sh”

Repare que a pasta “target/dependency” é utilizada no Dockerfile, por conta dessa pasta que no “bitbucket-pipeline.yml” é gerado o artefato “target/**”.

Também tem a variável de ambiente “SPRING_PROFILE”, essa variável que foi inserida como variável de ambiente no Heroku.

Observe que na linha de comando usada para inicializar a aplicação no docker é utilizado o “CMD”.

Esse é utilizado por conta do Heroku conseguir passar a variável de ambiente, pois se fosse com “ENTRYPOINT” não funcionaria.

Application.properties

No arquivo “application.properties” será adicionado a linha “server.port=${PORT}”.

No caso de ainda está em desenvolvimento, usando o “profile dev”, essa linha será ignorada e a porta será designada pelo que foi descrito no “application.yml” do respectivo “profile”.

Essa linha permite que na inicialização o Heroku consiga disponibilizar uma porta para a aplicação

Após executar esses passos, a aplicação será inicializada no Heroku e no log poderá verificar que a aplicação inicializou com o “profile heroku”.

Simples, né?

Deploy feito!

Pode-se dizer que o fluxo do processo é simples, basicamente terá uma entrada que é o “commit”, um processamento que ocorrerá dentro do Bitbucket e uma saída que será o deploy da imagem docker no Heroku.

A visão macro

O repositório do projeto no Bitbucket.

Obrigado por ter acompanhado até o final e eu espero que, de fato, tenha ajudado!