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:
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
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 comovalue
:heroku
; - Após informar, é só clicar no botão
add
.
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.
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.
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.
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.
Bitbucket-pipeline.yml
Neste ponto é necessário criar o arquivo “bitbucket-pipeline.yml” na raíz do projeto.
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,
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”.
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”.
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.
O repositório do projeto no Bitbucket.
- git clone
[email protected]/maironpublic/test-bitbucket-pipeline-heroku.git - git clone
[email protected]:maironpublic/test-bitbucket-pipeline-heroku.git
Obrigado por ter acompanhado até o final e eu espero que, de fato, tenha ajudado!