Chegamos ao grande final da nossa jornada! Recapitulando o que construímos até aqui:
- Criamos um pipeline que testa e compila nosso Frontend (Angular) e Backend (.NET) em paralelo.
- Tiramos a automação da nuvem paga e colocamos em um Self-Hosted Runner gratuito.
- Automatizamos a criação de Tags e do Changelog.
Neste ponto, você já tem um processo melhor do que muitas empresas grandes por aí. Mas, se você observar os logs de execução, vai notar um gargalo frustrante: a instalação das dependências.
A cada push, seu robô perde minutos preciosos baixando a mesma pasta node_modules (o famoso buraco negro do universo) e os mesmos pacotes NuGet do zero. Hoje, vamos resolver isso e, de quebra, blindar a sua branch main contra códigos quebrados.
1. A Mágica do Cache
Em CI/CD, "Cache" significa guardar um backup das suas dependências da execução anterior. Se o seu arquivo package-lock.json ou .csproj não mudou, o GitHub Actions simplesmente restaura a pasta do cache em questão de segundos, pulando totalmente a etapa de download.
Otimizando o Frontend (Angular / Node)
Se você está usando a versão mais recente da action setup-node, o cache já vem embutido! Só precisamos ativá-lo e dizer onde está o nosso arquivo de lock, já que nosso projeto está dentro da pasta /frontend.
Vá no seu .yml da Parte 1 e atualize a etapa do Node.js:
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm' # Ativa o cache mágico!
cache-dependency-path: './frontend/package-lock.json' # Aponta para a subpasta
Pronto. Só de adicionar essas duas linhas, o tempo do seu npm ci vai cair drasticamente.
Otimizando o Backend (.NET / NuGet)
Para o C#, precisamos usar a action oficial de cache (actions/cache). Ela exige três coisas: o que salvar (caminho), como nomear o backup (key) e de onde tentar recuperar se não achar o exato (restore-keys).
Adicione este bloco logo ANTES da etapa de dotnet restore:
- name: Cache NuGet Packages
uses: actions/cache@v4
with:
path: ~/.nuget/packages
# Cria uma chave única baseada no SO e nos arquivos de projeto
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/packages.lock.json') }}
restore-keys: |
${{ runner.os }}-nuget-
Na próxima vez que o pipeline rodar, a primeira execução ainda fará o download, mas salvará o cache no final. Nas execuções seguintes, você verá a magia da restauração rápida.
2. Testando Multiversos com Matrix Builds
E se você estiver construindo uma biblioteca ou ferramenta que precisa funcionar em múltiplas versões do Node (ex: 18 e 20) ou em vários Sistemas Operacionais simultaneamente?
Você não precisa copiar e colar o seu código YAML. Basta usar a estratégia de Matrix.
jobs:
build-frontend:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18.x, 20.x, 22.x] # O GitHub vai rodar este Job 3 vezes simultaneamente!
steps:
- uses: actions/checkout@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
Com a matrix, o GitHub Actions cria caminhos paralelos automaticamente. Se uma versão falhar e as outras passarem, você sabe exatamente onde está o problema de compatibilidade.
3. O Leão de Chácara: Branch Protection Rules
De que adianta ter um pipeline que roda testes incríveis se um desenvolvedor apressado pode simplesmente clicar em "Merge Pull Request" ignorando que tudo ficou vermelho?
A automação só é útil se for obrigatória. Para isso, usamos as Regras de Proteção de Branch.
- Vá na aba Settings do seu repositório no GitHub.
- Na barra lateral, clique em Branches.
- Clique em Add branch ruleset (ou edite a regra da sua branch
main). - Marque a opção Require a pull request before merging.
- O MAIS IMPORTANTE: Marque a opção Require status checks to pass before merging.
- Na barra de pesquisa que aparecer, digite os nomes exatos dos seus Jobs (ex:
Build Angular AppeBuild & Test .NET API) e adicione-os como obrigatórios.
O Resultado: A partir de agora, o botão verde de Merge no GitHub ficará bloqueado. Ele só será liberado se o nosso GitHub Actions rodar, compilar o Angular, passar nos testes do .NET e retornar a luz verde.
Conclusão da Série
Parabéns! Se você aplicou os conceitos desta série de 4 partes, você evoluiu de "alguém que arrasta arquivos para o FTP" para um administrador de infraestrutura ágil, segura e profissional.
Dominar pipelines, gestão de secrets, runners locais e versionamento semântico são habilidades que diferenciam desenvolvedores de alto nível no mercado. O GitHub Actions é uma ferramenta incrivelmente poderosa que vai muito além de apenas subir código.
Como ficou a sua esteira de CI/CD? Qual foi o tempo que você conseguiu economizar usando o sistema de Caches? Compartilhe o link do seu repositório (ou os perrengues que passou configurando) aqui nos comentários!
Top comments (0)