Introdução ao CI/CD para Projetos TypeScript
O desenvolvimento moderno de software é impensável sem automação. CI/CD (Continuous Integration / Continuous Delivery) é uma prática que permite que equipes de desenvolvimento entreguem mudanças para produção de forma rápida e segura. Para projetos em TypeScript, especialmente no ecossistema Node.js, configurar um pipeline de CI/CD torna-se uma tarefa criticamente importante.
Neste artigo, vamos abordar como configurar um pipeline de CI/CD completo para um projeto TypeScript usando GitHub Actions. Você aprenderá como automatizar a execução de testes, a compilação do projeto e o deploy para hospedagem. O material é voltado para desenvolvedores que já conhecem TypeScript e desejam implementar práticas modernas de DevOps.
O que é GitHub Actions e por que é conveniente para TypeScript
GitHub Actions é um sistema de CI/CD integrado que permite criar fluxos de trabalho automatizados (workflows) diretamente no repositório do GitHub. As principais vantagens são:
- Limite gratuito — para repositórios públicos, estão disponíveis 2000 minutos de compilação por mês.
- Integração com GitHub — não é necessário configurar serviços de terceiros.
- Flexibilidade — suporta qualquer linguagem, incluindo TypeScript, através da execução de comandos shell.
- Grande ecossistema — actions prontas para deploy em AWS, Vercel, Netlify e outras plataformas.
Para projetos TypeScript, GitHub Actions é ideal, pois permite executar facilmente comandos npm ou yarn, usar cache de dependências e tarefas paralelas.
Estrutura básica do arquivo de workflow
O workflow no GitHub Actions é descrito em arquivos YAML, armazenados no diretório .github/workflows/. Vamos analisar uma configuração mínima para um projeto TypeScript.
Crie o arquivo .github/workflows/ci.yml:
name: CI Pipeline
on: push: branches: [ main, develop ] pull_request: branches: [ main ]
jobs: build-and-test: runs-on: ubuntu-latest
strategy: matrix: node-version: [18.x, 20.x]
steps: - name: Checkout repository uses: actions/checkout@v4
- name: Setup Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }}
- name: Install dependencies run: npm ci
- name: Lint check run: npm run lint
- name: Type check run: npx tsc --noEmit
- name: Run tests run: npm test
- name: Build project run: npm run buildAnálise dos elementos-chave:
on— gatilhos de execução (push em main/develop, pull request).runs-on— sistema operacional para execução (ubuntu-latest).matrix— execução paralela em diferentes versões do Node.js (18 e 20).actions/checkout— action padrão para clonar o repositório.actions/setup-node— instalação da versão especificada do Node.js.npm ci— instalação limpa de dependências a partir do arquivo lock (mais rápido e confiável que npm install).
Adicionando cache para acelerar a compilação
Para não baixar as dependências toda vez, adicione o cache:
- name: Cache Node.js modules uses: actions/cache@v3 with: path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-node-Este passo armazena em cache o diretório ~/.npm com base no hash do package-lock.json. Em execuções repetidas, se as dependências não mudaram, o cache será restaurado, economizando de 30 a 60 segundos.