Texto de: Arthur Brito
Introdução
No cenário atual do desenvolvimento de aplicações, a agilidade e a minimização dos erros é essencial para garantir um processo de desenvolvimento seguro e eficiente. Uma das práticas que evidencia esse contexto é a criação de automações dos fluxos de trabalho (workflows). Com o GitHub Actions, é possível integrar, testar e implantar nossas aplicações de forma automatizada, sem a necessidade de usar ferramentas externas.
Mas afinal, o que é o GitHub Actions?
O GitHub Actions é uma plataforma de automação integrada ao GitHub, ou seja, ela não precisa de ferramentas externas para automatizar fluxos de trabalho. Definimos e executamos esses workflows a partir de arquivos YAML, que é uma linguagem de serialização de dados para escrever arquivos de configuração.
Esses workflows são compostos por jobs (trabalhos), que, por sua vez, são divididos em steps (passos). Essa ferramenta permite a execução de tarefas após o acontecimento de alguns eventos, como um push em uma branch do seu repositório e aprovação/fechamento de pull requests, o que torna o processo de integração e deploy mais prático e rápido.
Por que usar o GitHub Actions?
O GitHub Actions provê diversos benefícios para desenvolvedores, tanto em seus projetos pessoais quanto suas atividades para empresas. Essa ferramenta tem integração nativa com o GitHub, o que é muito interessante, pois não depende de ferramentas externas para funcionar.
Além disso, sua fácil configuração com arquivos YAML ajuda bastante a configurar workflows de forma rápida e prática. Com essa fácil configuração, o GitHub Actions possui um marketplace com actions já prontas para usarmos, facilitando ainda mais nosso trabalho.
Os únicos pontos negativos são uma curva de aprendizado um pouco maior para quem nunca lidou com esse tipo de arquivo de configuração antes e sua constante necessidade de atualizações (conforme um projeto vai crescendo, as necessidades de um pipeline vão crescendo junto).
Pipeline de testes para melhor entendimento
Para demonstrar o que o GitHub Actions é capaz de fazer, podemos criar um pipeline de teste para um projeto em Node.js. Para criar nosso arquivo YAML, precisamos criar um diretório dentro do diretório oculto ".github", no caminho ".github/workflows/" no nosso repositório.
name: Pipeline de Teste
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- name: Checkout do código
uses: actions/checkout@v3
- name: Configurar Node.js
uses: actions/setup-node@v3
with:
node-version: '16'
- name: Instalar dependências
run: npm install
- name: Executar testes
run: npm test
- name: Gerar relatório de cobertura
run: npm run coverage
Neste exemplo, podemos ver claramente a separação vista anteriormente: aqui, só temos um job, o build-and-test. Ele rodará em um ambiente Ubuntu, e tem 5 passos (steps) definidos: checkout do código, configuração do Node.js, instalar as dependências do projeto, executar os testes e, por fim, gerar um relatório de cobertura.
Podemos ver que esse workflow será executado na hora em que fizermos um push ou um pull request na branch main (a partir da configuração on).
Por mais simples que seja essa pipeline, podemos ver o potencial que o GitHub Actions possui.
Automatização do deploy
Após vermos um exemplo básico, podemos ver como automatizar um processo de deploy de uma aplicação. Um workflow de deploy pode ser configurado para, depois que o build da aplicação for feito, implantar o código em produção. Se tivermos um projeto cujo deploy foi feito na Vercel, por exemplo, o workflow poderia ser algo como o exemplo abaixo:
name: Deploy Automatizado
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout do código
uses: actions/checkout@v3
- name: Configurar Node.js
uses: actions/setup-node@v3
with:
node-version: '16'
- name: Instalar dependências
run: npm install
- name: Executar build
run: npm run build
- name: Deploy para Vercel
uses: amondnet/vercel-action@v20
with:
vercel-token: ${{ secrets.VERCEL_TOKEN }}
vercel-args: '--prod'
working-directory: .
Nesse workflow, o deploy é feito com pushes na branch main. Peguei a mesma base do pipeline de testes que havíamos discutido, mas, ao final do processo, fazemos o build do nosso projeto e, em seguida, usamos uma ação personalizada da Vercel para realizar o deploy. Note que o token da Vercel vem diretamente do GitHub Secrets, o que dá uma camada de proteção a mais ao processo.
Ações personalizadas
Além de ter um marketplace próprio com diversas ações já criadas, você pode criar a sua própria ação para atender às necessidades do seu projeto. Novamente, segue abaixo um exemplo básico de como isso poderia funcionar, com um arquivo action.yml:
name: "Ação customizada - Formação DEV"
description: "Exibiremos uma mensagem customizada"
inputs:
message:
description: "Mensagem a ser exibida"
required: true
default: "GitHub Actions!"
runs:
using: "node12"
main: "index.js"
E aí, poderíamos criar um arquivo index.js como o seguinte:
const core = require('@actions/core');
try {
const message = core.getInput('message');
console.log(`Mensagem: ${message}`);
} catch (error) {
core.setFailed(`A ação falhou: ${error.message}`);
}
Mas lembrando: você pode criar ações personalizadas específicas para as necessidades do seu projeto. Assim, criar ações personalizadas e reutilizáveis ao longo de vários projetos é mais fácil e torna seu desenvolvimento mais prático.
Boas práticas
Para maximizar o desempenho e a segurança dos seus workflows, uma recomendação importante é que você modularize ao máximo seus fluxos de trabalho em jobs menores, pois isso, assim como no desenvolvimento no geral, auxilia bastante no reuso e na manutenção.
Além disso, usar caching nos seus jobs também ajuda bastante no desempenho. Existe uma ação chamada actions/cache, que serve para armazenar dependências, o que reduz significativamente o tempo de execução dos seus workflows.
Para se ter um exemplo com o uso de dependências, segue a action abaixo:
- name: Cache de dependências
uses: actions/cache@v3
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
Por fim, para aumentar o nível de organização dos seus workflows, é sempre importante documentar o que cada action faz para que, no futuro, outros membros do seu projeto também saibam o que cada um faz. Ah, e não se esqueça de usar os segredos do GitHub! Eles aumentam bastante a segurança dos seus pipelines. Usar seus segredos diretamente no workflow é bastante perigoso.
Uso no dia-a-dia
Trouxe aqui três exemplos de casos de uso do GitHub Actions no dia-a-dia de um programador.
- Projeto Open-source Em um projeto open source, como o projeto que temos na FormaçãoDEV de plataforma de ensino à distância, cada pull request poderia acionar um pipeline do GitHub Actions de testes e, se for aprovado, uma build de pre-release seria gerada e poderia ser avaliada posteriormente.
- Integração com a Nuvem Se você for utilizar serviços na nuvem, como na AWS, por exemplo, pode configurar workflows que, após a aprovação/validação de testes, acionam scripts de deploy automatizado, que atualizam os ambientes de produção do seu projeto automaticamente.
- Fluxos personalizados Com o uso de ações customizadas, você pode adaptar a pipeline para necessidades específicas do seu projeto, como validar regras de negócio ou gerar relatórios internos para sua empresa.
Conclusão
Com esse artigo, podemos perceber que o GitHub Actions transforma totalmente a maneira como desenvolvemos nossos projetos, integrando automação diretamente no fluxo de trabalho dos nossos repositórios do GitHub. Podemos configurar pipelines completas de CI/CD, o que reduz bastante o tempo de entrega de um produto e nos permite focar em atividades mais estratégicas no desenvolvimento da nossa aplicação.
Vimos também que o GitHub Actions é bastante flexível, nos permitindo criar ações personalizadas além das já existentes no marketplace, o que nos garante bastante personalização e adaptação a cenários específicos. Por último, recomendo que você mesmo faça alguns testes com o GitHub Actions nos seus projetos, pois, além de ser uma ferramenta muito útil, é bastante valorizada no mercado.