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.
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.
- Push na main: build e deploy automatico
- Commit NEWS UPDATE(S): envio apenas dos artigos alterados entre os 7 monitorados (4 da Home + 3 de Dicas)
- Sem sobrescrever historico: novas noticias entram e as antigas permanecem na timeline
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.