Fluxo CI/CD com Bitbucket Pipelines
Olá! Vamos conhecer hoje o Bitbucket Pipelines, uma ótima ferramenta para continuous integration e deployment. Neste primeiro post da série, vamos ver como configurar um fluxo de CI com um exemplo simples de Node.js e vamos construindo nosso aplicativo. Em seguida, vamos ver como podemos implementar um teste simples e, finalmente, vamos aprender como conectá-lo ao Bitbucket Pipelines.
Como funciona?
Acredito que a maioria dos desenvolvedores já está habituada a trabalhar com o bitbucket para armazenar e versionar o código de seus projetos. O que poucos sabem é que é possível gerenciar pipeline de CI/CD na mesma ferramenta. A sua configuração é feita em formato YAML e é possível trabalhar com projetos Node.js, Java, Python, configurar variáveis de ambiente, chaves SSH e muito mais, para realizar deploys direto na nuvem.
Para quem trabalha com a versão premium da ferramenta, é possível realizar 1000mins/mês em builds. Caso queira saber mais detalhes dos planos oferecidos, recomendo consultar este link.
Para começar, este tutorial mostra que tudo o que você precisa é de uma conta no Bitbucket, o git e o Node instalados na sua máquina. Ah! E vontade de aprender, claro. (:
1. Construindo uma aplicação Hello World
O objetivo da aplicação é exibir um Hello World no navegador, simples assim. Primeiro, vamos criar um repositório e executar um npm init para inicializar um novo projeto Node.
mkdir helloworld
cd helloworld
npm init -y
Feito isso, vai ser criado o arquivo package.json em seu diretório, com o conteúdo abaixo:
Agora vamos instalar o Express, um framework web para o Node, e vamos salvá-lo como uma dependência com o parâmetro –save. É importante salvá-lo explicitamente como uma dependência, pois vai permitir que, mais tarde, o Bitbucket Pipelines saiba quais dependências precisam ser instaladas para testar a nossa aplicação.
npm install express --save
Crie um arquivo chamado server.js. Com o conteúdo abaixo:
Para finalizar esse passo, vamos criar outro arquivo de nome index.js:
Até aqui, nosso diretório deve ter a seguinte estrutura:
├── package.json
└── server.js
└── index.js
Vá até o arquivo package.json abaixo da linha “scripts” e adicione:
"start": "node index.js",
Vamos agora executar o comando npm start e acessar o endereço http://localhost:3000 para ver o nosso código em ação:
2. Escrevendo os testes da aplicação
Agora que temos a nossa aplicação em funcionamento, podemos começar a escrever um teste para ela. Nesse caso, nos certificaremos de que ela sempre exiba “Hello World!” corretamente quando o usuário chamar a URL base. Para fazer isso, vamos usar uma estrutura de teste chamada Mocha e uma biblioteca chamada supertest, que vai ajudar a gerenciar solicitações HTTP em nossos testes.
Execute o comando abaixo em seu terminal para instalar o Mocha e o supertest como dependências de desenvolvimento da aplicação.
npm install --save-dev mocha supertest
Vamos criar um diretório de nome test e dentro dele o arquivo helloworld.spec.js com o seguinte conteúdo:
mkdir test
touch test/helloworld.spec.js
Agora editamos o arquivo package.json, substituindo a linha “test”: “echo \”Error: no test specified\” && exit 1″ por “test”: “mocha”. Se executarmos o comando ‘npm test’ no diretório corrente, vamos ter o resultado do teste que acabamos de escrever:
3. Implementando o fluxo de CI com Bitbucket Pipelines
Agora que temos a aplicação pronta e os testes escritos, vamos habilitar a Pipeline no repositório do projeto e ver a mágica acontecer.
Em sua conta do Bitbucket, crie um repositório para o nosso projeto. Neste exemplo, criei o meu repositório com o nome de nodejs-tutorial-ci. Feito isso, vamos fazer um push do nosso projeto para o repositório remoto recém criado.
Com o repositório em questão aberto, navegue até a opção Pipelines do lado esquerdo da tela:
Neste momento, você deve visualizar uma tela semelhante a essa, com as opções de template e os tipos de aplicação que podemos trabalhar com o Bitbucket Pipelines:
Como estamos trabalhando com o Node, vamos escolher a opção JavaScript (node.js) para fazer o build e os testes da nossa aplicação. Feito isso, ele vai nos trazer um arquivo YAML com os passos necessários para iniciar nosso fluxo de CI:
Vamos comitar o arquivo e… voilà! Habemus integração contínua com o Bitbucket!
Lembrando que no arquivo YAML, temos uma infinidade de argumentos que podem ser usados para especificar o seu fluxo de integração contínua e deploy.
Para mais detalhes, recomendo a leitura da documentação que pode ser acessada neste link.
O código usado de exemplo nesse post está disponível aqui.
No próximo post, vamos focar na construção de cada um desses steps para realizar o deploy da nossa aplicação na AWS.
Até lá!