ci: проверки бота в SourceCraft CI #28
@@ -0,0 +1,30 @@
|
|||||||
|
# CI бота. Код приходит push-зеркалом из Gitea (ADR-010): PR живут в Gitea, поэтому
|
||||||
|
# триггер pull_request здесь не сработает — проверяем каждый push в любую ветку.
|
||||||
|
# Деплой на хост (workflow deploy на push в main) — #12.
|
||||||
|
on:
|
||||||
|
push: check
|
||||||
|
|
||||||
|
workflows:
|
||||||
|
check:
|
||||||
|
settings:
|
||||||
|
max_cube_duration: 10m
|
||||||
|
tasks:
|
||||||
|
- name: quality
|
||||||
|
cubes:
|
||||||
|
- name: lint
|
||||||
|
image: ghcr.io/astral-sh/uv:0.8-python3.12-bookworm-slim
|
||||||
|
env:
|
||||||
|
UV_LINK_MODE: copy
|
||||||
|
script:
|
||||||
|
- uv sync --frozen
|
||||||
|
- uv run ruff check .
|
||||||
|
- uv run ruff format --check .
|
||||||
|
- uv run mypy
|
||||||
|
- name: test
|
||||||
|
needs: ["-"]
|
||||||
|
image: ghcr.io/astral-sh/uv:0.8-python3.12-bookworm-slim
|
||||||
|
env:
|
||||||
|
UV_LINK_MODE: copy
|
||||||
|
script:
|
||||||
|
- uv sync --frozen
|
||||||
|
- uv run pytest -q --cov --cov-report=term
|
||||||
@@ -94,6 +94,7 @@
|
|||||||
**Последствия:**
|
**Последствия:**
|
||||||
- В SourceCraft ничего не пушим и не мержим — зеркало перезаписывает его целиком.
|
- В SourceCraft ничего не пушим и не мержим — зеркало перезаписывает его целиком.
|
||||||
- Триггер `pull_request` в SourceCraft не срабатывает (PR живут в Gitea) → CI бота запускается на `push` во все ветки.
|
- Триггер `pull_request` в SourceCraft не срабатывает (PR живут в Gitea) → CI бота запускается на `push` во все ветки.
|
||||||
|
- SourceCraft берёт триггеры CI из основной ветки → основная ветка `tgit` в SourceCraft — `dev` (в Gitea остаётся `main`); иначе CI включался бы только после продвижения в `main`.
|
||||||
- Токен SourceCraft хранится в настройках зеркала Gitea → нужен отдельный токен с доступом только к `tgit`.
|
- Токен SourceCraft хранится в настройках зеркала Gitea → нужен отдельный токен с доступом только к `tgit`.
|
||||||
- Issues #1–#21 перенесены из SourceCraft с теми же номерами; в SourceCraft закрыты со ссылкой.
|
- Issues #1–#21 перенесены из SourceCraft с теми же номерами; в SourceCraft закрыты со ссылкой.
|
||||||
|
|
||||||
|
|||||||
@@ -61,14 +61,27 @@ curl -s -X POST -H "$H" -H "$J" "$R/milestones" -d '{"name":"M5 · …","descrip
|
|||||||
## CI/CD
|
## CI/CD
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -s -H "$H" "$R/cicd/runs" # прогоны
|
curl -s -H "$H" "$R/cicd/runs" # прогоны: {"runs": [...], "next_page_token"}
|
||||||
curl -s -H "$H" "$R/cicd/runs/<run>" # статус прогона
|
curl -s -H "$H" "$R/cicd/runs/<run>" # прогон: status + workflows[].tasks[].cubes[]
|
||||||
curl -s -H "$H" "$R/cicd/logs/<run>/<workflow>/<task>/<cube>" # лог куба
|
curl -s -H "$H" "$R/cicd/logs/<run>/<workflow>/<task>/<cube>" # лог куба: {"logs": "...", "page_complete", "done"}
|
||||||
|
|
||||||
|
# ручной запуск (head и config_revision — {"branch"|"tag"|"commit": ...}; по умолчанию — основная ветка)
|
||||||
|
curl -s -X POST -H "$H" -H "$J" "$R/cicd/runs" \
|
||||||
|
-d '{"head":{"branch":"feat/x"},"config_revision":{"branch":"feat/x"},"workflows":[{"name":"check"}]}'
|
||||||
|
|
||||||
# секрет: value — base64 от значения
|
# секрет: value — base64 от значения
|
||||||
curl -s -X PUT -H "$H" -H "$J" "$R/secrets/DEPLOY_HOST" -d "{\"value\":\"$(printf %s 'user@host' | base64 -w0)\"}"
|
curl -s -X PUT -H "$H" -H "$J" "$R/secrets/DEPLOY_HOST" -d "{\"value\":\"$(printf %s 'user@host' | base64 -w0)\"}"
|
||||||
```
|
```
|
||||||
|
|
||||||
Исходящих webhooks нет — статус CI получаем опросом (ADR-003).
|
- **Триггеры `on:` читаются из `.sourcecraft/ci.yaml` основной ветки репозитория.** Пока файла там нет — push ничего
|
||||||
|
не запускает. Основная ветка `tgit` в SourceCraft — `dev` (`PATCH $R -d '{"default_branch":"dev"}'`), чтобы CI
|
||||||
|
включался мержем в `dev`, а не продвижением в `main`.
|
||||||
|
- Прогон: `slug` — числовой (`1000000`…), `status`: `created` → `processing` → `success`/`failed`; `event_type`:
|
||||||
|
`push`/`manual`/…. У кубов служебные шаги со `slug`, начинающимся на `#` (`#git-clone`, `#prepare-image-for-<cube>`).
|
||||||
|
- Если куб упал, остальные кубы задачи остаются в `created` и не запускаются.
|
||||||
|
- Код в кубе склонирован в `/sourcecraft/workspace` (`$SOURCECRAFT_WORKSPACE`) — это рабочий каталог. Переменные:
|
||||||
|
`SOURCECRAFT_COMMIT_SHA`, `SOURCECRAFT_COMMIT_REF_NAME` и др.
|
||||||
|
- Исходящих webhooks нет — статус CI получаем опросом (ADR-003).
|
||||||
|
|
||||||
## Метки репозитория
|
## Метки репозитория
|
||||||
|
|
||||||
|
|||||||
@@ -57,7 +57,10 @@ testpaths = ["tests"]
|
|||||||
[tool.coverage.run]
|
[tool.coverage.run]
|
||||||
source = ["app"]
|
source = ["app"]
|
||||||
branch = true
|
branch = true
|
||||||
|
omit = ["app/__main__.py"]
|
||||||
|
|
||||||
[tool.coverage.report]
|
[tool.coverage.report]
|
||||||
show_missing = true
|
show_missing = true
|
||||||
skip_covered = true
|
skip_covered = true
|
||||||
|
# Ratchet: raise as code lands, never lower. Target by M4 — 70 (SPEC §5.2).
|
||||||
|
fail_under = 45
|
||||||
|
|||||||
Reference in New Issue
Block a user