Um noindex no PR errado tira o site do Google e nenhum teste quebra: como montar um check de SEO no GitHub
O build passa, os testes passam, o site abre normal.
E mesmo assim o deploy tirou o site do Google, porque o robots.txt do staging foi junto pra produção ou uma variável de ambiente ligou o noindex em todas as páginas.
Ninguém percebe, porque pra quem visita está tudo certo.
O Google só vê na próxima vez que rastreia a página, o tráfego começa a cair dias depois e o Search Console confirma o estrago com mais alguns dias de atraso.
O lugar mais barato pra pegar isso é o pull request.
Seguem três jeitos de fazer, do mais simples ao mais completo.
1. Uma Action que lê o diff
Não depende de preview. Ela olha as linhas que o PR adiciona nos arquivos que controlam a indexação e falha se aparecer um bloqueio novo:
name: SEO no PR
on: pull_request
jobs:
seo:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Bloqueios novos de indexação
run: |
base=origin/${{ github.base_ref }}
arquivos='robots.txt public/robots.txt app/robots.ts app/layout.tsx next.config.js vercel.json _headers netlify.toml'
novas=$(git diff "$base"...HEAD -- $arquivos | grep '^+' | grep -v '^+++' || true)
if echo "$novas" | grep -Eiq 'noindex|index: *false'; then
echo "::error::noindex novo neste PR"; exit 1
fi
if echo "$novas" | grep -Eiq 'disallow: */ *$'; then
echo "::error::robots.txt passa a bloquear o site inteiro"; exit 1
fi
O ponto fraco: ela só enxerga texto. Não sabe se o noindex está dentro de um if (VERCEL_ENV !== "production"), que é o certo.
2. Lighthouse CI no preview
Se a Vercel ou a Netlify geram um preview por PR, o Lighthouse CI com a auditoria is-crawlable como error pega a página bloqueada pela meta tag, pelo cabeçalho ou pelo robots.txt.
A pegadinha: a Vercel e a Netlify mandam X-Robots-Tag: noindex em todo preview, de propósito. Sem tratar isso, o check fica vermelho em todo PR e o time desliga em uma semana.
3. Comparar o preview com a produção
O jeito que não gera alarme falso é comparar o PR com o que já está no ar: ignorar o noindex do cabeçalho que todo preview tem e travar só o que mudou de verdade.
O que travar e o que só avisar
Check que fica vermelho por tudo vira ruído. Travar só:
- robots.txt fechando o site inteiro
- noindex novo em página que estava indexada
Canonical, título, descrição e robôs de IA bloqueados: avisar, não travar.
A ressalva do repositório privado
Pra o check travar o merge, ele precisa ser obrigatório numa regra de branch (Settings > Rules > Rulesets > Require status checks to pass). Segundo a documentação do GitHub, isso funciona em repositório público em qualquer plano, mas em repositório privado só com GitHub Pro, Team ou Enterprise. No Free com repo privado, o check aparece e avisa, mas não impede o merge.
Um caso nosso
Aconteceu aqui: num PR do nosso próprio site, a gente pôs X-Robots-Tag: noindex só no feed do blog (/blog/rss.xml), pelo arquivo _headers da Cloudflare. Era a coisa certa a fazer, e o nosso check travou o PR mesmo assim, porque viu um noindex novo no _headers e não olhou pra qual caminho ele valia.
A correção foi fazer cada linha nova do _headers levar junto o caminho do bloco em que cai, e ignorar o noindex quando o caminho é feed ou arquivo de dados (.xml, .json, .txt). Arquivo de teste e lockfile também ficam de fora. Sem isso, o check vira inimigo do time.
O passo a passo completo, com a tabela comparando as três opções, está aqui: https://varrida.com/blog/check-de-seo-no-pull-request?utm_source=tabnews&utm_medium=post&utm_campaign=check-seo-pr
Na Varrida, o check "Varrida / SEO técnico" mistura a 1 e a 3: lê o código do PR primeiro e só abre o preview quando o GitHub não entrega o código. Se quiser ver antes como o seu site está hoje, a auditoria grátis lê 9 páginas e não pede cadastro: https://varrida.com/auditoria?utm_source=tabnews&utm_medium=post&utm_campaign=check-seo-pr