Configurando Travis-CI no Flask

Para aqueles que possuem interesse em integração contínua e querem saber como aplicá-la em Python, principalmente em Flask, mas não sabem por onde começar, espero esclarecer algumas dúvidas aqui. Irei falar mais adiante sobre integração contínua (CI), Travis e como aplicá-lo no Flask.

Como geralmente ocorre, este post também surge de uma necessidade recente que tive um pouco de dificuldade para encontrar informações. No geral, integrar Flask com Travis é bem simples, porém ninguém te dá aquelas diquinhas que evitariam fazer você quebrar a cabeça por uma hora, que é basicamente a ideia aqui.

O que é Integração Contínua?

Integração contínua é uma forma de facilitar e agilizar todo o processo de desenvolvimento até o produto final. Resumidamente, você vai interligar as ferramentas que utiliza para desenvolver, versionar, testar e realizar deploy para que tudo ocorra de forma praticamente simultânea.

No exemplo que veremos, assim que fizermos um commit para o GitHub a ferramenta de integração contínua irá realizar os testes da nossa aplicação a partir do nosso arquivo de testes e, se tudo funcionar, irá fazer o deploy automático no Heroku.

O que é Travis-CI?

Travis-CI é uma ferramenta de integração contínua para testar e realizar a build de aplicações disponibilizadas no GitHub. Logo, ele é o nosso hub para interligar as ferramentas desde o desenvolvimento ao deploy.

Travis é uma ferramenta muito completa e bastante personalizável, fácil de configurar e com uma excelente interface para o usuário. Recomendo que assim que você termine este guia, faça um tour dentro da ferramenta para descobrir ainda mais possibilidades e informações interessantes dentro da sua aplicação.

O funcionamento geral do Travis após estar integrado com uma aplicação resume-se a avaliar se ela está funcional sempre que for atualizada e, em alguns casos, realizar seu deploy. Para isso, o Travis cria instâncias de ambiente virtual para cada teste e verifica se, naquele ambiente, seu deploy foi realizado com sucesso.

Como integrar Travis e Flask?

Então, para começarmos logo, vamos pegar uma estrutura simples de aplicação com Flask:

meuapp/
├── app.py
├── my_unittests.py
├── venv/
└── requirements.txt

Não se esqueça: para conseguirmos realizar a integração, precisamos que nosso código esteja hospedado no GitHub.

Registrando-se no Travis-CI

É claro que o primeiro passo para utilizarmos o Travis é nos registrarmos na ferramenta. Inclusive, o registro é bem fácil pois você se registra com sua conta do GitHub, o que já permite que o Travis identifique todos os seus repositórios e deixe-os prontos para serem integrados.

Agora, um detalhe: para realizar a integração com repositórios privados, você precisa se registrar no travis-ci.com, que funciona com planos pagos; se você quiser realizar a integração apenas com repositórios públicos, você pode se registrar no travis-ci.org, que é gratuito.

Ativando o repositório

Uma vez registrado, você será enviado a uma página que lista todos os seus repositórios. Caso não esteja vendo esta página, ela é seu perfil no Travis, então é só acessar ele. Além disso, se você estiver no seu perfil e não estiver vendo seus repositórios, clique em Sync Account para solicitar uma nova sincronização com seu perfil e identificar os repositórios.

Agora que temos todos os repositórios visíveis, podemos apenas clicar no botão para ativar a integração no repositório que desejamos.

Selection_012

“Flip the switch”

Criar o arquivo .travis.yml

Nosso repositório já está sendo “vigiado” para novas mudanças, porém o Travis só saberá como agir se informarmos a ele de alguma forma. Para isso, usamos um arquivo chamado .travis.yml.

Para configurarmos o Travis para trabalhar bem com nossa aplicação Flask, vamos  informar a linguagem de programação que ele deve usar:

language: python
python:
  - "2.7"
  - "3.5"

Além da linguagem, passamos as versões que o Travis deve testar. Para cada versão que consta na lista, o Travis irá criar um novo ambiente virtual e testar sua aplicação. É como se ele estivesse fazendo um deploy com cada versão da lista e verificando se o deploy funcionou. No final, seu build só irá passar se todas as versões passarem no teste.

Atualmente, o Travis suporta da versão 2.6 até a nightly (no momento, a 3.6-dev) mais recente do Python.

Dependências

Sempre que instalamos novos módulos na nossa aplicação, precisamos instalar eles também no ambiente de deploy para tudo funcionar, certo? Por isso, o Travis também precisa instalar esses módulos no ambiente virtual que ele cria para poder realizar os testes da nossa aplicação.

Geralmente, eu utilizo o arquivo requirements.txt para manter uma lista de todos os módulos que instalei na minha aplicação utilizando:

pip freeze > requirements.txt

Isso faz com que o pip pegue todos os módulos instalados no meu ambiente e gere uma lista com seus nomes e versões em um arquivo requirements.txt.

Feito isso, para instalar estes módulos, é só executar:

pip install -r requirements.txt

Este comando diz para o pip ler linha por linha do arquivo requirements.txt e realizar a instalação de um deles de cada vez.

Agora, voltando para o Travis, como ele irá fazer isso? Do mesmo jeito. O Travis só precisa saber qual comando ele usa para instalar as dependências e, sabendo disso, ele as instalará. Adicione a seguinte informação ao seu arquivo .travis.yml:

install: pip install -r requirements.txt

Se você tivesse mais de um comando para instalar as dependências, poderia informá-lo passando mais de uma linha na opção install:

install:
    - pip install sua-extensao-especial
    - pip install -r requirements.txt

Variáveis de ambiente

Variáveis de ambiente podem ter diversos usos dentro da nossa aplicação. Eu, geralmente, utilizo elas para armazenar as configurações da minha aplicação. Posso ter, por exemplo, uma variável DEBUG=True e outra DATABASE_URL=”sqlite://storage.db”. Sem essas  variáveis minha aplicação não irá funcionar de maneira adequada e, portanto, os testes do Travis também não irão.

Para informar estas variáveis para o Travis, adicionamos ao arquivo .travis.yml:

env:
    -DEBUG=True DATABASE_URL="postgres://localhost/test"

Mas por que eu informei todas as minhas variáveis em uma só linha?
Para cada linha de env do arquivo, o Travis irá criar um novo ambiente que possui as variáveis que estão naquela linha apenas e realizar um teste daquele ambiente. Ou seja, cada linha é mais uma instância de teste e, se eu tivesse várias versões para testar, eu teria um teste de cada versão para cada linha de env. Muita coisa!

Portanto:

env:
    - DEBUG=True
    - DATABASE_URL="postgres://localhost/test"

É diferente da configuração anterior e irá criar um ambiente novo pra cada linha de env que temos, onde um ambiente terá apenas a variável DEBUG e o outro terá apenas a variável DATABASE_URL. Cuidado com isso!

Banco de dados

Para realizarmos testes, também precisamos ter um banco de dados de testes. No meu caso, vou utilizar Postgres, mas você pode usar qualquer um. A única coisa que precisamos é criar um banco de dados dentro do ambiente do Travis que tenha a URL do banco de dados que configuramos na aplicação.

Por exemplo, configurei minha aplicação para conversar com um banco de dados “postgres://localhost/test”, portanto tenho que criar um banco chamado test pelo Postgres.

before_script:
  - psql -c 'create database test;' -U postgres

before_script é um campo que informa tudo que deve ser executado antes do Travis testar nosso “deploy”, ou seja, antes de testar a build. No caso, coloquei uma linha de comando para criar um banco Postgres chamado test.

Scripts

Scripts são os testes que devem passar para nosso build estar funcional. O Travis compreende que qualquer execução que retorne 0 (significando 0 erros) está funcionando.

script: nosetests my_unittests.py

Podemos passar várias linhas de scripts como fizemos nas opções anteriores, ou apenas uma. Além disso, podemos indicar a execução dos testes de diferentes formas, nosetests é a mais básica para a execução dos unit tests que temos. Fora ela, podemos indicar a execução de qualquer outra forma que passará quando retornar 0:

script: bash shellscript.bash

Deploy

O deploy irá variar dependendo do seu host. Para o exemplo, vou utilizar o Heroku. A ideia aqui é que o Travis realize um deploy automático para o Heroku sempre que todos os testes passarem e nossa aplicação estiver OK.

deploy:
    provider: heroku
    api_key:
        secure: "seu_token"

Dessa forma, informando que o host utilizado é o Heroku, passamos nosso Token do Heroku para que ele consiga se conectar. Passamos o token dentro de uma chave secure para que o token seja transmitido de forma criptografada e segura.

Conclusão

Seu arquivo .travis.yml final deve parecer:

language: python
python:
  - "versaox"
  - "versaoy"
install: pip install -r requirements.txt
env:
    - VAR1 VAR2
before_script:
  - psql -c 'create database seu_db;' -U postgres
script: nosetests seus_testes.py
deploy:
    provider: heroku
    api_key:
        secure: "seu_token"

Para que você execute sua primeira build, ou seja, seu primeiro teste no Travis, você precisa fazer um commit & push para o seu repositório. Se tudo der certo, basta acessar o site do Travis onde se registrou para verificar se a build ocorreu com sucesso ou falhou.

Daí em diante, todos os seus commits serão monitorados para que você acompanhe quando a aplicação não estiver mais funcionando corretamente e será feito o deploy automático sempre que ocorrer uma build com sucesso.

Anúncios

2 comentários sobre “Configurando Travis-CI no Flask

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s