- Added .release-version, CHANGELOG.md, and deploy/docker/docker-bake.override.hcl to .gitignore. - Removed Dockerfile as part of the cleanup. - Updated AGENTS.md and README.md to include new documentation on CI/Docker processes and deployment instructions. - Enhanced package.json with new devDependencies for commit linting and semantic release. - Updated pnpm-lock.yaml to reflect new dependencies and versions. These changes streamline the project structure and improve documentation clarity.
5.1 KiB
Релизы и версионирование EvoFirewall
EvoFirewall использует Conventional Commits и semantic-release для полностью автоматических релизов на Gitea (git.shx.one). Ручное повышение версии в коде не требуется.
Заголовок после тип(scope): — на русском (см. .cursor/rules/commit-messages-ru.mdc). Analyzer смотрит только префикс feat / fix / …
Как определяется версия
| Тип коммита | Bump |
|---|---|
feat |
minor (1.0.0 → 1.1.0) |
fix, perf, ci, refactor |
patch (1.5.1 → 1.5.2) |
feat!, fix! или BREAKING CHANGE: в теле |
major (1.0.0 → 2.0.0) |
docs, chore, test |
без релиза |
Scope: один идентификатор без запятых (web, api, ci). Заголовок refactor(a, b): … не парсится semantic-release → релиз не создаётся (commitlint на PR это тоже отклонит).
refactor — patch без новых функций: перестройка кода/UI при том же поведении для пользователя.
Первый релиз при отсутствии git-тегов — 1.0.0, если есть releasable-коммиты.
CI-пайплайн (push в main)
push/merge в main
→ workflow CD: quality (openapi, web, api)
→ job publish:
→ semantic-release: git tag vX.Y.Z на текущий commit (без доп. commit)
→ Gitea Release + CHANGELOG.md как attachment
→ зеркало base-образов в evofw-buildcache:base-*
→ docker buildx bake с VERSION=X.Y.Z (pull=false, named builder evofw)
→ образы: latest, vX.Y.Z, X.Y.Z, sha-*, короткий SHA
Pull request: workflow CI — quality gates + commitlint; релиз и образы не публикуются.
Workflows: .gitea/workflows/ci.yaml, .gitea/workflows/cd.yaml, reusable .gitea/workflows/quality.yaml.
Конфиг semantic-release: .releaserc.json — без @semantic-release/git (CHANGELOG не коммитится в репозиторий).
Секреты Gitea
Один PAT — ACTIONS_PAT (Settings → Actions → Secrets).
| Право PAT | Зачем |
|---|---|
| push tags | git tag vX.Y.Z на commit merge |
| releases | Gitea Release + notes |
| packages (Container Registry) | push образов |
Fallback для git tag: github.token, если PAT недоступен. Push образов в Container Registry — только ACTIONS_PAT (у job token Gitea нет права packages).
Источник правды для версии
Semver из git-тега пробрасывается в образ как APP_VERSION / GIT_SHA / BUILD_TIME при bake (deploy/docker/evofw/Dockerfile).
Scope и semantic-release
Парсер conventional-commits не понимает запятые в scope. Правило: один scope (web, api, ci, docker).
На push в main job publish запускает scripts/commit/verify-release-commits.mjs — в логе будут предупреждения о непарсящихся коммитах.
Если релиз «не создался», а CI зелёный: смотрите лог release — часто No releasable commits. Исправление: новый коммит с корректным заголовком (например fix(web): …).
Перезапуск упавшего job publish
semantic-release пишет .release-version только в successCmd при новом релизе. Если тег vX.Y.Z уже создан, а docker buildx bake упал, повторный run того же SHA делает semantic-release no-op (файла нет). Job publish тогда берёт версию из git-тега на HEAD и публикует образы.
Перезапускать нужно весь job publish, не отдельный шаг bake: checkout + semantic-release + detect + bake идут подряд.
CHANGELOG
Release notes — в Gitea Release; файл CHANGELOG.md генерируется в CI и прикрепляется как asset, не попадает в git history.
Проверка после релиза
- Один run workflow CD на push в main: job publish зелёный.
- Gitea: тег
vX.Y.Zна том же commit, что и merge; Release с notes. - Container Registry:
evofw:vX.Y.Z,evofw:X.Y.Z,evofw:latestи алиасevofirewallс теми же тегами. curl http://localhost:8080/health→"status":"ok".
Первый релиз (bootstrap)
Merge в main с feat(release): … → v1.0.0 в том же CI run.