Когда tea CLI не покрывает сценарий, остаётся HTTP API. Он стабильный и одинаковый по духу у Gitea и Forgejo 🔧

Токен #

UI → Settings → Applications → Generate token.

Scopes — минимально необходимые (read:repository, write:issue, …). Для CI — отдельный bot-user.

export GITEA_URL="https://git.example.com"
export GITEA_TOKEN="…"   # из rbw, не из history

Базовый вызов #

curl -sS -H "Authorization: token ${GITEA_TOKEN}" \
  "${GITEA_URL}/api/v1/user" | jq .

Создание issue:

curl -sS -X POST \
  -H "Authorization: token ${GITEA_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{"title":"Backup failed","body":"see ntfy","labels":[]}' \
  "${GITEA_URL}/api/v1/repos/evgeny/blog/issues"

Список репозиториев (пагинация):

curl -sS -H "Authorization: token ${GITEA_TOKEN}" \
  "${GITEA_URL}/api/v1/user/repos?limit=50&page=1"

Смотрите заголовки X-Total-Count / Link — не читайте «все репо» одним запросом в цикле без page.

Python-минимум #

import os, httpx

url = os.environ["GITEA_URL"].rstrip("/")
token = os.environ["GITEA_TOKEN"]
h = {"Authorization": f"token {token}"}

r = httpx.get(f"{url}/api/v1/user", headers=h, timeout=30)
r.raise_for_status()
print(r.json()["login"])

Ошибки #

КодСмысл
401токен / заголовок
403scope или права на repo
404нет доступа (часто маскирует 403)
422валидация тела

Что автоматизировать #

  • nightly: открыть issue, если backup job failed;
  • синхронизация mirror status;
  • выкладка release notes из git log.

Не автоматизируйте force-push в main и удаление репозиториев без double-check.

Swagger #

Интерактивная схема: https://git.example.com/api/swagger. Удобно потыкать, потом перенести в скрипт.

API — тот же принцип, что и CLI: токен узкий, действия идемпотентные, логируйте что сделали 📋