Voltar ao início
GitHub 30 março, 2026 6 min de leitura

GitHub Actions no Blog: Deploy e Newsletter Automatica

Neste artigo, mostro o workflow real da nossa aplicacao: build, deploy no Azure App Service e envio de newsletter por e-mail quando o commit e NEWS UPDATES.

GitHub Actions CI/CD pipeline

Visao geral do fluxo na nossa aplicacao

No nosso projeto, o GitHub Actions faz mais do que CI/CD padrao. O pipeline publica o site no Azure App Service e, em um cenario especifico, tambem dispara o envio de newsletter para todos os inscritos da tabela Subscribers no Azure Table Storage.

Como configurei o workflow para disparo automatico

Criei um arquivo de workflow no .github/workflows/ que fica de olho na branch main. Sempre que faço um push, o GitHub Actions automaticamente pega o codigo, configura uma maquina com Node.js 20, roda npm install para instalar dependencias, executa o build e roda os testes. Se tudo passar, seguimos para o proximo passo. Se algo quebrar, recebo a notificacao e posso corrigir.

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v3
        with:
          node-version: '20.x'
      - run: npm install && npm run build && npm run test

Como configurei o deploy automatico no Azure

Depois que o build passa com sucesso, um segundo trabalhos entra em acao para fazer o deploy. Configurei as credenciais do Azure (client ID, tenant ID e subscription ID) como segredos no GitHub para manter seguro. Com essas credenciais, faco login no Azure e uso a acao oficial de deploy para publicar a aplicacao no meu App Service chamado app-crsouza-blog. O Azure recebe os arquivos compilados e coloca online em producao.

- name: Login to Azure
  uses: azure/login@v2
  with:
    client-id: ${{ secrets.AZURE_CLIENT_ID }}
    tenant-id: ${{ secrets.AZURE_TENANT_ID }}
    subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

- name: Deploy to Azure Web App
  uses: azure/webapps-deploy@v3
  with:
    app-name: app-crsouza-blog
    slot-name: Production
    package: .

Quando disparo a newsletter

A parte mais legal da minha automacao eh que nao envio email a cada deploy. Criei uma condicao especifica: a newsletter so dispara se a mensagem do commit contiver NEWS UPDATE. Assim, posso fazer quantos deploys quiser sem enviar emails desnecessarios para os inscritos. Quando realmente tenho noticia nova, altero os artigos desejados e uso essa mensagem no commit para enviar somente os artigos alterados entre os 7 monitorados.

- name: Send Newsletter For NEWS UPDATES
  if: github.event_name == 'push' && contains(github.event.head_commit.message, 'NEWS UPDATE')
  env:
    NEWSLETTER_COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
    NEWSLETTER_COMMIT_HASH: ${{ github.sha }}
  run: node scripts/send-newsletter-on-update.js

Como funciona o envio da newsletter

Criei um script no Node.js que faz o trabalho pesado. Quando disparado, ele cruza os arquivos alterados do commit com a lista fixa dos 7 artigos monitorados (4 da Home e 3 da Dicas). Depois consulta a tabela de inscritos no Azure Table Storage para pegar a lista completa de e-mails. Para cada pessoa inscrita, constroi um email personalizado apenas com os artigos alterados e envia via Azure Communication Services.

const newsItems = extractUpdatedNewsFromCommit(commitDecision.commitHash);
await initializeDataStore();
const subscribers = await listSubscribers();

for (const subscriber of subscribers) {
  await sendNewsUpdateEmail({
    name: subscriber.name,
    email: subscriber.email,
    newsItems
  });
}

Ponto importante de operacao

Para evitar reenvio duplicado no mesmo commit, o script grava o hash no arquivo de cache .cache/last-newsletter-commit.txt. Se o mesmo hash reaparecer, o envio e ignorado.

Conclusao

Esse desenho de GitHub Actions ficou ideal para o blog: deploy automatico no Azure para cada entrega e newsletter automatizada apenas quando ha atualizacao de noticias. Resultado: menos operacao manual, mais consistencia e comunicacao rapida com os inscritos.

Referencias