GITHUB ACTIONS — CI/CD PIPELINE Trigger push / PR schedule workflow_dispatch Build Install deps Compile npm run build Test Unit tests Integration npm test Scan Security Lint / Format CodeQL Deploy Production CDN / Server ssh deploy Automated pipeline runs on every push and pull request .github/workflows/ci.yml defines the entire pipeline as code

GitHub Actions é uma plataforma de integração contínua e entrega contínua (CI/CD) integrada diretamente nos repositórios GitHub. Ela permite automatizar fluxos de trabalho de build, teste e implantação sem depender de serviços CI externos. Se você é um administrador de sistemas gerenciando sites de infraestrutura, um desenvolvedor publicando pacotes ou uma equipe implantando aplicações web, GitHub Actions fornece a automação para fazer isso de forma confiável.

Este guia cobre tudo, desde a criação do seu primeiro workflow até exemplos práticos para diferentes cenários de implantação.

O Que É CI/CD?

Integração Contínua (CI) é a prática de automaticamente construir e testar mudanças de código cada vez que alguém faz push de commits em um repositório. Isso detecta bugs cedo, garante que os testes passem antes do merge e mantém o codebase em um estado implantável.

Entrega/Implantação Contínua (CD) estende o CI automatizando o processo de release. A Entrega Contínua garante que o código esteja sempre pronto para implantação, enquanto a Implantação Contínua automaticamente implanta cada mudança que passa por todos os estágios do pipeline.

Conceitos Fundamentais

Workflows

Um workflow é um processo automatizado definido em um arquivo YAML em .github/workflows/ no seu repositório. Cada workflow contém um ou mais jobs que são executados quando acionados por um evento.

Events (Eventos)

Eventos acionam workflows. Os eventos comuns incluem:

  • push: Código é enviado para uma branch
  • pull_request: Um PR é aberto, atualizado ou mesclado
  • schedule: Agendamento cron para execuções programadas
  • workflow_dispatch: Acionamento manual pelo GitHub UI

Jobs (Tarefas)

Jobs são unidades de trabalho dentro de um workflow. Jobs são executados em paralelo por padrão, mas podem ser configurados para executar sequencialmente usando needs.

Steps (Passos)

Steps são tarefas individuais dentro de um job. Cada step pode executar um comando shell ou usar uma Action (pré-construída ou personalizada).

Seu Primeiro Workflow

Crie .github/workflows/ci.yml no seu repositório:

name: CI Pipeline

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

jobs:
  build-and-test:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Run linter
        run: npm run lint

      - name: Run tests
        run: npm test

      - name: Build
        run: npm run build

Este workflow:

  1. Aciona em pushes para main ou develop e em pull requests direcionados a main
  2. Executa em um runner Ubuntu
  3. Faz checkout do código, configura Node.js, instala dependências, executa linting, testes e build

Secrets e Variáveis de Ambiente

Nunca codifique credenciais diretamente nos seus workflows. Use GitHub Secrets:

  1. Vá em Settings > Secrets and variables > Actions no seu repositório
  2. Clique em New repository secret
  3. Adicione seu secret (ex.: SSH_PRIVATE_KEY, DEPLOY_TOKEN)

Use secrets no seu workflow:

steps:
  - name: Deploy to server
    env:
      SSH_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
      SERVER_HOST: ${{ secrets.SERVER_HOST }}
    run: |
      echo "$SSH_KEY" > deploy_key
      chmod 600 deploy_key
      ssh -i deploy_key -o StrictHostKeyChecking=no user@$SERVER_HOST "cd /app && git pull && docker compose up -d"
      rm deploy_key

Exemplo Prático: Deploy de Site Astro via SSH

name: Deploy Astro Site

on:
  push:
    branches: [main]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Build site
        run: npm run build

      - name: Deploy to server
        uses: easingthemes/ssh-deploy@main
        with:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
          REMOTE_HOST: ${{ secrets.SERVER_HOST }}
          REMOTE_USER: ${{ secrets.SERVER_USER }}
          SOURCE: "dist/"
          TARGET: "/var/www/mysite/"

Cache para Builds Mais Rápidas

Faça cache das dependências para acelerar significativamente os workflows:

- name: Setup Node.js
  uses: actions/setup-node@v4
  with:
    node-version: '20'
    cache: 'npm'

Para pipelines Docker, faça cache das camadas:

- name: Set up Docker Buildx
  uses: docker/setup-buildx-action@v3

- name: Build and push
  uses: docker/build-push-action@v5
  with:
    context: .
    push: true
    tags: myapp:latest
    cache-from: type=gha
    cache-to: type=gha,mode=max

Melhores Práticas

  1. Mantenha os workflows simples e focados — um workflow por preocupação
  2. Use cache para acelerar os builds
  3. Fixe versões das Actions para reprodutibilidade (ex.: actions/checkout@v4)
  4. Nunca codifique secrets nos arquivos de workflow
  5. Use ambientes para controlar implantações em produção
  6. Adicione status badges ao seu README
  7. Use build matrix para testar múltiplas versões

Conclusão

GitHub Actions traz CI/CD diretamente para o seu repositório GitHub, eliminando a necessidade de serviços CI externos para a maioria dos fluxos de trabalho. Os exemplos de workflow neste guia cobrem os cenários mais comuns: build e teste de código, implantação em servidores e publicação de imagens Docker.

Comece com um workflow simples de build e teste, depois adicione gradualmente implantação e automação à medida que sua confiança cresce. A experiência integrada com GitHub significa menos configuração, feedback mais rápido e uma única plataforma para seu código e pipeline CI/CD.