CI/CD para projetos TypeScript: GitHub Actions nível avançado

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: Por que um CI/CD avançado para TypeScript?

Um pipeline CI/CD básico, que simplesmente executa npm test e npm build, deixa de ser eficiente assim que o projeto TypeScript começa a crescer. O tempo de build aumenta, os testes levam horas e o gerenciamento manual de versões leva a erros. Um nível avançado de configuração do GitHub Actions permite resolver esses problemas: acelerar o pipeline com cache, executar testes em paralelo para diferentes versões do Node.js e sistemas operacionais, além de automatizar o deploy para produção.

Neste artigo, abordaremos três técnicas-chave para projetos TypeScript: cache inteligente de node_modules, builds matriciais para verificar compatibilidade e deploy automático usando actions/upload-pages-artifact. Todos os exemplos são escritos em TypeScript e estão prontos para integração no seu repositório.



1. Cache inteligente de dependências e compilação

O primeiro problema em grandes projetos TypeScript é a longa instalação de dependências e compilação. O GitHub Actions fornece um mecanismo de cache, mas ele precisa ser configurado corretamente. Em vez de armazenar em cache toda a pasta node_modules (o que pode levar a versões desatualizadas), é melhor armazenar em cache o package-lock.json e a pasta .cache do compilador.

Exemplo de cache avançado para TypeScript:

name: TypeScript CI (Advanced)on: [push, pull_request]

jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' - name: Cache TypeScript cache uses: actions/cache@v4 with: path: | **/node_modules **/.tsbuildinfo key: ${{ runner.os }}-ts-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-ts- - run: npm ci - run: npm run build --if-present - run: npm test

A otimização principal aqui é o uso de hashFiles('**/package-lock.json') para gerar uma chave de cache única. Se o package-lock.json não mudou, o cache é restaurado em segundos. A flag --if-present permite pular o script de build se ele não estiver definido.



2. Builds matriciais: testando em diferentes versões do Node.js e sistemas operacionais

TypeScript é compilado para JavaScript, mas o comportamento do código pode diferir em diferentes ambientes de execução. A estratégia de matriz do GitHub Actions permite executar o mesmo pipeline em várias combinações de sistemas operacionais e versões do Node.js. Isso é crítico para bibliotecas e aplicações servidoras.

Exemplo de configuração de matriz para um projeto TypeScript:

jobs:  test:    runs-on: ${{ matrix.os }}    strategy:      matrix:        os: [ubuntu-latest, windows-latest, macos-latest]        node-version: [18, 20, 22]        exclude:          - os: windows-latest            node-version: 22      fail-fast: false

steps: - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} cache: 'npm' - run: npm ci - run: npx tsc --noEmit - run: npm test - name: Upload coverage uses: actions/upload-artifact@v4 with: name: coverage-${{ matrix.os }}-${{ matrix.node-version }} path: coverage/

Pontos-chave: