Deploy automatizado para o PyPI usando Travis-CI

Como o Travis pode te ajudar a automatizar o lançamento de novas versões de um pacote Python para o Python Package Index.

Jessica Temporal
Operação Serenata de Amor
5 min readSep 28, 2017

--

Pessoas que escrevem bons códigos normalmente seguem a filosofia DRY (“don’t repeat yourself” ou não se repita). Além de fazer isso em código, muitas fazem o mesmo para tarefas que vão ter que ser repetidas com certa frequência: subir uma nova máquina virtual, configurar o ambiente de trabalho ou até mesmo o deploy de novas versões de código. Evitar repetições e automatizar processos se torna algo muito presente no nosso trabalho diário principalmente por ser uma das essências da computação.

Ao perceber que, os passos para o lançamento de uma nova versão de um pacote vão ser os mesmos toda vez que um pull request é aceito, no projeto a automatização se torna necessária. Nessas horas o raio automatizador pega e tudo que se passa pela cabeça é: menos tempo em tarefas repetitivas, mais tempo em problemas interessantes.

Fonte

Incremento na versão = deploy

Quando um novo pull request chega, além da famosa revisão de código é proposto um incremento no número da versão, ou seja, um bump. Esse bump traz algumas informações básicas sobre as mudanças que esse pull request quer introduzir no código já existente. Inclusive, se quiser entender um pouquinho de como versionamos a Toolbox, da uma olhadinha nesse texto que escrevi sobre isso.

Quando o pull request é aceito, ele passa a oficialmente a fazer parte do pacote e recebe o status de merged. E isso requer que quatro passos sejam executados para finalizar o processo de deploy:

  1. Limpeza: remoção dos arquivos de distribuição da versão anterior;
  2. Criação dos sources distribuitions;
  3. Criação do wheel;
  4. Upload dos arquivos da versão nova pra o PyPI.

Todos esses passos são descritos em detalhes num post anterior e fazem parte de liberar as novas versões de qualquer pacote no PyPI. E, para nossa felicidade, o Travis-CI provê suporte a deploy para PyPI.

Fonte

Travis-o-quê?

CI. Isso mesmo, de continuous integration. Se você não conhece Travis, pode ser que conheça outras ferramentas de integração contínua, como CircleCI ou Jenkins. Mas basicamente, tanto o Travis quanto essas outras ferramentas servem para automatizar o desenvolvimento de software rodando algumas tarefas básicas toda vez que novo código é adicionado à base inicial. Tarefas essas como: rodar testes, refazer os passos de setup e até mesmo algum nível de code review.

Essas tarefas procuram facilitar a entrega e lançamento contínuos de software, seja ele open source ou não. Assim, ao desenvolver software, as pessoas podem focar em resolver problemas e criar soluções sem perder tempo executando tarefas repetitivas.

Configurando o deploy no Travis

Assim como o Circle, o Travis utiliza arquivos .yml para configurar todas as suas tarefas. Inicialmente, o .travis.yml da Toolbox estava assim:

Essas 13 linhas se encarregavam de rodar dois jobs, um para cada tipo de teste disponível unit ou journey. Em cada um desses continuo jobs alguns comandos são rodados. Para preparar o ambiente para rodar os testes:

$ python setup.py develop

Para instalar a biblioteca coveralls que gera os relatórios dos testes:

$ pip install coveralls

E finalmente, para de fato rodar os testes e gerar os relatórios de cobertura de testes:

$ coverage run -m unittest discover tests/$TEST_SUITE

Depois disso, quando esses passos forem bem sucedidos, vem o comando para iniciar o Coveralls, que assim como o Travis tem um serviço online que facilita a visualização dos relatórios.

E o deploy? Como faz?

Para chegar no deploy de fato, é necessário que todos os passos narrados até agora sejam bem sucedidos. E também a adição de algumas linhas no nosso .travis.yml, veja:

Começando na linha 15 com um simples aviso de que o deploy está sendo iniciado, as linhas seguintes definem

  1. O provedor onde o deploy será feito, no caso o PyPI;
  2. O usuário que está fazendo deploy: serenata (criamos um usuário para o projeto);
  3. O campo da senha;
  4. Os tipos de distribuição: source distribuitions e wheel;
  5. E por último, a partir de qual branch deve ser feito o deploy.

Note que o campo da senha vem preenchido apenas por uma variável de ambiente. Antes de escrever o nosso .yml, consultamos alguns amigos sobre como fazer tal automatização:

Pessoas com pacotes no #PyPI vocês automatizaram o deploy de uma nova versão e como? Preciso de alguém para falar sobre isso

e gentilmente algumas respostas chegaram com links de projetos no GitHub que continham tal configuração:

e pessoas com quem falar:

Fale com o Elyezer sobre como o projeto Pulp Smash faz os lançamentos semanais para o PyPI

E investigando o .yml do projeto que o Bruno Cezar Rocha indicou, apenas uma coisa não me agradou: a senha cifrada no arquivo. Então voltei ao site do Travis em busca das variáveis de ambiente. E olha a segunda surpresa boa: Variáveis de ambiente, que são inseridas pelo painel de configuração do Travis, podem ter seus valores escondidos dos logs, perfeito para uso de senhas e chaves de API.

Fonte

E sendo assim, basta adicionar a senha com o nome da variável correspondente (aquela que definimos lá no .yml) para permitir o sucesso do deploy:

Foto no nosso settings no Travis.

E no seu log você pode conferir o resultado:

Foto do log no Travis

E a partir de agora o deploy está automatizado. E você estará usando algo que a sua ferramenta de CI tem a oferecer para facilitar o desenvolvimento diariamente.

Para acompanhar o projeto

Para saber mais sobre o que acontece no dia a dia do projeto, nos siga no Facebook e comece por aqui para contribuir com código.

Além disso, você pode fazer com que a Operação Serenata de Amor continue a todo vapor. Também aceitamos doações pela carteira de Bitcoin 1Gbvfjmjvur7qwbwNFdPSNDgx66KSdVB5b.

--

--

Jessica Temporal
Operação Serenata de Amor

DevRel 🥑 • Author • 🎙Podcaster @pizzadedados • Creator of GitStudyCards.com • GitHub ⭐️ • cross-stitcher & knitter • 🇧🇷 & 🇨🇦 • she/her