10 KiB
Git-flow: ветки, теги и автодеплой
Единый процесс для репозиториев приложений в Gitea:
| Репозиторий Gitea | Локальная папка | CI по тегам |
|---|---|---|
sova/backend |
sova-backend/ |
да |
sova/adminpanel |
sova-adminpanel/ |
да |
sova/cabinet |
sova-cabinet/ |
да |
sova/docs |
sova-docs/ |
да |
sova/sova-mocks |
sova-mocks/ |
нет (Helm chart, ArgoCD sync) |
sova/sova-deploy — GitOps-репозиторий: CI пишет в main, ArgoCD читает values-{env}.yaml. Отдельные ветки prod/test/stage для deploy не нужны.
Глоссарий веток
| Ветка | Назначение | Откуда создаём feature | Куда мержим задачу |
|---|---|---|---|
prod |
Актуальный продакшн-код (бывш. main/master) |
— | После успешного stage-тестирования: stage → prod |
test |
Test-контур (k3s песочница) | feature от prod |
После code review задачи |
stage |
Stage-контур (регресс / нагрузка) | feature от prod |
После успешного test QA |
Правило: feature-ветки всегда ответвляются от prod, не от test и не от stage.
gitGraph
commit id: "prod baseline"
branch test
branch stage
checkout prod
branch feature/TASK-123
commit id: "implement"
checkout test
merge feature/TASK-123 id: "PR → test"
checkout feature/TASK-123
checkout stage
merge feature/TASK-123 id: "PR → stage (NOT test!)"
checkout prod
merge stage id: "release: stage → prod"
⚠️ Частая ошибка
Нельзя мержить ветку test в stage. В test могут лежать чужие незавершённые задачи — они «прицепом» уедут на stage.
Правильно: мержить конкретную feature-ветку (которая прошла test) в stage.
Формат тегов (без изменений)
{component}-v{semver}-{env}
Суффикс env |
Контур | Пример |
|---|---|---|
test |
Test (k3s) | backend-v1.0.2-test |
stage |
Stage (будущее) | backend-v1.0.2-stage |
prod |
Production (будущее) | backend-v1.0.2-prod |
Компоненты: backend, adminpanel, cabinet, docs.
Тег создаётся на ветке с тем же именем, что и суффикс env:
- тег
backend-v1.0.2-test→ веткаtest - тег
backend-v1.0.2-stage→ веткаstage - тег
backend-v1.0.2-prod→ веткаprod
CI парсит суффикс и обновляет sova-deploy/apps/{app}/values-{env}.yaml → ArgoCD sync.
Подробнее: Система тегов CI/CD.
Жизненный цикл задачи (пошагово)
1. Разработка
git checkout prod
git pull origin prod
git checkout -b feature/SOVA-123-add-widget
# ... commits ...
git push origin feature/SOVA-123-add-widget
2. Code review → test
- В Gitea: Pull Request
feature/SOVA-123-add-widget→test - Review, approve, merge
- Создать тег на ветке
test→ автодеплой на test-контур (см. ниже)
3. QA на test
Тестировщик проверяет на test-URL (например http://api.test.sova.local).
4. Промоушен на stage
- Pull Request
feature/SOVA-123-add-widget→stage(неtest→stage!) - Merge после approve
- Тег на ветке
stage, напримерbackend-v1.0.2-stage - Регресс / нагрузочное тестирование на stage-контуре (контур — в планах)
5. Релиз в prod
- Когда все задачи в
stageпроверены: Pull Requeststage→prod - Merge (минимум 1 approval на
prod) - Тег на ветке
prod, напримерbackend-v1.0.2-prod - Деплой на production (контур — в планах)
Как создать тег в Gitea (UI)
Пример: выкатить backend v1.0.2 на test после merge PR в test.
Способ A — Releases (рекомендуется)
- Откройте http://git.sova.local/sova/backend
- Releases → New Release
- Tag name:
backend-v1.0.2-test - Target branch: выберите
test(не prod!) - Release title:
Test release 1.0.2(произвольно) - Publish Release
Gitea создаст тег и отправит push → запустится workflow backend-ci-cd.
Способ B — Create tag на ветке
- Code → выпадающий список веток →
test - Коммит, который нужно выкатить → ⋯ → Create tag
- Tag name:
backend-v1.0.2-test - Create
Способ C — CLI (локально)
cd k3s-test
./scripts/release-tag.sh backend backend-v1.0.2-test
# checkout test, tag, push — автоматически
Проверка после тега
- http://git.sova.local/sova/backend/actions — jobs success
- http://argocd.sova.local —
backend-testSynced kubectl get deploy backend -n sova-test— образgit.sova.local/sova/backend:backend-v1.0.2-test
Пример полного flow (backend, задача SOVA-123)
| Шаг | Действие | Gitea / CLI |
|---|---|---|
| 1 | Ветка от prod | git checkout -b feature/SOVA-123 prod |
| 2 | PR → test | UI: New Pull Request → base: test |
| 3 | Merge PR | Merge Pull Request |
| 4 | Тег test | Release: backend-v1.0.2-test на ветке test |
| 5 | QA OK | — |
| 6 | PR → stage | UI: feature/SOVA-123 → base: stage |
| 7 | Тег stage | backend-v1.0.2-stage на ветке stage |
| 8 | Регресс OK | — |
| 9 | PR stage → prod | UI: base: prod |
| 10 | Тег prod | backend-v1.0.2-prod на ветке prod |
Hotfix (срочный фикс в prod)
- Ветка от
prod:hotfix/SOVA-999-critical - Fix → PR →
test→ тег*-test→ быстрая проверка - PR
hotfix/SOVA-999→stage→ тег*-stage(или skip stage для critical — по решению лида) - PR
hotfix/SOVA-999→prod→ тег*-prod - Back-merge: PR
prod→stageиprod→test, чтобы ветки не разъехались
Hotfix не мержится через test → stage целиком — только своя ветка.
Защита веток (Branch Protection)
Настроено скриптом ./scripts/setup-gitea-branch-protection.sh:
| Ветка | Direct push | Merge | Approvals |
|---|---|---|---|
prod |
запрещён | через PR | 1 |
stage |
запрещён | через PR | 0 |
test |
запрещён | через PR | 0 |
Изменения попадают в prod / stage / test только через Pull Request.
CI/CD по контурам
Test — работает сейчас
| Триггер | Тег *-test на ветке test |
| Pipeline | test → build-and-push → deploy-gitops |
| GitOps | apps/{app}/values-test.yaml в sova-deploy |
| ArgoCD | backend-test, cabinet-test, … |
| URLs | *.test.sova.local, docs.sova.local |
Bootstrap веток (один раз):
./scripts/setup-git-flow-branches.sh
./scripts/setup-gitea-branch-protection.sh
Stage — описано, внедрение позже
| План | |
|---|---|
| Триггер | Тег *-stage на ветке stage |
| GitOps | values-stage.yaml (заготовки уже в sova-deploy) |
| ArgoCD | backend-stage, cabinet-stage, … (Applications не созданы) |
| Namespace | sova-stage |
| Ingress | *.stage.sova.local |
| Кластер | отдельная VM / namespace group |
CI уже поддерживает суффикс -stage — достаточно поднять stage-кластер и ArgoCD apps.
Prod — описано, внедрение позже
| План | |
|---|---|
| Триггер | Тег *-prod на ветке prod |
| GitOps | values-prod.yaml (создать при внедрении) |
| ArgoCD | backend-prod, … + RBAC |
| Secrets | SealedSecrets / external secrets |
| Ingress | боевые домены |
sova-mocks
Репозиторий sova-mocks участвует в git-flow (ветки prod/test/stage), но без tag CI.
Обновление моков на test-контуре:
- PR изменений →
test - ArgoCD app
mocks-testследит заsova-mocksmainсегодня — при миграции на ветки:targetRevision: test - Sync в ArgoCD UI или автосync
Первичная настройка (админ)
cd k3s-test
# 1. Ветки prod / test / stage во всех app-репах
./scripts/setup-git-flow-branches.sh
# 2. Branch protection
./scripts/setup-gitea-branch-protection.sh
# 3. CI secrets (если ещё не делали)
./scripts/bootstrap-gitea-ci-secrets.sh
./scripts/configure-k3s-registry.sh
# 4. Пример релиза на test
./scripts/release-tag.sh backend backend-v1.0.1-test
После setup-git-flow-branches.sh default branch в Gitea = prod, legacy main удаляется с remote.