Do Obsidian ao site: publicar com Azure Pipelines
- 4 min de leitura
Nesta página
O Azure Pipelines é o serviço de automação do Azure DevOps, da Microsoft. Ele faz o mesmo que o GitHub Actions da página anterior: a cada envio do vault que mexe no blog ou no site, gera o site e o publica na Cloudflare. O vault continua no GitHub; o Azure DevOps só lê o repositório.
Use esta página no lugar da do GitHub Actions, não junto com ela: com as duas, cada envio publicaria o site duas vezes.
O pipeline completo
trigger:
branches:
include: [main]
paths:
include: [blog, .site, azure-pipelines.yml]
pr: none
pool:
vmImage: ubuntu-latest
steps:
- checkout: self
displayName: Baixar só blog/ e .site/
fetchDepth: 1
fetchFilter: blob:none
sparseCheckoutPatterns: /blog/ /.site/
- task: UseNode@1
displayName: Preparar o Node
inputs:
version: 22.x
- script: |
npm ci
npm run build
displayName: Gerar o site
workingDirectory: .site
- script: npx wrangler@4 deploy --assets ./dist --name meu-blog --compatibility-date 2026-10-15
displayName: Publicar na Cloudflare
workingDirectory: .site
env:
CLOUDFLARE_API_TOKEN: $(CLOUDFLARE_API_TOKEN)
CLOUDFLARE_ACCOUNT_ID: $(CLOUDFLARE_ACCOUNT_ID)
O arquivo se chama azure-pipelines.yml e fica na raiz do vault. Troque meu-blog e a data pelos que você usou na primeira publicação na Cloudflare.
O que cada parte faz
Quando roda (trigger). Num envio para a main que mexe em blog/, em .site/ ou no próprio pipeline. pr: none desliga as execuções em pull request, que um vault não usa.
Baixar só blog/ e .site/. O checkout baixa só o último commit (fetchDepth: 1), não baixa de antemão o conteúdo dos arquivos (fetchFilter: blob:none) e deixa no disco só as duas pastas (sparseCheckoutPatterns, padrões separados por espaço). O conteúdo das suas outras notas não chega à máquina do pipeline; só a lista de nomes dos arquivos, que faz parte do commit. Por padrão, o Azure Pipelines não deixa a credencial do repositório gravada na pasta baixada.
Preparar o Node. A tarefa UseNode@1 instala a versão mais recente do Node 22, a linha que o template pede.
Gerar o site e Publicar na Cloudflare. Os mesmos comandos que você roda no computador. Se o template recusar alguma nota, o passo de gerar falha e a publicação não roda. As variáveis secretas do Azure só chegam a um comando quando aparecem no env dele, como no último passo.
Sobre o plano gratuito
Em projetos privados, o Azure Pipelines dá um job gratuito de até 60 minutos por vez, com limite de 1.800 minutos por mês. Para receber esse plano gratuito, a organização precisa estar ligada a uma assinatura válida do Azure, com cobrança configurada. É um passo a mais que o GitHub Actions não pede, e o motivo de o guia recomendar o GitHub Actions para quem não usa o Azure DevOps.
Criar o pipeline
- Em dev.azure.com, crie uma organização e, dentro dela, um projeto privado.
- Crie o arquivo no repositório do vault pelo site do GitHub: Add file → Create new file, nome
azure-pipelines.yml, cole o pipeline e clique em Commit changes. Depois, traga a mudança para o computador com Fetch origin e Pull origin no GitHub Desktop. - No projeto, vá a Pipelines → New pipeline, escolha GitHub e autorize o Azure Pipelines a ler os seus repositórios.
- Escolha o repositório do vault. O Azure DevOps encontra o
azure-pipelines.ymle mostra o arquivo. - Antes de rodar, clique em Variables e crie as duas variáveis da página da Cloudflare:
CLOUDFLARE_API_TOKEN, com Keep this value secret marcado, eCLOUDFLARE_ACCOUNT_ID. - Salve e rode.
Na primeira execução, o Azure DevOps pode pedir autorização para o pipeline usar algum recurso. A execução fica esperando até alguém clicar em Authorize resources e confirmar.
Conferir a primeira execução
Mova uma nota para blog/ e envie o vault. Em Pipelines, aparece uma execução com o log de cada passo.
| Se falhar em | Causa provável |
|---|---|
| Gerar o site | Uma nota fora do que o template pede. O log mostra a nota e a propriedade |
| Publicar na Cloudflare | Variável faltando, não mapeada no env ou token vencido |
| Nada rodou | O envio não mexeu em blog/, .site/ nem no pipeline, ou o gatilho do pipeline foi desligado nas configurações dele |
Em qualquer falha, o site no ar continua como estava.