Когда 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 | токен / заголовок |
| 403 | scope или права на 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: токен узкий, действия идемпотентные, логируйте что сделали 📋