Registro Livre um projeto Open Source para tornar aberto registros públicos
Como era um projeto que as pessoas desenvolviam em seu tempo livre, a rotatividade dos membros da equipe era grande, e queríamos encontrar uma forma fácil para que as novas pessoas pudessem contribuir, já que levava quase uma semana para configurar os ambientes de desenvolvimento.
Já havia uma abordagem através do Vagrant, que faz a virtualização de uma máquina inteira incluindo hardware e sistema operacional. Mas manter toda uma máquina virtual parecida com os ambiente de testes e produção era muito difícil, pois não era viável reproduzir o mesmo nos ambientes de Staging e Produção.
Foi então que surgiu a ideia de usar o Docker. Ele era capaz de nos ajudar nos dois problemas, tanto para termos um ambiente igual em todos os lugares, quanto para facilitar a entrada de novas pessoas no projeto.
Resolvemos primeiro atacar a dificuldade de montar o ambiente de desenvolvimento. Criamos dois Dockerfiles: um para a nossa aplicação e outro para o banco de dados. O primeiro deles descreve como será nossa imagem para a app com Java 8 instalado e arquivo com extensão .jar para executá-la, como pode ser visto abaixo:
# Dockerfile_java
FROM java:openjdk-8-jdk
WORKDIR /usr/registrolivre
CMD java -jar registrolivre.jar
Já o segundo determina como será a imagem do banco de dados com Postgres e um script para popular alguns dados iniciais. Ao lidar com persistência de dados em containers, alguns cuidados são necessários - abordarei isso com detalhes em um próximo post.
# Dockerfile_db
FROM postgres:9.4
ADD create_initial_sgdb_data.sh /docker-entrypoint-initdb.d/create_initial_sgdb_data.sh
E para facilitar a nossa vida, também criamos um docker-compose, que é uma ferramenta do ecossistema Docker que nos ajuda a rodar e a conectar os dois containers, como no arquivo a seguir:
# docker-compose.yml
reglivre:
image: registrolivre/java:latest
restart: always
ports:
— “80:8080”
links:
— db
db:
image: registrolivre/db
Como o Docker permite que tenhamos o mesmo ambiente em vários lugares virtualizando apenas um pequeno pedaço, conseguimos resolver o nosso problema de ter um ambiente igual em todos os lugares.
Com uma das nossas questões resolvidas, ficou faltando apenas facilitar a entrada de novos contribuidores. Para isso, utilizamos o Gradle como nosso gerenciador de tarefas para fazer tudo com somente um comando, que dividimos nas seguintes etapas:
dividimos nas seguintes etapas:
Chamamos esta tarefa de deployDocker, pois ela realiza o build e faz a aplicação rodar dentro do Docker. Assim todo novo contribuidor só vai precisar de poucos passos para rodar o Registro Livre:
Não foram só flores, encontramos alguns espinhos
Ao longo de todo esse processo passamos por algumas dificuldades com o Docker e o funcionamento de seu ecossistema. No início parece muita coisa para entender, mas isso faz parte do aprendizado e do crescimento do time. No time, fomos estudando cada um à sua maneira e compartilhando o conhecimento. Ao fim, valeu todo o esforço e conseguimos não só atingir o objetivo como também aprender com ele. Deixo aqui alguns materiais que nos ajudaram:
Depois de termos dificuldades por diferenças nos ambientes e passar por percalços para configurar o ambiente para novas pessoas no projeto, chega a dar prazer trazer uma nova pessoa para o time e ver como é fácil fazer tudo funcionar de forma tão simples hoje.