Pipelines no Github com o Github Actions
Caso você esteja iniciando a sua carreira em Tecnologia é provável que você irá se deparar com várias soluções de mercado que implementam pipelines para controle de código. Assim, você pode se deparar com tecnologias como:
- Jenkins;
- Gitlab CI/CD;
- Azure DevOps;
- Travis CI;
- CircleCI;
- Codeship.
Todas estas soluções implementam de formas diferentes a mesma ideia: CI (Continuous Integration) do seu código. Caso você não conheça muito sobre CI, recomendo esta leitura de 3 minutinhos da RedHat.
Dito isso, a ideia deste artigo é a de mostrar para você como podemos trabalhar com o Github Actions para testarmos pipelines. Isto pode ser bem útil caso não queira entrar os dados do cartão de crédito para testar no Travis CI/Gitlab, não queira instalar o Jenkins localmente para testar, já esteja acostumado no Github, ou qualquer outro motivo.
Este artigo é dividido em 3 partes. Você pode pular direto para o final caso já tenha alguma experiência com Github e com pipelines (mas não os dois em conjunto):
- Pré-requisitos para se usar o Github Actions
- Entrando no Github Actions e criando o primeiro exemplo
- Criando o próprio workflow
- Indo um pouco mais além: explorando outros pipelines
Pré-requisitos
É importante que você já tenha um repositório criado no Github contendo código em qualquer linguagem de programação. Para rodar este exemplo em específico eu utilizei Python.
A primeira parte deste tutorial é basicamente uma replicação do próprio tutorial do Github. Já a segunda endereça a criação de um “esqueleto” de um pipeline composto por 3 passos. A terceira parte é opcional, e mostra um pouco mais sobre alguns templates de pipelines que o próprio Github já oferece.
Entrando no Github Actions e criando o primeiro exemplo
O primeiro passo é entrar na página do Github Actions. Você verá uma tela parecida com esta:
Clique no botão Get started with Actions. Você se deparará com uma visão parecida com esta:
Clique no botão QuickStart. Aparecerá este tutorial, visível abaixo:
Siga os passos do item Criar o seu primeiro fluxo de trabalho. Lembre-se: caso tenha dificuldades com o inglês você pode sempre mudar o idioma para Português do Brasil no canto superior direito.
Após seguir os passos do item Criar o seu primeiro fluxo de trabalho o meu repositório ficou com essa cara. Preste atenção especificamente para o .github/workflows. É a pasta que criei seguindo o tutorial.
Não esqueça do ponto antes do “github”. É
.github
, e nãogithub
.
Os resultados ficam disponíveis no botão Actions. Veja que a segunda parte do tutorial mostra justamente como é possível consultar os resultados. Sugiro que faça também esta segunda parte para que conheça melhor esta parte.
Criando o próprio workflow
Agora é a vez de criar um próprio workflow de três estágios. Vamos clicar novamente no botão Actions e em New workflow. Depois, clicaremos em set up a workflow yourself.
Vamos partir da premissa de que temos em mãos um script que funciona no GitLab ou no Jenkins. Ele possui três estágios:
- Build: geralmente é o passo responsável por compilar a aplicação. Aqui, para fins de teste somente estamos vendo a versão em uso do Python com o python3 -V.
- Test: geralmente é o passo por executar testes na aplicação. Aqui, para fins de teste somente rodaremos um arquivo chamado
teste.py
. Criei este arquivo existe dentro do repositório e ele mostra a data e hora atuais. - Deploy: geralmente é o passo responsável para deixar aquele arquivo disponível em um servidor ou uma aplicação serverless, como o AWS Lambda e o Azure Functions. Para fins de teste mostramos somente uma frase no log (no caso, “Finalizado!”).
image: pythonstages:
- build
- test
- deploybuild-job:
stage: build
script:
- python3 -Vtest-job:
stage: test
script:
- python3 teste.pydeploy-job:
stage: deploy
script:
- echo "Finalizado!"
Aparecerá um arquivo para editar. Vamos substituir pelo código abaixo. É exatamente o teor do arquivo acima, mas com algumas modificações para funcionar no Github Actions. Isto inclui, por exemplo:
- Existe agora o parâmetro
name
, o qual possui o nome do pipeline. - Existe agora o parâmetro
on
, o qual inclui as regras responsáveis para a ativação automática do pipeline. No caso, é toda vez em que alguém faz um push ou pull request para a branch chamadamain
. Você pode modificar ou incluir mais branches. Também existe oworkflow_dispatch
, que é para ativações manuais. - O parâmetro
images
agora está dentro dosjobs
e se chamaruns-on
. É a configuração do servidor usada para rodar os testes. No Github, geralmente são versões do Linux/Windows/MacOS. - O parâmetro
stages
agora está dentro dojobs
esteps
.
name: CI
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
workflow_dispatch:
jobs:
build-job:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: python3 -V
test-job:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: python3 teste.py
deploy-job:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: echo "Finalizado!"
Ao finalizar, basta clique no botão Start commit no campo superior direito para finalizar este workflow. Os resultados aparecerão dentro do menu Actions.
Indo um pouco mais além: explorando outros pipelines
Beleza, mas que outras alternativas temos em mãos e que o Github nos oferece? Dentro do botão Actions, clique novamente em New workflow.
Aparecerão algumas sugestões mas, independentemente da linguagem de programação que você escolheu, sugeriria que você navegasse até o final da página. Veja que há um botão chamado Continuous integration. Clique nele.
Existirão opções para diferentes linguagens de programação. Como o meu exemplo foi criado em Python, utilizarei um workflow criado nesta linguagem. Mais especificamente, usarei o Python application.
Aparecerá um arquivo já pré-configurado contendo todos os passos do seu pipeline. Você pode customizar e incluir (ou remover) alguns destes passos. Sugiro usar este exemplo para entender a estrutura e a sintaxe do arquivo.
Se você nunca criou um teste no seu código é provável que se deparará com alguns erros no PyTest. O PyTest é uma biblioteca utilizada para desenvolver testes no seu algoritmo para garantir que ele esteja funcionando de acordo com o esperado. Caso tenha algum interesse por qualidade de código, sugiro a leitura deste artigo.
Finalizando
Você começará a perceber as diferenças nas configurações dos arquivos de pipelines e, ainda, o que você precisa fazer para configurar testes unitários em seu código. Assim, com a devida atenção e tempo você desenvolverá mais competências técnicas. Olha só: é provável que pelo menos uma pessoa começou a ler este artigo querendo entender um pouco mais sobre Github Actions e saiu já com um workflow do Github Actions e ainda leu um pouco sobre testes unitários. Legal, não é? :)