Sprint 0: CI-пайплайн с гейтами (lint, unit+coverage≥70%, security scan, build) #17
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Owner: devops · Est: 5 SP · Priority: P0 · Sprint: 0 · Deps: раннер CI
Refs #15
Что сделать
embeddevio/awg-dash; если его нет — сообщить TechLead для эскалации (без раннера гейты не автоматизируются).lint→unit(pytest, coverage) →security(trivy по образу + bandit/pip-audit) →build(Docker image) →pushв registry под тегомstaging-<sha>.Acceptance criteria
feat/*, WHEN workflow завершён, THEN в статусе коммита есть jobslint/unit/security/buildи ссылки на артефакты.unitпадает с указанием порога.security, THEN pipeline красный и PR не может быть одобрен к мержу.DoD
Тесты на новый код ≥ 70 %, CI green, PR с ревью владельца роли.
TechLead — факт окружения для планирования CI (проверено 2026-10-21):
docker:docker --version→docker: command not found. Значит, сборка образа,docker runи netns-стенд не могут быть выполнены в агентском окружении — нужен либо Gitea Actions runner с Docker (и правами на privileged-контейнеры), либо явно указанный внешний хост сборки.uv pip install), т.е. пайплайн может доставлять зависимости.uv.Действия для devops перед реализацией пайплайна:
Settings → Actions → Runnersдляembeddevio/awg-dash. Если runner отсутствует — не создавать workflow вслепую: сообщить TechLead, задача #17 становится заблокированной (нужен runner с Docker и возможностью запускать privileged-контейнеры для iperf3/netns-проверок).Это же ограничение важно для #21 (dev-стенд) и #43 (performance:
iperf3через туннель требует хоста с Docker и NET_ADMIN).TechLead — где выполнять сборку и стенд (решение владельца, 2026-10-21):
ssh root@192.168.1.147.docker build,docker run, netns-стенд, iperf3).--network=hostи--cap-add=NET_ADMINсначала зафиксироватьdocker psи текущие правила, не ломать PoC, и не менять сетевую конфигурацию хоста без согласования с TechLead.Отчёт: проверка Gitea Actions runner для
embeddevio/awg-dash(issue #17)Владелец: devops · Дата: 2026-10-21 · Refs #17, Refs #15
Итог
Рабочего Gitea Actions runner для репозитория нет. CI-workflow не создан (по указанию TechLead: «если раннера нет — не создавать workflow вслепую, оформи вывод проверки и эскалируй»). Нужна эскалация: поднять runner, после этого задача #17 доводится до AC.
Дополнительно: гейты (coverage ≥ 70 %, security high/critical) проверены реальными прогонами и работают — не хватает только исполнителя.
1. Проверка runner — что и как проверялось
list_workflows/list_runs/list_jobs/ artifacts / secrets / variables.Settings → Actions → Runners/user/login?redirect_to=...%2Fsettings%2Factions%2Frunners. Учётных данных для UI нет (vault пуст), пароль не вводился.ci/runner-probe+ MCPactions_run_readqueued> 4 минут; jobrunner-probe—queued,steps: [],started_at: 1970-01-01. Задачу никто не забирает.192.168.1.44docker --versiondocker: command not found(подтверждает находку TechLead)192.168.1.147docker ps -a,systemctl list-units,/usr/local/bin,/optact_runnerнетlist_workflows, публичная страница/actionsПруф: http://192.168.1.111:3000/embeddevio/awg-dash/actions/runs/1
(ветка
ci/runner-probe, коммитd20e09e9ab694904733a077e0cc7492c405a1c7b, файл.gitea/workflows/runner-probe.yml)Вывод: Actions включён, но ни один runner не зарегистрирован либо не онлайн. Соответственно AC #17 (jobs
lint/unit/security/buildв статусе коммита со ссылками на артефакты) сейчас недостижим — без runner'а гейты не автоматизируются.2. Окружение сборки — проверено
192.168.1.147(Debian 13, hostnamedocker, Docker 29.4.1, compose v5.1.3, overlayfs, cgroup v2), SSHroot@доступен:/, load average 3.2. Образы занимают 9.2 ГБ, build cache — 3.9 ГБ.amneziawg-client(PoC, healthy),hindsight,drawio,portainer— не трогал.trivyотсутствует → для security-джобы нужна установка (бинарь + БД ≈ 300 МБ).200, container registry/v2/→401(registry включён, нужна авторизация),github.com/pypi.orgдоступны./opt/awg-dash-build— рабочая площадка задачи #18 (Dockerfile + entrypoint.sh), не трогал.⚠️ Риск по ресурсам: 850 МБ свободной RAM на build-хосте мало для job-контейнера с
pip install— вероятен OOM. Диск 6.6 ГБ — впритык (act-образ ~1.5–2 ГБ + trivy + Python 3.12).3. Репетиция гейтов (локально, 192.168.1.44, Python 3.13.5, дерево
feat/16-repo-skeleton)Реальные прогоны, не «на словах»:
Т.е. конфигурация гейтов рабочая (порог покрытия уже в
pyproject.tomlиз #16, security-пороги воспроизводятся). Не хватает ровно одного — runner'а.4. Эскалация TechLead — что нужно решить
Вариант A (рекомендую) —
act_runnerв Docker на192.168.1.147192.168.1.147:/opt/gitea-runner-awg/config.yaml(создаётся при регистрации):затем
docker restart gitea-runner-awg.trivyна .147 (нужно для security-джобы).Вариант B — host-mode runner
act_runnerна хосте Gitea/сборки без контейнеров job'ов (labels: ubuntu-latest:host). Экономит RAM/диск, но требует python 3.12+,trivy,dockerCLI прямо на хосте.Вариант C — временно без runner (интерим)
Прогон гейтов из агентского окружения + сборка/trivy по SSH на
192.168.1.147, артефакты — в задачу/PR. AC #17 при этом не закрывается (нет commit statuses), но PR'ы можно гейтить вручную.5. Открытые технические вопросы (снимаются только на живом runner'е)
catthehacker/ubuntu:act-22.04несёт Python 3.10, проекту нужно ≥ 3.12. Нужно выбрать:actions/setup-python@v5(доступность зеркала в Gitea — проверить), либоuv python install 3.12, либо кастомный label на образpython:3.12-bookworm.192.168.1.111:3000:docker loginпод${{ github.actor }}/${{ secrets.GITHUB_TOKEN }}(Gitea выдаёт токен с правом на пакеты). Проверено:/v2/отвечает401, т.е. registry включён.6. Предлагаемый workflow (НЕ закоммичен — ждёт runner'а)
Скелет
feat/17-ci→ PR вmain:Гейты:
unitпадает при покрытии < 70 %;securityпадает при high/critical;buildстартует только после зелёныхunit+security. Артефакты:coverage.xml+htmlcov/,trivy-report.json, digest образа.Полные YAML-файлы подготовлю и запушу в
feat/17-ciсразу после того, как runner заработает и я смогу провалидировать jobs реальными прогонами.7. Что дальше
trivyна build-хосте, + RAM).ci/runner-probe), записатьci.ymlвfeat/17-ci, прогнать AC (jobs + артефакты + падение на <70 % и на high), открыть PR вmain.TechLead — разбор блокировки задачи (22.10, 00:14).
Карточка Kanban
t_37f7b719ушла вblockedне из-за задачи и не из-за раннера: обе попытки (run #4 — 1227 с, run #9 — 123 с) упали сrc=1, потому что провайдер в 23:52–23:55 отвергал любые запросы — исчерпан дневной лимит ключа polza. Каскад: квота → ретраи оборота → невозможность сжать контекст (сжатие тоже требует провайдера) →rc=1→ 2 краша подряд → sticky auto-block. Полный разбор, доказательства и решения по бюджету — в эскалации #51.Что сделано сейчас:
queued,act_runnerна 192.168.1.147 нет,trivyнет, ~850 МБ свободной RAM.Что разблокирует задачу: registration token от владельца → регистрация
gitea/act_runnerна .147 → установкаtrivy→ devops снимает пробникci/runner-probe, коммититci.ymlвfeat/17-ciи закрывает AC (jobs lint/unit/security/build + падение на coverage<70 % и на HIGH-находке).Статус issue переведён в
status/blocked+blocker(трекится эскалацией #52).TechLead — runner поднят, задача возобновлена (28.10, 21:37).
Владелец выдал registration token; runner зарегистрирован только для этого репозитория:
act_runner v0.6.1в контейнереgitea-runner-awgна192.168.1.147(--restart unless-stopped), данные в/opt/gitea-runner-awg.ubuntu-latest→ образ job'аcatthehacker/ubuntu:act-22.04,capacity: 1./var/run/docker.sock,container.options— build-джобы смогут собирать образ внутри job'а (осознанный компромисс: job получает root-эквивалент на хосте; для homelab принято, зафиксировано здесь).shred), в репозиторий/конфиги не попадал.docker builder prune -f, только неиспользуемый кэш: 3.77 ГБ, образы/контейнеры/тома не тронуты) — свободно 9.8 ГБ.Первые job'ы уже исполнялись (
Runner registered successfully→task 1/task 2, контейнеры job'ов поднимаются). Сейчас runner догрызает старую очередь из 17 runs (runs 9–25, пуши вfeat/19-openapiдо мержа); runs поmain(#26, sha3e3519e) — следующие. Отменить чужие runs через API не удалось (cancel_run→ 404 в этой сборке Gitea), поэтому очередь сливается естественным порядком.Что нужно от devops (задача уже в работе): снять пробник
ci/runner-probe, закоммититьci.ymlвfeat/17-ciотmain(lint → unit с--cov-fail-under=70и артефактами → securitybandit/pip-audit/trivy→ build через проброшенный сокет → pushstaging-<sha>), python 3.12 черезactions/setup-python@v5, trivy ставить шагом job'а. AC закрывать ссылками на реальные runs.Статус issue:
blocker/status/blockedсняты →status/in-progress.Отчёт проверки runner + CI-пайплайн — v2 (devops, 28.10)
Refs #17, Refs #15 · PR: #60 · Полный отчёт:
docs/ci/RUNNER-CHECK-17-v2.md(в веткеfeat/17-ci)1. Runner поднят, но был неработоспособен — исправлено
queued,runner_id: 0, нет логовawg-dash-147-repo(id 2, online); legacy-контейнер остановленDuplicate mount point: /var/run/docker.sockcontainer.options(v0.6.1 монтирует сокет сам)options: ""+valid_volumesall predefined address pools have been fully subnettedGITEA-ACTIONS-*container.network: hostbad pack headerв checkoutarchive/<sha>.tar.gzaquasec/trivy:0.76.1через docker-сокет + кэш БД/opt/trivy-cacheДополнительно на .147:
insecure-registries: ["192.168.1.111:3000"]в/etc/docker/daemon.json(systemctl reload docker, контейнеры не перезапускались).2. Пайплайн
ci.yml(веткаfeat/17-ci, PR #60)lint → unit → security → build → image-scan → push. Гейты: coverage < 70 %; bandit HIGH / pip-audit; trivy HIGH/CRITICAL.build/image-scan/pushвключаются автоматически при наличииdeploy/Dockerfile.3. Прогоны на живом runner'е
feat/17-ci(от main)feat/17-verify(#17 +deploy/*из #18)FAIL Required test coverage of 99% not reached. Total coverage: 96.80%→ unit failureB602 Severity: High→ security failure, pipeline красный→ AC закрыт по всем трём пунктам: jobs
lint/unit/security/buildна пуш вfeat/*; снижение покрытия роняет job; HIGH-уязвимость роняет pipeline.4. Открытые вопросы (эскалация)
upload-packотдаёт пустой pack (Content-Length: 90, без объектов),git clone/fetchне работают; archive при этом работает. Нужен доступ к хосту Gitea192.168.1.111(fsck/repack, диск). Подробно — #59.upload-artifact@v3рапортует успех, в API/UItotal_count: 0;@v4зависает. Сводки дублируются в лог job'а. Подробно — #62.golang.org/x/crypto0.42.0) — гейт правильно блокирует публикацию. Нужен бамп Go ≥ 1.26.10 и crypto ≥ 0.43.0 — #61 (владелец #18).write:package→401на blob upload (проверено вручную). В CI логин берётsecrets.REGISTRY_TOKEN, иначеGITHUB_TOKEN; для гарантированного push нужен секретREGISTRY_TOKEN(owner).5. Порядок merge
deploy/Dockerfile→buildвключается сам.Ветки-пробники (
ci/17-gate-negative,probe/artifact-v4) иci/runner-probeудалены;feat/17-verifyсохранена как ветка воспроизведения AC-прогона run #49.Отчёт v3 — перепроверка на текущем head
feat/17-ci(devops, 28.10 23:40 MSK)Refs #17, Refs #15 · PR: #60 · Runner:
awg-dash-147-repo(repo-scoped, online)Дополнение к отчёту v2 (
docs/ci/RUNNER-CHECK-17-v2.md): после устранения дефектов runner'а перепрогнал CI на актуальном коммите и закрыл причину красных статусов PR.1. Runner живой — подтверждено прогонами
bbe0886(headfeat/17-ci), событие push + pull_request:Статусы коммита (16 шт.,
GET /commits/<sha>/status):ci / lint✅,ci / unit✅,ci / security✅,ci / build⏭,ci / image-scan⏭,ci / push⏭ (по обоим событиям).Факты из логов run #59:
unit:198 passed,TOTAL 1502 48 97%,Required test coverage of 70% reached. Total coverage: 96.80%security:bandit -lll— 0 HIGH;pip-audit— CVE не найденыlint:ruff check+ruff format --check+mypy (strict)— чисто2. Гейты — негативные прогоны
--cov-fail-under=99→FAIL Required test coverage of 99% not reached. Total coverage: 96.80%→unit❌, pipeline redIssue: [B602 subprocess_popen_with_shell_equals_true] Severity: Highвbackend/awg_api/_gate_probe.py:15→security❌build✅ (образ собран через проброшенный сокет) →image-scan❌Total: 22 (HIGH: 21, CRITICAL: 1)→push⏭ (fail-closed)3. AC — статус по пунктам
feat/*даёт jobslint/unit/security/buildв статусе коммитаbuildштатно skip, пока нетdeploy/Dockerfile(включается сам после merge #18; проверено зелёным в run #49)upload-artifact@v3в логе:Artifact has been successfully uploaded!, но API/UI —total_count: 0. Временная мера: coverage-таблица, bandit/pip-auditотчёт и trivy-таблица дублируются в лог job'а4. Что я нашёл и починил сверх отчёта v2
Combined status PR #60 был failure не из-за
ci.yml, а из-за второго workflow:contract-openapi / openapi-contractи/ ts-client-is-currentпадали наcheckout(bad pack header, exit 128 — тот же дефект #59, но в этом workflow обхода не было).→ PR #63 (
fix/59-checkout-fallback): тот же archive-fallback + сравнение TS-клиента без.git. Проверено: run #64 — success, оба job'а зелёные (до фикса — ❌ за 48–50 с).5. Порядок merge и что остаётся снаружи
contract-openapi/*на всех коммитах) — первым.feat/17-ci(или rerun) → combined status зелёный безforce_merge.deploy/Dockerfile, после чегоbuild/image-scan/pushвключаются автоматически.Снаружи (агент не может, нужен доступ владельца):
df,git fsck,repack).golang.org/x/crypto0.42.0) → гейт правильно блокируетpush staging-<sha>.app.ini/логам Gitea).REGISTRY_TOKEN(write:package) в repo secrets — иначе толькоGITHUB_TOKENи возможный 401 на blob upload.6. Ветки
ci/runner-probeудалена.feat/17-verifyоставлена как воспроизведение AC-прогона #49.probe/artifact-v4(доказательство зависанияupload-artifact@v4, #62) иci/17-gate-negative(негативный гейт для run #55) оставлены сознательно — удалю после закрытия #62/#17.Refs #17, Refs #15
devops — довесок к v3 (29.10, 00:00 MSK): head сменился, прогон зелёный.
После правки
docs/ci/CI.md(добавлены 6.4 «артефакты не публикуются» и 6.5 «contract-openapi checkout») headfeat/17-ci=80b33d5.deploy/Dockerfile)main, снимается PR #63То есть на актуальном head пайплайн
ci.ymlстабильно зелёный; единственное красное —contract-openapi, и это ровно то, что чинит PR #63.Refs #17, Refs #15
TechLead — независимое ревью задачи #17 (round 1, лента «artifact»): ПРИНЯТО с оговорками
Refs #17, Refs #15 · Проверял сам, не по отчёту devops.
Что подтверждено своими прогонами и чтением
feat/*даёт jobslint/unit/security80b33d5) + run 67 (PR sync): jobs 194–196 и 200–202 —success; в combined status 16 записей `ci / lintbuildв статусе коммитаskippedштатно:deploy/Dockerfileещё нет вmain. Функционально проверен зелёным в run 49 (job 139buildsuccess, образ собран)list_run_artifacts(run 66)→{"artifacts":[],"total_count":0},list_artifacts(repo)→total_count: 0, при этом в логе job 195:Artifact coverage has been successfully uploaded!. Митигация (сводки в логе) реально работаетERROR: Coverage failure: total of 97 is less than fail-under=99→FAIL Required test coverage of 99% not reached. Total coverage: 96.80%→ шаг pytest❌ Failure. Механизм тот же, что--cov-fail-under=70вci.ymlIssue: [B602] Severity: High Confidence: High→ шаг bandit❌ Failure; run 49, job 140 (образ): trivyTotal: 22 (HIGH: 21, CRITICAL: 1)→❌ Failure,push⏭ fail-closedRefs #17, Refs #15; PR #60 body тоже содержитRefs #17, Refs #15Required test coverage of 70% reached. Total coverage: 96.80%,198 passedfatal: protocol error: bad pack header(exit 128) → срабатываетcheckout fallback (archive tarball), тесты идут по распакованному архиву.continue-on-error: true+if: steps.checkout.outcome == 'failure'сработали ровно как задумано.gitea/workflows/ci.yml,docs/ci/CI.md,docs/ci/RUNNER-CHECK-17-v2.md. Кода приложения не касаетсяЗамечания (не блокируют приёмку)
bandit -lll≠ «HIGH severity gate», хотя в доках и в имени шага написано именно так.-l/-ll/-lllв bandit фильтрует confidence, а не severity;-lll= все уровни, а exit code 1 bandit отдаёт при любой находке. То есть гейт сейчас строже спецификации (AС: «high-уязвимость роняет pipeline» — выполняется a fortiori), но первая же LOW-находка сделаетsecurityкрасным. Варианты:bandit -lll -iii(только HIGH severity) или честно описать вdocs/ci/CI.mdповедение «любая находка → fail». Для Sprint 0 оставляю как есть, правку оформлю отдельно.trivy --ignore-unfixedсужает гейт до исправимых CVE — политика приемлемая, зафиксирована вCI.md, но напоминаю: она осознанная, а не случайная.failure— не из-заci.yml, а из-заcontract-openapi / *(run 68/69, exit 128, дефект #59). Чинится PR #63 (run 64 — success).Решение TechLead по merge-порядку (обязательный)
fix/59-checkout-fallback) →mainпервым: снимает красныеcontract-openapi/*со всех коммитов.feat/17-ci→ combined status должен стать зелёным.ci.yml) — только после п.2. Пока статус красный — не мержу (правило: CI green + coverage ≥ 70 % + security low/none).build/image-scan/pushавтоматически.Что остаётся открытым по issue #17 (issue НЕ закрываю)
ac:artifact-links— заблокировано #62 (нужен доступ кapp.ini/логам Gitea 192.168.1.111).ac:build-on-feat-push— станет выполнимым после merge #18.REGISTRY_TOKEN(write:package) не задан →pushможет дать 401.Дозакрытие AC #17 после #18/#62 — отдельная задача на devops.
close-out AC #17 — проверка на живом состоянии (devops, 29.10 ~00:35 MSK): условия не сняты, issue остаётся открытым
Refs #17, Refs #15 · Карточка: t_af973267 · Ничего в
ci.ymlне менял — только проверка.1. Состояние на момент проверки (факты, не отчёт)
fix/59-checkout-fallback)ci.yml)contract-openapi/*(runs 68/69 на sha80b33d5). Всеci/*— success/skipped как задуманоd2f6e89, 0 commit statuses (CI на этом sha никогда не запускался)main/deploy/Dockerfileотсутствует (есть толькоREADME.md,VERIFICATION-21.md,api_stub.py,dev-stand.md,docker-compose.*.yml,verify-dev-stand.sh) → гардhas_dockerfile=falseштатно отключаетbuild/image-scan/pushlist_repo_secrets→[]); переменные репозитория тоже[]→secrets.REGISTRY_TOKENне заданlist_run_artifacts(66)→total_count: 0;(67)→0;list_artifacts(repo)→0(#62 не снят)Мёржей не выполнял: по решению TechLead мерж делает владелец, а PR #60 сейчас красный (
failure) — правило «CI green + coverage ≥ 70 % + security none/low» не выполнено.2. Свежий прогон с исполнением
build/image-scan/push— rerun #49Так как merge #18 не выполнен, факты «(а) job запускается» и «(б) гейт блокирует
push» перепроверены на ветке воспроизведенияfeat/17-verify(60521b1, содержитdeploy/Dockerfileиз #18) — rerun run #49 сегодня, 21:05–21:12 UTC (00:05–00:12 MSK):lintunitRequired test coverage of 70% reached. Total coverage: 96.80%,198 passedsecuritybuildexpression 'needs.lint.outputs.has_dockerfile == 'true'' evaluated to 'true'→docker build --pull -f deploy/Dockerfile→image: 192.168.1.111:3000/embeddevio/awg-dash:staging-60521b1d→id=sha256:de1ccb1688ee2cf22c3cc4a05b089aa82aed0f14bf655d97d3679d191a8634f3 size=50648107image-scanscan: 192.168.1.111:3000/embeddevio/awg-dash:staging-60521b1d, trivy:Detected OS family="alpine" version="3.21.9",Total: 22 (HIGH: 21, CRITICAL: 1),❌ Failure - Main trivy image (HIGH/CRITICAL -> fail), exit 1pushneeds: [lint, build, image-scan]— красныйimage-scanне пускает публикациюstaging-<sha>То есть: (а)
build/image-scan/pushисполняются, как только в дереве естьdeploy/Dockerfile— включаются автоматически по гарду, ничего вci.ymlменять не нужно; (б) гейтimage-scanблокируетpush(#61) — это ожидаемое правильное поведение.3. AC-матрица #17 — актуальный статус
feat/*→lint/unit/securityв commit statusesci / …)build/image-scan/pushнеskippedна пуш вfeat/*mainнетdeploy/Dockerfile. Механика проверена и зелёная (rerun 49, job 139 success). Активируется сам после merge PR #49 (#18)image-scanблокируетpushtotal_count: 0приArtifact coverage has been successfully uploaded!/Artifact trivy-report has been successfully uploaded!в логах сегодняшнего прогона. Митигация (сводки в логах job'ов) действуетREGISTRY_TOKEN(write:package)list_repo_secrets→[]. Вci.ymlлогин:TOKEN="${{ secrets.REGISTRY_TOKEN }}", если пусто —secrets.GITHUB_TOKEN. Пока секрета нет,pushпри первом же зелёномimage-scanможет упасть в 401 на blob upload4. Что нужно от владельца (в этом порядке)
main(status success, готов).main(Update branch/ mergemain→feat/17-ci) и дождаться зелёного combined status. ПростоRe-runrun'ов 68/69 не поможет: они исполнят старыйcontract-openapi.ymlиз ветки, без фикса #63.ci.yml) — после зелёного статуса.mainпоявляетсяdeploy/Dockerfile→build/image-scan/pushвключаются автоматически; первый же пуш вmain/feat/*даст им статусsuccess/failure, и AC «не skipped» закроется со ссылкой на run.REGISTRY_TOKENс правомwrite:package(Settings → Actions → Secrets) — иначеpushподGITHUB_TOKEN.192.168.1.111— у агентов SSH нет (root@192.168.1.111: Permission denied (publickey), проверено сейчас). Без него AC «ссылки на артефакты» не закрыть.1.26.9, 1.27.2для CVE-2026-56857) иgolang.org/x/crypto≥ 0.43.0 — владелец #18.5. Ветки
feat/17-verify(воспроизведение AC-прогона),probe/artifact-v4,ci/17-gate-negativeне удалял — по DoD их снимаем после закрытия #17/#62.Итог
AC-матрица #17 не зелёная: два пункта (
build/image-scan/pushне skipped — ждёт merge #18; ссылки на артефакты — ждёт #62) по-прежнему заблокированы внешними условиями. Issue #17 остаётся открытым, закрытие — после п. 1–6 выше. Карточка t_af973267 уходит вneeds_inputк владельцу.Refs #17, Refs #15
Перепроверка TechLead, 29.10.2026 20:50–20:56 MSK (карточка t_af973267 в
blockedс 00:18 — 20.7 ч простоя)Живое состояние (всё запрошено сейчас, не из истории)
fix/59-checkout-fallbackmergeable: true, +35/−2, 1 файл, headca14ae6feat/17-cicontract-openapi/*(jobs 208/209: падение на шагеcheckout, шаг 0 из 5) — это #59, а не пайплайн;ci / lint,ci / unit(198 passed, cov 96.80 %),ci / security— success,build/image-scan/push— штатноskippedfeat/18-docker-runtimemergeable: true, headd2f6e89, 0 commit statuses (ветка отведена до появления.gitea/workflows/ci.yml)main(a447511).gitea/workflows/: толькоcontract-openapi.yml;deploy/Dockerfile— нетlist_repo_secrets→[]gitea-runner-awg-repoUp 23 h, RAM 1.2/3.0 Gi, job'ы пишутся (run 64–67) — #52 закрытВажное следствие для всех следующих спринтов
Пока #60 не влит, в
mainнетci.yml. Любая новая ветка отmain(Sprint 1–3) получит толькоcontract-openapi, то есть lint / coverage-гейт / bandit / pip-audit не запустятся вообще. Поэтому #60 — не «долг Sprint 0», а условие существования CI для всей команды.Действия владельца (в этом порядке, 4 из 5 — вне прав агента)
main— только владелец; или явно разрешить мерж мне)main→feat/17-ci) — после этогоcontract-openapiпрочтёт новый workflow с fallback'ом и станет зелёным. Rerun 68/69 бесполезен: дляpull_request/pushGitea берёт workflow из головной ветки, а там старое. (могу сделать через MCPupdate_branchпо команде)mainполучает пайплайн с гейтами.build/image-scan/push.image-scanожидаемо красный: trivy 21 HIGH + 1 CRITICAL (#61),pushfail-closed. Нужно решение: бампgolang:*/golang.org/x/crypto(тогда #53-подобная правка в Dockerfile, 1–2 ч) или влить с документированным отклонением.REGISTRY_TOKEN(Gitea → Settings → Actions → Secrets, значение — user token сwrite:package): без негоpushпадает 401. Значение не пересылать в issue/чат.Permission denied (publickey)):git-upload-packотдаёт пустой pack,upload-artifactне публикует. Пока не починено — всеcheckoutидут через archive-fallback (обходится, но это обход, а не решение).Что я делаю сам без владельца
-lllфильтрует именно severity (HIGH),-i/-iii— confidence. LOW-находка →No issues identified, exit 0; HIGH (B602) → exit 1. Гейт вci.ymlсоответствует AC, работы не требует. Воркер не выделялся (экономия бюджета).blocker+devops— это корень красных статусов всех PR.Простой 20.7 ч: причина не техническая — все оставшиеся шаги упираются в 4 действия владельца выше.