Tutorial: integrar Sentry ao pipeline de deploy com GitHub Actions para upload automático de source maps e criação de issues (PHP e JavaScript) — passo a passo

Ferramentas & Produtividade · Por · Publicado em · 10 min de leitura

Mesa de escritório com monitor grande mostrando layouts de interface, teclado mecânico e plantas
Estação de trabalho limpa com monitor exibindo layouts; transmite desenvolvimento e deploy Foto: Pew Nguyen / Pexels

Este tutorial ensina como integrar Sentry ao pipeline de deploy com GitHub Actions para upload automático de source maps e criação de issues (PHP e JavaScript). Você vai criar releases, enviar source maps no CI e versionar frontend e backend na mesma release, garantindo stack traces legíveis e correlação com commits do deploy.

Pré-requisitos e o que você vai configurar

Você vai criar um fluxo de CI/CD que registra uma release no Sentry, envia source maps do frontend e marca a versão no backend PHP. Ao final, qualquer exceção em produção vira uma issue no Sentry com stack trace desofuscado e associada ao commit do deploy.

O que você precisa antes de começar:

- Conta e projeto no Sentry (org e project slug).

- DSN do Sentry para o frontend (público) e backend (servidor).

- Token de autenticação do Sentry com permissão de releases.

- Repositório no GitHub com GitHub Actions habilitado.

- Projeto JS que gere source maps (Vite ou Webpack) e um backend PHP com Sentry SDK.

Se você ainda não tem pipeline de deploy, veja ideias de etapas em deploy canário com GitHub Actions e como acelerar builds em runners efêmeros no GitHub Actions. Para observabilidade de ponta a ponta em PHP, confira observabilidade em PHP com Sentry.

Configurar Sentry no JavaScript e gerar source maps do build

Inicialize o SDK do Sentry no seu app JS e garanta que o bundler gere source maps de produção. O source map é o arquivo que mapeia o JavaScript minificado para o código-fonte original, permitindo stack traces legíveis. A documentação da MDN explica o conceito de forma detalhada.

Defina as variáveis de release e environment vindas do pipeline (por exemplo, via Vite). Não publique os .map no CDN; vamos enviar os arquivos para o Sentry no CI.

// Instale o SDK do browser
// npm i @sentry/browser --save

// src/sentry.ts (ou no bootstrap do app)
import * as Sentry from "@sentry/browser";

Sentry.init({
  dsn: import.meta.env.VITE_SENTRY_DSN, // DSN público do projeto
  release: import.meta.env.VITE_RELEASE, // versão injetada pelo CI
  environment: import.meta.env.MODE || "production",
});

// Exemplo: capturar erro manual (para teste)
// Sentry.captureException(new Error("Sentry JS test error"));

// vite.config.ts (Vite) — habilite sourcemap em produção
// import { defineConfig } from "vite";
// export default defineConfig({
//   build: { sourcemap: true },
// });

// webpack.config.js (Webpack) — alternativa
// module.exports = {
//   // ...
//   devtool: "source-map", // gera .map para produção
// };

PHP: instalar SDK e marcar release/env no bootstrap

No backend PHP, instale o SDK e inicialize com DSN, release e environment. Isso garante que exceções do servidor sejam atribuídas à mesma release do frontend. Frameworks podem ter integrações próprias; a base abaixo funciona em qualquer app PHP.

Para capturar exceções não tratadas, você pode usar o handler padrão do SDK ou integrar ao seu framework. Evite logar tokens sensíveis nas exceções.

<?php
// Instale o SDK PHP (Composer):
// composer require sentry/sdk

require_once __DIR__ . '/vendor/autoload.php';

Sentry\init([
    'dsn' => getenv('SENTRY_DSN'),
    'release' => getenv('RELEASE') ?: getenv('SENTRY_RELEASE'),
    'environment' => getenv('ENVIRONMENT') ?: 'production',
]);

// Exemplo de teste
// try {
//     throw new Exception('Sentry PHP test error');
// } catch (Throwable $e) {
//     Sentry\captureException($e);
// }

Quais segredos e variáveis usar no GitHub Actions?

Crie segredos no repositório para o token do Sentry e slugs de organização/projeto. Variáveis de release e environment podem ser definidas como env do workflow. Nunca exponha o SENTRY_AUTH_TOKEN em logs.

Chave Tipo Uso
SENTRY_AUTH_TOKEN Secret Autenticar sentry-cli para releases e upload de source maps
SENTRY_ORG Secret Slug da organização no Sentry
SENTRY_PROJECT Secret Slug do projeto no Sentry
SENTRY_DSN_PUBLIC Secret DSN público para o frontend (injetado no build)
SENTRY_DSN Secret DSN do servidor para o PHP (configuração na infra)
RELEASE Env Versão do deploy (ex.: GITHUB_SHA ou tag)
ENVIRONMENT Env Ambiente do deploy (ex.: production, staging)

Pipeline GitHub Actions: build, release e upload automático de source maps

O workflow abaixo cria uma release no Sentry, associa commits, envia source maps gerados pelo bundler e finaliza a release. Ele também injeta RELEASE e DSN público no build do frontend para que os eventos cheguem marcados corretamente.

Se seu deploy tiver etapas adicionais (canário, smoke tests, rollback), integre com seu pipeline existente. Exemplos: deploy canário e pipeline com rollback e smoke tests.

name: deploy

on:
  push:
    branches: ["main"]

env:
  RELEASE: ${{ github.sha }}
  ENVIRONMENT: production

jobs:
  build-and-release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0 # necessário para set-commits --auto

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

      - name: Install deps
        run: npm ci

      - name: Build (inject release and DSN)
        run: |
          echo "VITE_RELEASE=${RELEASE}" >> .env
          echo "VITE_SENTRY_DSN=${{ secrets.SENTRY_DSN_PUBLIC }}" >> .env
          npm run build

      - name: Install sentry-cli
        run: npm i -g @sentry/cli

      - name: Create release in Sentry
        env:
          SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
          SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
          SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
        run: |
          sentry-cli releases new "$RELEASE"
          sentry-cli releases set-commits "$RELEASE" --auto

      - name: Upload source maps to Sentry
        env:
          SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
          SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
          SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
        run: |
          # Ajuste o caminho conforme seu bundler (ex.: dist, build)
          sentry-cli releases files "$RELEASE" upload-sourcemaps ./dist \
            --url-prefix "~/" \
            --validate --rewrite

      - name: Finalize release
        env:
          SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
          SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
          SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
        run: sentry-cli releases finalize "$RELEASE"

      - name: Deploy
        run: |
          # Execute seu deploy (ex.: rsync, kubectl, serverless, etc.)
          echo "Deploy step here"

Como marcar a mesma release no backend PHP durante o deploy?

O backend precisa receber a mesma variável RELEASE e ENVIRONMENT usadas no workflow. Você pode publicar essas variáveis no .env do servidor, no manifest do container ou no service manager (ex.: systemd, ECS). O PHP lerá esses valores no bootstrap para enviar eventos ao Sentry com a versão correta.

  • Grave RELEASE e ENVIRONMENT na configuração do serviço.
  • Reinicie o processo PHP/FPM após alterar variáveis.
  • Garanta que o DSN do servidor (SENTRY_DSN) esteja configurado no host, container ou secret manager.
# Exemplo simples: escrever variáveis em um .env no servidor durante o deploy
# (substitua /var/www/app pelo caminho do seu app)
ssh user@host "echo 'RELEASE=${RELEASE}' | sudo tee -a /var/www/app/.env && \
               echo 'ENVIRONMENT=${ENVIRONMENT}' | sudo tee -a /var/www/app/.env && \
               sudo systemctl restart php-fpm"

Como confirmar que funcionou (verificação pós-deploy)?

Valide a integração gerando uma exceção de teste no frontend e no backend. Em poucos segundos, o Sentry deve criar issues com a release e o environment corretos, e o stack trace do JS deve aparecer desofuscado graças aos source maps.

Faça o teste apenas em ambiente controlado e remova o código após validar.

  • Verifique no Sentry que os eventos estão na release correta.
  • Confirme que o stack trace JS aponta para arquivos/linhas originais.
  • Cheque que o environment corresponde ao production ou staging.
# Frontend (abra o console do navegador após o deploy)
// window.Sentry.captureException(new Error("Sentry JS test after deploy"));

# Backend PHP (rota temporária)
<?php
// /debug/sentry-test (remova depois)
throw new Exception('Sentry PHP test after deploy');

Solução de problemas comuns

Eventos chegam sem release? Garanta que a variável RELEASE foi injetada no build do frontend e está disponível no bootstrap PHP. O valor precisa ser idêntico ao usado no sentry-cli releases.

Source maps não aplicam? O caminho (url-prefix) deve corresponder ao que o app serve em produção. Se seus assets vivem sob /static ou CDN, ajuste o prefixo. Nunca publique .map publicamente; mantenha-os privados e envie só ao Sentry.

Token inválido ou sem permissão? Recrie o SENTRY_AUTH_TOKEN com escopos de releases no Sentry. Não grave o token em logs. Use GitHub Secrets.

Build remove os .map? Confirme a configuração do bundler (Vite: build.sourcemap=true; Webpack: devtool=source-map). A documentação da MDN tem um guia sobre source maps.

Commits não aparecem na release? Verifique se o repositório foi checado com histórico completo (fetch-depth: 0) antes de set-commits, ou forneça o range manual ao sentry-cli. Em monorepo, informe project corretamente.

Perguntas frequentes

Preciso expor o DSN no frontend?

Sim, o SDK do navegador usa um DSN público para enviar eventos. Esse DSN não dá acesso administrativo. O DSN do servidor (backend) deve ficar protegido como secret. Nunca exponha o SENTRY_AUTH_TOKEN, que é usado apenas no CI para releases e upload de source maps.

Como definir a versão (release) automaticamente no CI?

Use uma versão derivada do repositório, como GITHUB_SHA, um tag semântico ou um hash curto. O importante é usar o mesmo valor no sentry-cli releases, no build do frontend e na configuração do backend para que os eventos sejam atribuídos corretamente à mesma release.

Onde ficam os source maps: Sentry ou CDN?

Para o Sentry funcionar, basta enviar os source maps para o Sentry via CI/CD. Eles não precisam ficar públicos na CDN. Manter .map privados evita expor código-fonte. Garanta apenas que url-prefix e paths correspondam aos assets produzidos e servidos em produção.

Quais permissões o token do Sentry precisa para o upload?

O token (SENTRY_AUTH_TOKEN) deve permitir criar e editar releases e fazer upload de arquivos. Crie-o no Sentry com escopos apropriados ao projeto e armazene em GitHub Secrets. Restrinja o escopo por organização/projeto e revogue tokens antigos periodicamente.

Posso usar a action oficial em vez do sentry-cli via npm?

Sim. Você pode usar uma action dedicada para releases do Sentry. Ela simplifica o set-commits, upload de source maps e finalize. O fluxo de variáveis e segredos permanece o mesmo. Prefira essa opção se quiser menos etapas de shell no workflow.

Funciona com monorepos e múltiplos projetos no Sentry?

Funciona, mas você deve executar sentry-cli para cada projeto no qual deseja publicar a release e os source maps, informando SENTRY_PROJECT correto. Ajuste diretórios de build por app e defina releases consistentes entre os serviços para manter a correlação entre frontend e backends.

Quer evoluir seu pipeline com observabilidade prática?

Integre releases, source maps e detecções rápidas de regressões ao seu CI/CD. Se você já usa GitHub Actions e quer avançar com canário, smoke tests e rollback, continue pelos guias sugeridos e implemente hoje.

Explorar mais tutoriais

Veja também