Pular para o conteúdo

A API do GitHub

Issue, comentário no PR, status do commit, release e workflow_dispatch — com paginação e o limite de taxa.

GH.cliente(token) fala a API REST v3: manda os cabeçalhos que ela pede (Accept, X-GitHub-Api-Version), pagina seguindo Link: rel="next", guarda o limite de taxa que sobrou e nunca imprime o token. Sem token, ele usa o GITHUB_TOKEN do ambiente — que é o que existe dentro de um job.

dataforge
adopt Arcane.GitHub as GH

gh := GH.cliente()          // GITHUB_TOKEN do ambiente
out gh                      // o token nunca aparece
assert "sem token" in str(gh) or "com token" in str(gh)

// O que e recusado ANTES de ir a rede:
monitor:
    gh.status("dono/repo", "abc123", "ok")
    assert no
handle Error as e:
    out e.message

monitor:
    gh.repositorio("sem-barra")
    assert no
handle Error as e:
    out e.message

No CI: comentar o resultado no PR#

dataforge
adopt Arcane.GitHub as GH

// ci/comentar.df — roda num job de pull_request
action comentar_cobertura(percentual):
    c := GH.contexto()
    ev := GH.evento()
    numero := ev["pull_request"]["number"] ?? void
    given numero is void:
        yield no
    gh := GH.cliente()
    gh.comentar(c["repositorio"], numero,
        $"Cobertura: **{percentual}%** — [execucao]({c['url_da_execucao']})")
    yield yes

// Fora de um PR nao comenta nada — e nao quebra.
assert comentar_cobertura(87) is no

O que ele oferece#

MétodoEndpoint
repositorio(repo)GET /repos/{repo}
issues(repo, estado)todas as páginas — e sem os PRs, que a API mistura
criar_issue(repo, titulo, corpo, rotulos)POST /repos/{repo}/issues
comentar(repo, numero, texto)issue ou PR — para a API, os dois são issues
status(repo, sha, estado, contexto)o ✓/✗ ao lado do commit
criar_release(repo, tag, …)POST /repos/{repo}/releases
disparar_workflow(repo, arquivo, ref, entradas)workflow_dispatch
todas(caminho) / pedir(metodo, caminho, corpo)qualquer outro endpoint

Continue em Release por tag.