Files
docs/infrastructure/test-contour/git-flow.md
T
2026-05-28 19:57:04 +03:00

10 KiB
Raw Blame History

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.

flowchart TB
  prod([prod])
  test([test])
  stage([stage])
  feat[feature/TASK-123]

  prod -->|ветка от prod| feat
  feat -->|PR merge| test
  feat -->|PR merge — не test| stage
  stage -->|release PR| 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

  1. В Gitea: Pull Request feature/SOVA-123-add-widgettest
  2. Review, approve, merge
  3. Создать тег на ветке test → автодеплой на test-контур (см. ниже)

3. QA на test

Тестировщик проверяет на test-URL (например http://api.test.sova.local).

4. Промоушен на stage

  1. Pull Request feature/SOVA-123-add-widgetstage (не teststage!)
  2. Merge после approve
  3. Тег на ветке stage, например backend-v1.0.2-stage
  4. Регресс / нагрузочное тестирование на stage-контуре (контур — в планах)

5. Релиз в prod

  1. Когда все задачи в stage проверены: Pull Request stageprod
  2. Merge (минимум 1 approval на prod)
  3. Тег на ветке prod, например backend-v1.0.2-prod
  4. Деплой на production (контур — в планах)

Как создать тег в Gitea (UI)

Пример: выкатить backend v1.0.2 на test после merge PR в test.

Способ A — Releases (рекомендуется)

  1. Откройте http://git.sova.local/sova/backend
  2. ReleasesNew Release
  3. Tag name: backend-v1.0.2-test
  4. Target branch: выберите test (не prod!)
  5. Release title: Test release 1.0.2 (произвольно)
  6. Publish Release

Gitea создаст тег и отправит push → запустится workflow backend-ci-cd.

Способ B — Create tag на ветке

  1. Code → выпадающий список веток → test
  2. Коммит, который нужно выкатить → Create tag
  3. Tag name: backend-v1.0.2-test
  4. Create

Способ C — CLI (локально)

cd k3s-test
./scripts/release-tag.sh backend backend-v1.0.2-test
# checkout test, tag, push — автоматически

Проверка после тега

  1. http://git.sova.local/sova/backend/actions — jobs success
  2. http://argocd.sova.localbackend-test Synced
  3. 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)

  1. Ветка от prod: hotfix/SOVA-999-critical
  2. Fix → PR → test → тег *-test → быстрая проверка
  3. PR hotfix/SOVA-999stage → тег *-stage (или skip stage для critical — по решению лида)
  4. PR hotfix/SOVA-999prod → тег *-prod
  5. Back-merge: PR prodstage и prodtest, чтобы ветки не разъехались

Hotfix не мержится через teststage целиком — только своя ветка.


Защита веток (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 (релиз) или ручной запуск | | Тесты вручную | Gitea → ActionsRun workflow → ветка prod / test / stage | | 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-контуре:

  1. PR изменений → test
  2. ArgoCD app mocks-test следит за sova-mocks main сегодня — при миграции на ветки: targetRevision: test
  3. 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.


Связанные документы