feat(pipeline): уведомления CI/CD — PipelineWatcher, CI загрузок на Gitea Actions
CI / ruff · mypy · pytest (pull_request) Failing after 3m40s

- app/pipeline: протокол CIProvider, клиент Gitea Actions (прогон по head_sha, упавший
  шаг, лог джоба, ретраи), PipelineWatcher — опрос только при незавершённых push,
  сообщение о push обновляется CI ⏳ → ✅/❌ → CD 🚀/⛔, автору — отдельные уведомления
- деплой сервисов — только после зелёного CI; старый push не откатывает сервис,
  который развернёт более новый; после рестарта бот продолжает с того же места
- CI_PROVIDER=none — прежнее поведение (деплой сразу после push)
- шаблон tgit-uploads: .gitea/workflows/check.yml; .gitea/ защищён от правок из бота
- миграция 0002: старые push помечены skipped, чтобы не слать им «таймаут CI»
- ADR-016, ARCHITECTURE §2.5/§5.2, README, DEPLOY, .env.example

Refs #11

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-19 00:24:08 +03:00
co-authored by Claude Opus 5.5
parent eda5694270
commit 95a72437ec
29 changed files with 1293 additions and 117 deletions
+20 -3
View File
@@ -113,16 +113,32 @@ class CommitTexts(_Strict):
push_go: str
pushing: str
pushed: str
ci_pending: str
conflict: str
overwrite: str
push_empty: str
push_limit: str
push_failed: str
deploying: str
deployed: str
class PipelineTexts(_Strict):
ci_pending: str
ci_running: str
ci_success: str
ci_failed: str
ci_timeout: str
cd_waiting: str
cd_running: str
cd_success: str
cd_failed: str
cd_not_run: str
cd_superseded: str
notify_ci_ok: str
notify_ci_failed: str
notify_ci_timeout: str
notify_cd_ok: str
deploy_failed: str
removed: str
log_file: str
class StatusTexts(_Strict):
@@ -234,6 +250,7 @@ class Texts(_Strict):
section: SectionTexts
members: MembersTexts
commit: CommitTexts
pipeline: PipelineTexts
status: StatusTexts
logs: LogsTexts
alerts: AlertsTexts