bot: клиент SourceCraft API с ретраями #10

Closed
opened 2026-10-12 19:33:40 +03:00 by Eleboba · 0 comments
Owner

Описание

Обёртка над REST API для CI-прогонов и логов (ARCHITECTURE §2.3, шпаргалка). API периодически рвёт TLS-соединения.

Желаемый результат

  • SourceCraftClient: list_runs(repo), get_run(repo, run), get_cube_logs(repo, run, workflow, task, cube), trigger_workflow.
  • Ретраи на сетевые ошибки и 5xx (экспоненциально, до 5), 4xx — исключения с телом ответа.
  • Ответы — pydantic-модели.

Подзадачи

  • Снять реальные ответы /cicd/runs и логов → фикстуры в tests/fixtures/sourcecraft/
  • app/sourcecraft/client.py, models.py
  • Тесты на respx: ретраи, разбор ответов, ошибки

Анализ

Затрагиваемые файлы

Файл Что меняется
app/sourcecraft/ новый пакет
tests/sourcecraft/ новый

Ограничения и риски

Токен — только в заголовке, не в логах. Пагинация через next_page_token.

Как проверить

make test; ручной скрипт python -m app.sourcecraft.cli runs выводит последние прогоны.


Лог выполнения

Перенесено из SourceCraft: https://sourcecraft.dev/rogachevegorushka/tgit/issues/10

2026-10-14

  • app/sourcecraft/client.py + models.py: list_runs, get_run, get_cube_logs (постранично: ?page=N, пока page_complete), run_commit_sha, run_url. Ретраи: сетевые ошибки и 5xx, задержка 0.5→1→2→… (≤ 8 с), 4xx — SourceCraftError сразу. Статусы и типы событий — из swagger.
  • Находка: у прогона в API нет sha коммита, фильтра по коммиту нет, логи служебных #-кубов не отдаются → сопоставить пуш и прогон напрямую нельзя. Решение — ADR-014: первый куб check/meta в tgit-uploads печатает TGIT_COMMIT_SHA=$SOURCECRAFT_COMMIT_SHA. Шаблон обновлён и залит в tgit-uploads (932f4b1); на прогоне 1000002 клиент вернул ровно этот sha.
  • Очередь бесплатных раннеров: прогон 1000002 ждал старта ~6 мин — учесть в таймаутах наблюдателя (#11).
  • Ссылка на прогон в UI — шаблон SOURCECRAFT_RUN_URL_TEMPLATE; формат не проверить снаружи (SPA отвечает 200 на всё) — нужно подтверждение в браузере.
  • Тесты: 12 на реальных ответах API (фикстуры tests/fixtures/sourcecraft/), ретраи с подменённым sleep. CLI python -m app.sourcecraft.cli runs проверен вживую. Порог покрытия 45 → 80 (сейчас 86,6 %).
## Описание Обёртка над REST API для CI-прогонов и логов ([ARCHITECTURE §2.3](docs/ARCHITECTURE.md), [шпаргалка](docs/dev/SOURCECRAFT_API.md)). API периодически рвёт TLS-соединения. ## Желаемый результат - `SourceCraftClient`: `list_runs(repo)`, `get_run(repo, run)`, `get_cube_logs(repo, run, workflow, task, cube)`, `trigger_workflow`. - Ретраи на сетевые ошибки и 5xx (экспоненциально, до 5), 4xx — исключения с телом ответа. - Ответы — pydantic-модели. ## Подзадачи - [x] Снять реальные ответы `/cicd/runs` и логов → фикстуры в `tests/fixtures/sourcecraft/` - [x] `app/sourcecraft/client.py`, `models.py` - [x] Тесты на `respx`: ретраи, разбор ответов, ошибки ## Анализ ### Затрагиваемые файлы | Файл | Что меняется | |------|--------------| | `app/sourcecraft/` | новый пакет | | `tests/sourcecraft/` | новый | ### Ограничения и риски Токен — только в заголовке, не в логах. Пагинация через `next_page_token`. ## Как проверить `make test`; ручной скрипт `python -m app.sourcecraft.cli runs` выводит последние прогоны. --- ## Лог выполнения > Перенесено из SourceCraft: https://sourcecraft.dev/rogachevegorushka/tgit/issues/10 ### 2026-10-14 - `app/sourcecraft/client.py` + `models.py`: `list_runs`, `get_run`, `get_cube_logs` (постранично: `?page=N`, пока `page_complete`), `run_commit_sha`, `run_url`. Ретраи: сетевые ошибки и 5xx, задержка 0.5→1→2→… (≤ 8 с), 4xx — `SourceCraftError` сразу. Статусы и типы событий — из swagger. - **Находка:** у прогона в API **нет sha коммита**, фильтра по коммиту нет, логи служебных `#`-кубов не отдаются → сопоставить пуш и прогон напрямую нельзя. Решение — ADR-014: первый куб `check/meta` в `tgit-uploads` печатает `TGIT_COMMIT_SHA=$SOURCECRAFT_COMMIT_SHA`. Шаблон обновлён и залит в `tgit-uploads` (`932f4b1`); на прогоне `1000002` клиент вернул ровно этот sha. - Очередь бесплатных раннеров: прогон `1000002` ждал старта ~6 мин — учесть в таймаутах наблюдателя (#11). - Ссылка на прогон в UI — шаблон `SOURCECRAFT_RUN_URL_TEMPLATE`; формат не проверить снаружи (SPA отвечает 200 на всё) — нужно подтверждение в браузере. - Тесты: 12 на реальных ответах API (фикстуры `tests/fixtures/sourcecraft/`), ретраи с подменённым `sleep`. CLI `python -m app.sourcecraft.cli runs` проверен вживую. Порог покрытия 45 → 80 (сейчас 86,6 %).
Eleboba added this to the M1 · MVP: загрузка → коммит → CI milestone 2026-10-12 19:33:40 +03:00
Eleboba added the botfeaturesize/1 labels 2026-10-12 19:33:40 +03:00
Eleboba self-assigned this 2026-10-12 19:33:40 +03:00
Eleboba added a new dependency 2026-10-12 19:40:37 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Reference: HSE/tgit#10