Ruby on Rails + Bitbucket Pipelines

Utilizar CI (Continuous Integration) nos dias de hoje é algo muito comum e extremamente necessário para que uma equipe de desenvolvimento de software consiga atingir o mínimo de qualidade e rapidez quando se trata de entregar novas features em um produto. Em 2016, a Atlassian lançou uma ferramenta chamada Pipelines, baseada em Docker, integrada ao Bitbucket e se mostrando um ótimo concorrente de outros serviços parecidos como Travis CI e Circle CI.

É importante destacar que com essa ferramenta nós podemos fazer tanto CI quanto CD (Continuous Deployment), mas, por hoje, vamos focar somente em CI, ok?

Vamos assumir que já temos um repositório com duas branches: master e stage. Nesse repositório já temos uma aplicação Ruby on Rails, e que essa aplicação já está com o RSpec devidamente configurado.

Ao lado esquerdo temos a opção Pipelines. Quando clicarmos nessa opção, serão exibidos vários ícones de diversas tecnologias (PHP, JavaScript, Java, docker, etc…) ao lado de um seletor para com mais um monte de opções, e então selecionamos Ruby. O que está acontecendo aqui é que o Pipelines está nos dando o template do arquivo bitbucket-pipelines.yml, algo que poderiamos fazer em nosso próprio repositório local, se quiséssemos, o que não será necessário no momento.

Esse arquivo precisa ficar no diretório root de nosso projeto(quase toda ferramenta de CI/CD exige isso como padrão),

Agora vamos clickar na opção “commit file”, e o resultado será a tela a seguir:

Pipelines efetuou um commit(“a49189d”) na branch master e executou nosso bitbucket-pipelines.yml. Como nada de errado foi encontrado, recebemos o feedback Successful da ferramenta.

Ao lado direito, em logs, vemos o que foi executado quando o Pipelines fez sua primeira análise. Destaque para o “bundle install”, presente na linha 14 do bitbucket-pipelines.yml, pertencente a chave scripts, que como o nome já diz, irá executar todos os scripts que forem mandados. É aqui que iremos definir que atualizações de sistema, testes e outras tarefas que deverão ser executadas sempre que alterações forem “mergeadas” na branch, e é isso que faremos agora.

Vamos configurar nossos scripts para, além de executar o bundle install,também  atualizar o sistemainstalar bibliotecas necessárias e executar nossos testes. Podemos fazer isso atualizando nosso repositório local(git pull origin master) e realizando as modificações pelo nosso editor, ou clicando no link “View configuration”. Vou optar pela última alternativa.

Após as alterações, assim ficará o bitbucket-pipelines.yml .

Agora é só clicar em “commit”, voltar para os logs do Pipelines e…

O sistema foi atualizado, as bibliotecas instaladas, o bundle install foi executado, mas os testes apresentaram um problema. Isso é o que acontece quando o Pipelines encontra algo de errado, dando o feedback Failed.

Ao lado temos em logs o que de fato ocorreu: Algo deu errado na hora da execução do script que deve gerar nosso banco de dados do ambiente de testes. Para resolver o problema teremos que configurar nossos serviços e configurações de banco de dados.

Primeiro setamos as variáveis de ambiente!

Indo em settings > Environment variables>add, vamos configurar nossas variáveis de ambiente. Sem isso o Pipelines não irá conseguir criar ou alterar o banco de dados, já que não terá acesso para tal.

Agora voltamos ao bitbucket-pipelines.yml e definimos qual a imagem do PostgresSQL vamos utilizar (no meu caso, escolhi a 9.5)

Após o commit, basta voltar ao monitor do Pipelines e, se tudo der certo, teremos novamente o feedback Successful.

Em logs temos todas os scripts sendo executados na ordem em que definimos. Caso um Pull Request seja aberto por um outro dev e nesse Pull Request tenha um teste que não passe, por exemplo, ficaremos sabendo na hora e poderemos recusá-lo, impedindo que um possível bug entre na branch master.

Comandos diferentes para branches diferentes

Falando em branch master, lembra que no início nós assumimos que estamos trabalhando com duas branches diferentes(master e stage)? Em nosso exemplo o Pipelines está configurado para não distinguir, mas algumas alterações no bitbucket-pipelines.yml é tudo que precisamos para definir scripts específicos para branches específicas.

Importante destacar que ao definir uma configuração de scripts para uma branch específica, a configuração default é ignorada para dar lugar a configuração dessa branch.

É… o texto acabou ficando longo =/

Espero que essas dicas ajudem e ficarei muito grato por qualquer feedback, seja positivo ou não.

Até a próxima!