Github Actions com para Data Science
Github Actions em Dados
Por: @João Pedro Santos
O Github Actions (GA) é uma ferramenta que é utilizada extensamente pela Comadre - lugar onde trabalho -, e o time de dados não é uma exceção. A ferramenta nos permite automatizar a execução de rotinas - cada rotina no GA é chamada de Workflow - de testes e verificações de cobertura de código. Isso faz com que tenhamos uma menor quantidade de erros em produção, pois eles são identificados ainda durante o desenvolvimento das aplicações. O Actions é uma funcionalidade event-based, isto é, sua execução ocorre quando algo - geralmente um commit - acontece em determinado repositório.
Todavia, o serviço não é um serviço gratuito. A Comadre possui contratada uma quota mensal de minutos de execução, e é importante que configuremos o serviço para que ele seja o mais ágil e eficiente possível. O uso de minutos varia conforme as especificações de determinado workflow
— dica: instâncias em MacOS consomem 10 vezes mais da sua quota, evite-as. Portanto, nesse breve tutorial aprenderemos a configurar o Actions para as aplicações de dados em R
e Python
.
Actions Basics
Para criar uma Action, devemos estar em um repositório GitHub hospedado remotamente, e estando dentro dele criar um diretório chamado .github
, e dentro dele criar o diretório Workflows
, dentro deste último é o local onde colocaremos nossos Workflows, que dirão ao serviço quais tarefas desejamos realizar, e quando queremos realizá-las. Temos agora a seguinte estrutura de pastas no nosso repositório:
|
|
Todo Workflow é um arquivo YAML
, e por conta disso segue uma sintaxe especifica, porém bem simples. Cada Workflow é composto por jobs, e cada job é composto por uma sequencia de etapas (steps), e que quando executados em determinada ordem, devem executar a nossa tarefa.
Recapitulando:
- Um step é a unidade básica de uma Action, e diz qual ação deve ser realizada.
- Um job é a unidade intermediária, e é o conjunto de steps, realizando uma tarefa maior. Ele controla a ordem das tarefas, executando-as sequencialmente.
- Workflow é o conjunto de jobs e todas as outras instruções adicionais, como qual tipo de evento serve como gatilho para a execução do serviço.
Segue abaixo uma estrutura básica com a explicação do que faz cada uma das possíveis instruções:
|
|
A Action acima será executada em todo commit feito em um repositório que ter como alvo a main
branch. A tarefa executada consiste em iniciar uma instância de uma máquina rodando a versão mais recente da distribuição GNU/Linux Ubuntu, iniciar uma instância do Terminal, e dentro dele executar o comando echo "ECO"
.
Veja AQUI a documentaçao do Github Actions caso tenha dúvidas adicionais.
Utilizando o Github Actions em um projeto escrito em R.
Como o chapter de dados possui as Práticas e Convenções - Dados, que sao um conjunto de boas práticas do nosso time. Seguindo elas torna-se extremamente simples desenhar um Workflow rápido e funcional. O que nos objetivamos é executar os testes automatizados da biblioteca hospedada no repositório, para isso devemos executar a função testthat::test_local()
, que é suficiente para executar a tarefa.
- Package Version Control adiciona agilidade.
Todavia, isso só é possível caso estejamos fazendo o uso da renv
, para controle de versão de bibliotecas e armazenamento delas em um cache. O que ocorre é que toda vez que instalamos uma biblioteca por meio da {renv}
, esta armazena o pacote em um cache global. O que este cache faz é guardar aquela versão da biblioteca, que é recuperada ela caso seja demandada futuramente. Isso propicia uma instalação dezenas de vezes mais rápida do que ocorreria caso fosse necessário realizar o download e a compilação do package.
Os passos a serem seguidos pelo nosso job são os seguintes:
- Iniciar uma instância com Ubuntu Linux
- Fazer o setup de um ambiente de programação com o R.
- Instalar o cURL
- Restaurar o cache de bibliotecas da
{renv}
- acontece somente caso o cache exista. - Se o cache não existir, fazer o download e instalação de todas bibliotecas necessárias - essa etapa pode demorar alguns minutos.
- Executar os testes com a
{testthat}
. - (?) Salvar o cache de bibliotecas para agilizar execução futura - acontece somente se a execução for um sucesso.
|
|
Utilizando o Github Actions em um projeto escrito em Python.
Quando usando Python, trabalhamos usando a suíte de testes do pytest
e o linter do flake8
, este último que garante que o código esteja de acordo com as PEPs. Como toque final, nós utilizamos a biblioteca coverage-badge
, que adiciona na nossa README.md
uma badge de cobertura de código, esta indica quantos $%$%‘s das funções do nosso repositório estão testadas. A estrutura básica do Workflow é a mesma, com poucas diferenças, como podemos ver abaixo:
|
|
As únicas novidades do Workflow são as linhas:
|
|
O que elas fazem é indicar as versões do software em que o Workflow deve ser executado. Esse valor é recuperado por ${{ matrix.python-version }}
que indica para outras etapas. Caso python-version
contenha mais de um valor, como por exemplo [3.7, 3.8]
, o Workflow será executado duas vezes, uma vez em cada uma das versões de Python.
Também podemos notar a novidade que é:
|
|
O que elas fazem é executar os testes usando o pytest, e usar o resultado da execuçao para gerar uma badge com a cobertura de testes - sem que voce precise utilizar serviços como o Coveralls -, mais informaçoes sobre essa badge e como fazer com que ela seja exibida na sua README.md
podem ser encontradas aqui. Além de gerar a badge, essas linhas enviam a badge atualizada para o seu repositório - documentaçao aqui.
Lembre-se sempre de manter sua requirements.txt atualizada, é ela que o Github Actions usa como base para instalar as bibliotecas necessárias para seu projeto.
É isso ai, abraços.