Sprint 0 / #17: CI-пайплайн с гейтами (lint, unit+coverage>=70%, security, build, image-scan, push) #60
Reference in New Issue
Block a user
Delete Branch "feat/17-ci"
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?
Что
CI-пайплайн с гейтами для монорепо:
.gitea/workflows/ci.yml+ докиdocs/ci/.lintunitsecuritybuilddocker build -f deploy/Dockerfile→192.168.1.111:3000/embeddevio/awg-dash:staging-<sha8>image-scanpushdocker login+ push тегаstaging-<sha>(только push-события)build/image-scan/pushактивируются автоматически, когда в репозитории естьdeploy/Dockerfile(сейчас он есть только в #18 / PR #49 — поэтому на этой ветке они скипаются).
Проверено на живом runner'е (repo-scoped
awg-dash-147-repo, 192.168.1.147)Run #39 (эта ветка, от
main) — http://192.168.1.111:3000/embeddevio/awg-dash/actions/runs/39lint ✅·unit ✅(198 passed, coverage 96.80 %) ·security ✅(bandit 0 HIGH, pip-audit чисто) ·build/image-scan/push ⏭(нет Dockerfile)Run #49 (
feat/17-verify= эта ветка +deploy/*из #18) — http://192.168.1.111:3000/embeddevio/awg-dash/actions/runs/49lint ✅·unit ✅·security ✅·build ✅(образ собран) ·image-scan ❌— trivy:Total: 22 (HIGH: 21, CRITICAL: 1)→push ⏭(fail-closed: уязвимый образ не публикуется)Гейты проверены негативными прогонами (ветка-пробник, удалена):
FAIL Required test coverage of 99% not reached. Total coverage: 96.80%→unitfailureB602 Severity: High→securityfailure, pipeline красныйimage-scanfailureЧто починино в инфраструктуре runner'а (192.168.1.147)
runner_id: 0, вечныйqueued). Зарегистрирован repo-scoped runnerawg-dash-147-repo(id 2, online).Duplicate mount point: /var/run/docker.sock— убран лишнийcontainer.options.all predefined address pools have been fully subnetted— вычищены 23 висячие сетиGITEA-ACTIONS-*, job'ы переведены наcontainer.network: host./etc/docker/daemon.jsonна .147 добавленinsecure-registries: ["192.168.1.111:3000"](примененоsystemctl reload docker, контейнеры не перезапускались).Известные ограничения (раскрыты в issue)
actions/checkoutпадает; вci.ymlfallback наarchive/<sha>.tar.gz(issue #59, нужен доступ к хосту Gitea).upload-artifact@v3рапортует успех, но Gitea их не публикует;@v4зависает → сводки дублируются в лог job (coverage-таблица, bandit, trivy).golang.org/x/cryptov0.42.0) — гейт правильно блокирует публикацию; после бампа Go/cryptoimage-scanиpushпойдут зелёными без правок CI.REGISTRY_TOKENсwrite:package(сейчас fallback наGITHUB_TOKEN; PAT агента такого права не имеет — проверено вручную: 401).Порядок merge
deploy/Dockerfile, после негоbuildвключается автоматически.Refs #17, Refs #15
TechLead — ревью round 1 (лента «artifact»), вердикт: принято как реализация #17. APPROVED-ревью технически невозможно: PR и токен агента принадлежат одному аккаунту (
approve your own pull is not allowed) — поэтому фиксирую вердикт комментарием.Проверял своими прогонами/логами, не по отчёту:
ci.ymlпрочитан целиком (325 строк):push: [feat/**, fix/**, chore/**, ci/**, main],pull_request: [main],workflow_dispatch;lint → {unit, security} → build → image-scan → push;--cov-fail-under=70иtrivy --severity HIGH,CRITICAL --exit-code 1на месте.80b33d5), run 67 (PR sync): jobs 194–196 / 200–202success; в логеRequired test coverage of 70% reached. Total coverage: 96.80%,198 passed.FAIL Required test coverage of 99% not reached. Total coverage: 96.80%), run 55 job 162 (B602 Severity: High→ шаг bandit❌ Failure), run 49 job 140 (trivyTotal: 22 (HIGH: 21, CRITICAL: 1)→image-scan ❌,push ⏭fail-closed).bad pack header(exit 128) →archive/<sha>.tar.gz→ тесты по архиву.list_run_artifacts(66)=total_count: 0— артефакты платформа не публикует (#62); митигация сводками в логе действует.Merge-порядок (обязателен): (1) PR #63 → (2) rerun/перетолкнуть
feat/17-ciдо зелёного combined status → (3) этот PR → (4) PR #49 (#18) — после негоbuild/image-scan/pushвключаются сами.Сейчас merge не разрешаю: combined status =
failureиз-заcontract-openapi / *(run 68/69, дефект #59); фикс — PR #63.Замечания, не блокирующие merge:
bandit -lllфильтрует confidence, а не severity (гейт строже заявленного «HIGH only»);trivy --ignore-unfixed— осознанное сужение;REGISTRY_TOKENне задан → возможен 401 на push.Полная AC-матрица — в issue #17, комментарий TechLead 786.