Este repositório documenta um protótipo de aplicação que recebe eventos check_suite via webhook e cria/atualiza check_run no GitHub.
Criar uma aplicação que:
- exponha a URL
POST /webhook - receba eventos de
check_suite - autentique como GitHub App usando
App ID + Installation ID + Private Key - crie/atualize/finalize check runs via API do GitHub
- GitHub dispara webhook
check_suiteparahttps://SEU_DOMINIO/webhook. - A aplicação valida assinatura (
X-Hub-Signature-256) e parseia payload. - A aplicação gera token de instalação do GitHub App.
- A aplicação usa o token para chamar API de Check Runs.
- O status aparece na aba Checks do PR/commit.
No GitHub, acesse:
SettingsDeveloper settingsGitHub AppsNew GitHub App
Configuração mínima recomendada:
GitHub App name:check-suite-local(ou outro nome)Homepage URL: URL do projetoWebhook URL: URL pública do seu endpoint (https://SEU_DOMINIO/webhook)Webhook active: habilitadoWebhook secret: obrigatório (use valor forte)
O webhook pode ser configurado já na criação do GitHub App, sem precisar voltar depois apenas para ativá-lo.
Baseado no setup deste repositório:
Repository permissions > Checks: Read & write (obrigatório)Repository permissions > Metadata: Read (obrigatório, padrão GitHub)Repository permissions > Contents: Read (opcional)
Marque no GitHub App:
check_suite(obrigatório)check_run(opcional, útil para debug/observabilidade)
Depois de criar o app:
- Abra
Settingsdo próprio GitHub App. - Vá em
Private keys. - Clique em Generate a private key.
- Salve a chave
.pemem local seguro.
Depois instale o app na organização/repositório alvo.
Você precisará de três valores:
APP_IDINSTALLATION_IDPRIVATE_KEY(.pem)
- Abra a página do seu GitHub App.
- Na seção About, copie o App ID.
- Na página do app, clique em Install App.
- Abra a instalação na organização.
- A URL terá um formato como:
https://github.com/organizations/devsfriends/settings/installations/<INSTALLATION_ID> - O número no final da URL é o
INSTALLATION_ID.
Opcionalmente, esse ID também pode ser consultado via API:
curl -H "Authorization: Bearer $JWT" \
https://api.github.com/repos/devsfriends/check-suite/installation | jq .id- Abra o GitHub App.
- Vá em
Settings > Private keys. - Clique em Generate a private key.
- Salve o arquivo
.pemem local seguro.
Exemplo de variáveis locais:
export APP_ID=2981678
export INSTALLATION_ID=113313264
export PRIVATE_KEY=scripts/check-run-test-devfriends.2026-03-01.private-key.pemGerar token de instalação:
eval "$(./scripts/create-installation-token.sh \
--app-id "$APP_ID" \
--installation-id "$INSTALLATION_ID" \
--private-key "$PRIVATE_KEY")"O script exporta INSTALL_TOKEN (válido por ~1h).
export REPO=devsfriends/check-suite
SHA=$(git rev-parse --verify HEAD)
./scripts/check-run.sh create \
--name "My Local Check" \
--sha "$SHA" \
--repo "$REPO"
./scripts/check-run.sh update \
--id <CHECK_RUN_ID> \
--status in_progress \
--repo "$REPO"
./scripts/check-run.sh complete \
--id <CHECK_RUN_ID> \
--conclusion success \
--summary "All checks passed" \
--repo "$REPO"# 1. Gere o token (válido por ~1 hora)
eval "$(./scripts/create-installation-token.sh \
--app-id "$APP_ID" \
--installation-id "$INSTALLATION_ID" \
--private-key "$PRIVATE_KEY")"
# 2. Configure variáveis
export REPO=devsfriends/check-suite
SHA=$(git rev-parse --verify HEAD)
# 3. Crie um check run
CHECK_RUN_ID=$(./scripts/check-run.sh create \
--name "My Test" \
--sha "$SHA" \
--repo "$REPO" | grep CHECK_RUN_ID | cut -d= -f2)
echo "Check Run ID: $CHECK_RUN_ID"
# 4. Atualize para in_progress
./scripts/check-run.sh update \
--id "$CHECK_RUN_ID" \
--status in_progress \
--repo "$REPO"
# 5. Complete com sucesso
./scripts/check-run.sh complete \
--id "$CHECK_RUN_ID" \
--conclusion success \
--summary "Check passed without issues" \
--repo "$REPO"| status | Quando usar |
|---|---|
queued |
Job criado e aguardando execução |
in_progress |
Job em execução |
completed |
Job finalizado (exige conclusion) |
Regras práticas:
- Criação: normalmente começar com
queued - Durante processamento: atualizar para
in_progress - Ao terminar: atualizar para
completed+conclusion
| conclusion | Quando usar |
|---|---|
success |
Execução OK, sem erros |
failure |
Execução terminou com erro |
neutral |
Sem impacto positivo/negativo |
cancelled |
Execução cancelada |
timed_out |
Execução excedeu tempo |
action_required |
Precisa de ação manual externa |
skipped |
Execução ignorada por regra |
stale |
Resultado antigo/obsoleto |
Sugestão para o webhook:
action = requestedourerequested:- criar novo
check_runcomstatus=queued - atualizar para
in_progressquando iniciar processamento
- criar novo
action = completed:- opcionalmente apenas registrar observabilidade
- ou reconciliar estado local com a conclusão recebida
Arquivos de payload de referência neste repositório:
payload-success.jsonpayload-failure.json
- Verifique se está usando
INSTALL_TOKENgerado porcreate-installation-token.sh, e não um PAT. - Confirme que o app está instalado na organização ou no repositório.
- Verifique o
INSTALLATION_ID. - Confirme no GitHub App se a instalação realmente existe.
- Verifique o valor de
REPOno formatoowner/repo. - Confirme que o repositório existe e está acessível para a instalação do app.
- O token de instalação expira em cerca de 1 hora.
- Gere um novo token executando
create-installation-token.shnovamente.
Nunca versionar:
- private key (
.pem) INSTALL_TOKEN- segredo de webhook
Recomendado:
- validar assinatura HMAC SHA-256 (
X-Hub-Signature-256) - rotacionar segredo do webhook
- renovar token de instalação periodicamente (expira)
Exemplo de .env local não versionado:
export APP_ID=2981678
export INSTALLATION_ID=113313264
export PRIVATE_KEY=scripts/check-run-test-devfriends.2026-03-01.private-key.pemCarregando e gerando token:
source .env
eval "$(./scripts/create-installation-token.sh \
--app-id "$APP_ID" \
--installation-id "$INSTALLATION_ID" \
--private-key "$PRIVATE_KEY")"