Skip to content

Commit 358a204

Browse files
AHTu21cursoragent
andcommitted
docs: staging as manual QA snapshot after local tests
Staging is not auto-synced with main; testers report against fixed X.Y.Z on the stand. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent e4b30ce commit 358a204

6 files changed

Lines changed: 138 additions & 94 deletions

File tree

.github/pull_request_template.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
- [ ] Фича (в `main` после merge поднимется MINOR/PATCH автоматически)
88
- [ ] Исправление
99
- [ ] Только docs / CI (версия может не измениться)
10-
- [ ] Продвижение на тест: PR **`main``staging`** (версию не дублируем, см. docs/WORKFLOW.md)
10+
- [ ] Продвижение на тест: PR **`main``staging`** (после локального build/smoke; на стенде фиксируется версия `X.Y.Z` для QA)
1111

1212
## Чеклист
1313

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
### Разработка
2626

2727
- **Версии:** после merge в `main` CI поднимает **2-ю или 3-ю** цифру по правилам [docs/VERSIONING.md](./docs/VERSIONING.md); прод (**1-я** цифра) — [docs/ADMIN.md](./docs/ADMIN.md).
28-
- **Процесс:** CI на PR, защита `main`/`staging`, тест через ветку `staging`[docs/WORKFLOW.md](./docs/WORKFLOW.md), [docs/GITHUB_BRANCH_PROTECTION.md](./docs/GITHUB_BRANCH_PROTECTION.md).
28+
- **Процесс:** CI на PR, защита `main`/`staging`; на тест — только осознанный срез `main``staging` после локальных проверок (стабильная версия для тестировщиков)[docs/WORKFLOW.md](./docs/WORKFLOW.md), [docs/GITHUB_BRANCH_PROTECTION.md](./docs/GITHUB_BRANCH_PROTECTION.md).
2929

3030
### API и сервер
3131

docs/ADMIN.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939

4040
### Тестовый стенд (`staging`)
4141

42-
Перед продом выкладывайте сборку с ветки **`staging`**, обновляя её PR **`main``staging`** ([WORKFLOW.md](./WORKFLOW.md)). Версия на стенде = версия в `main` (уже поднятая ботом 2/3 цифры). Отдельного bump на `staging` нет.
42+
Не каждый merge в `main` сразу на стенде. Выкладка только когда на `main` прошли **локальные** build/smoke, затем PR **`main``staging`** на стенде одна **стабильная** версия `X.Y.Z` для отчётов тестировщиков. Подробно: [WORKFLOW.md](./WORKFLOW.md). Прод — только после QA на стенде.
4343

4444
### Позже (когда дойдёте)
4545

docs/GITHUB_BRANCH_PROTECTION.md

Lines changed: 62 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,80 @@
1-
# Настройка защиты веток на GitHub (один раз)
1+
# Настройка защиты веток на GitHub
22

3-
Владелец репозитория: **Settings → Rules → Rulesets** (или **Branches → Branch protection rules**).
3+
Владелец репозитория: **https://github.com/AHTu21/retrogen** **Settings**.
44

5-
## Ветка `main`
5+
Ниже — пошагово. Сначала **`main`**, затем **`staging`**.
66

7-
**Цель:** код только через PR, конфликты решены до merge, сборка зелёная.
7+
---
8+
9+
## 1. Ветка `main` (интеграция)
10+
11+
**Settings****Rules****Rulesets****New branch ruleset** (или *Branch protection rules* → Add rule).
12+
13+
| Поле | Значение |
14+
|------|----------|
15+
| Ruleset name | `Protect main` |
16+
| Enforcement | Active |
17+
| Target branches | Include default branch **`main`** |
818

9-
Рекомендуемые правила:
19+
**Branch rules** — включить:
1020

11-
| Правило | Значение |
12-
|---------|----------|
13-
| Branch name pattern | `main` |
14-
| Restrict deletions | включить |
15-
| Require a pull request before merging | включить |
16-
| Required approvals | `0` или `1` (на ваш выбор) |
17-
| Dismiss stale approvals | по желанию |
18-
| Require status checks to pass | включить |
19-
| Required check | **`build`** (workflow CI) |
20-
| Require branches to be up to date | **включить** — перед merge нужен `git merge main` / Update branch |
21-
| Do not allow bypassing | включить для всех, кроме админа при необходимости |
22-
| Restrict pushes | никто не пушит напрямую в `main` (только merge PR) |
21+
- [x] **Restrict deletions**
22+
- [x] **Require a pull request before merging**
23+
- Required approvals: **0** (или 1, если хотите обязательное ревью)
24+
- [x] Require approval of the most recent reviewable push (если approvals ≥ 1)
25+
- [x] **Require status checks to pass**
26+
- Add checks: выберите **`build`** (job из workflow **CI**)
27+
- [x] Require branches to be up to date before merging
28+
- [x] **Block force pushes**
29+
- [x] **Restrict pushes** (только merge через PR; прямой push в `main` запрещён)
2330

24-
После сохранения: прямой `git push origin main` будет отклонён; только merge PR.
31+
**Save**.
32+
33+
Проверка: `git push origin main` с локального коммита должен быть **отклонён** (если не admin bypass).
2534

2635
---
2736

28-
## Ветка `staging`
37+
## 2. Ветка `staging` (тестовый стенд)
38+
39+
Отдельный ruleset **`Protect staging`**:
40+
41+
| Поле | Значение |
42+
|------|----------|
43+
| Target branches | Include by pattern: **`staging`** |
2944

30-
**Цель:** на тест попадает только осознанный снимок с `main`.
45+
**Branch rules:**
46+
47+
- [x] **Require a pull request before merging**
48+
- [x] **Require status checks to pass****`build`**
49+
- [x] **Block force pushes**
50+
- [x] **Restrict pushes** (фичи не в `staging` напрямую)
51+
52+
**Договорённость в команде** (GitHub не всегда ограничивает base/head):
53+
54+
- PR на `staging` только **`main``staging`**
55+
- Не merge в `staging` «на бегу» с каждой фичей — только после [чеклиста в WORKFLOW.md](./WORKFLOW.md)
56+
57+
Ветка `staging` уже есть на remote. Обновляется **только** merge такого PR.
58+
59+
---
3160

32-
| Правило | Значение |
33-
|---------|----------|
34-
| Branch name pattern | `staging` |
35-
| Require pull request | включить |
36-
| Allowed merge sources | только из `main` (если доступно в ruleset) или договорённость: PR только `main``staging` |
37-
| Require status checks | **`build`** на PR в `staging` |
38-
| Restrict pushes | не пушить фичи напрямую в `staging` |
61+
## 3. Labels (опционально, 1 мин)
3962

40-
Создать ветку (если ещё нет), один раз с локальной `main`:
63+
**Issues****Labels** → New:
4164

42-
```bash
43-
git checkout main
44-
git pull
45-
git checkout -b staging
46-
git push -u origin staging
47-
```
65+
| Label | Цвет | Смысл |
66+
|-------|------|--------|
67+
| `version:minor` | | принудительно minor bump на main |
68+
| `version:patch` | | принудительно patch |
69+
| `version:skip` | | не менять версию |
70+
| `qa-request` | | просьба выкатить на стенд после локальных тестов |
4871

4972
---
5073

51-
## Проверка
74+
## 4. Проверка
5275

53-
1. Создайте тестовую ветку, PR в `main` должен запуститься **Actions → CI**.
54-
2. Пока CI не зелёный — merge недоступен (если включены checks).
55-
3. Смоделируйте конфликт — кнопка Merge должна быть заблокирована до resolve.
76+
1. Ветка `test/rules` PR в `main` должен запуститься **Actions → CI**.
77+
2. Пока CI красный — merge в `main` недоступен (если checks включены).
78+
3. Сконфликтующий PR — кнопка merge заблокирована до **Resolve conflicts**.
5679

57-
Подробный процесс: [WORKFLOW.md](./WORKFLOW.md).
80+
Процесс выкладки на стенд: [WORKFLOW.md](./WORKFLOW.md).

docs/VERSIONING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
| **2-я (MINOR)** | Крупное обновление в **`main`** | **Автоматически** при merge в `main`, если merge «большой» |
99
| **3-я (PATCH)** | Небольшое обновление в **`main`** | **Автоматически** при merge в `main`, если merge «малый» |
1010

11-
Ветка **`staging`** (тестовый стенд) **не меняет** версию повторно — на стенде та же цифра, что в `main` после PR `main``staging`. См. [WORKFLOW.md](./WORKFLOW.md).
11+
Ветка **`staging`** **не поднимает** версию отдельно: на стенде фиксируется уже существующий номер с `main` (например `0.7.3`) в момент **осознанного** PR `main``staging` после локальных тестов. Тестировщики ссылаются на этот номер в отчётах. См. [WORKFLOW.md](./WORKFLOW.md).
1212

1313
Отображение в UI: поле `version` в **`client/package.json`** (окно «О программе»).
1414

docs/WORKFLOW.md

Lines changed: 72 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,85 +1,106 @@
11
# Совместная разработка: ветки, PR, конфликты, тест, прод
22

3-
## Ветки
3+
## Три уровня, не один срез
44

5-
| Ветка | Назначение | Версия (2–3 цифры) | Деплой |
6-
|--------|------------|-------------------|--------|
7-
| **`main`** | Интеграция: сюда вливаются фичи через PR | **Авто** после merge ([VERSIONING.md](./VERSIONING.md)) | Локально / dev |
8-
| **`staging`** | Тестовый стенд: только проверенный снимок с `main` | **Та же**, что в `main` (повторно не bump) | Тестовый сервер |
9-
| **Тег / прод** | Внешний стабильный срез | **1-я цифра** вручную ([ADMIN.md](./ADMIN.md)) | Прод |
5+
| Уровень | Ветка / срез | Для кого | Как обновляется |
6+
|---------|----------------|----------|-----------------|
7+
| **Интеграция** | `main` | Разработчики | Каждая фича через PR; версия 2/3 цифры **растёт автоматически** после merge |
8+
| **Тестовый стенд** | `staging` | Тестировщики, отчёты о багах | **Только вручную**, после **локальных** проверок; на стенде **одна зафиксированная** версия `X.Y.Z` |
9+
| **Прод** | тег / релиз | Пользователи «во вне» | Вручную, 1-я цифра[ADMIN.md](./ADMIN.md) |
1010

1111
```text
12-
feature/* ──PR──► main ──(+бот chore(version))──► PR ──► staging ──► тест-стенд
13-
│ │
14-
└──────────────────────────────────────────────┘
15-
позже: прод (ADMIN)
12+
feature/* ──PR──► main ──(бот: версия 0.7.3)──► локально: build + smoke
13+
14+
«готовы к QA» ▼
15+
PR main → staging ──► деплой стенда
16+
(версия на стенде = 0.7.3)
17+
18+
позже: прод
1619
```
1720

21+
**`staging` не копия `main` в реальном времени.** Пока вы не сделали PR «выкладка на тест», на стенде остаётся **прошлый** стабильный снимок — тестировщики не ловят «полуфабрикат» с только что влитой фичей.
22+
1823
---
1924

20-
## Обычный день (фича)
25+
## Обычная разработка (только `main`)
2126

2227
1. `git checkout main && git pull`
23-
2. `git checkout -b feature/краткое-имя`
24-
3. Код, коммиты, push ветки
25-
4. GitHub → **Pull request → `main`**
26-
5. Ждёте **CI (build)** — зелёная галочка
27-
6. Если **«This branch has conflicts»** — конфликт **до** merge (см. ниже)
28-
7. Ревью → **Merge**
29-
8. Бот (если нужно) коммитит `chore(version): bump to v…` в `main`
30-
9. У партнёра: `git pull origin main`
28+
2. `git checkout -b feature/краткое-имя` → код → push
29+
3. **Pull request → `main`**, дождаться зелёного **CI (build)**
30+
4. При **conflicts** — merge недоступен, правите локально → push (см. ниже)
31+
5. **Merge** → бот может добавить `chore(version): bump to v…`
32+
6. Партнёр: `git pull origin main`
3133

32-
**В `staging` и на тест ничего само не попадает** — только когда создадите PR `main``staging`.
34+
На тестовый стенд это **не** попадает автоматически.
3335

3436
---
3537

36-
## Вывод на тестовый стенд
38+
## Выкладка на тестовый стенд (осознанный срез)
3739

38-
Когда `main` готов к проверке на стенде:
40+
Делайте, когда на **`main`** уже есть нужная версия (например `0.7.3`) и вы **локально** убедились, что сборка ок.
3941

40-
1. PR **`main``staging`** (база `staging`, head `main`)
41-
2. Разрешить конфликты, если есть (редко, если `staging` регулярно обновлять)
42-
3. Merge → деплой с ветки **`staging`** (настройка сервера — [DEPLOYMENT.md](./DEPLOYMENT.md))
43-
4. Версия на стенде = версия в `main` (из «О программе» / `package.json`)
42+
### Чеклист перед PR на `staging`
4443

45-
Отдельного bump версии при merge в `staging` **нет** — иначе тест и интеграция разъедутся.
44+
- [ ] `git checkout main && git pull` (включая коммит `chore(version)`, если был)
45+
- [ ] `npm ci` (или `npm install`)
46+
- [ ] `npm run build` без ошибок
47+
- [ ] `npm run dev` — smoke: вход, комната, ключевые сценарии фичи
48+
- [ ] Миграции: `npm run db:deploy` на **тестовой** БД стенда (не на прод)
49+
- [ ] В PR указать версию: **«Promote v0.7.3 to staging for QA»**
4650

47-
---
51+
### PR на стенд
52+
53+
1. GitHub → **New pull request**: base **`staging`**, compare **`main`**
54+
2. Описание для тестировщиков: что проверять, известные ограничения
55+
3. **CI (build)** зелёный, конфликтов нет → **Merge**
56+
4. Деплой с ветки **`staging`** на тест-сервер ([DEPLOYMENT.md](./DEPLOYMENT.md))
57+
5. **Сообщение тестировщикам** (чат / issue), например:
4858

49-
## Конфликты: когда и как
59+
> Стенд обновлён. Версия для отчётов: **0.7.3** (О программе → номер версии).
60+
> В баге указывайте: версию, браузер, шаги.
5061
51-
| Этап | Что видите | Что делать |
52-
|------|------------|------------|
53-
| PR в `main` | GitHub: **Can’t merge**, conflicts | Локально: `git checkout feature/…`, `git merge main`, правка `<<<<`, `git push` |
54-
| PR `main``staging` | То же | `git checkout staging`, `git pull`, `git merge main` в PR-ветку или в `staging` по инструкции GitHub |
55-
| После merge | Нет «тихих» конфликтов в git ||
56-
| Доска Retrogen (409) | Два редактора одной комнаты | Логика приложения, не git |
62+
### Фиксация версии для отчётов (рекомендуется)
5763

58-
**Защита ветки** (см. [GITHUB_BRANCH_PROTECTION.md](./GITHUB_BRANCH_PROTECTION.md)):
64+
После merge PR в `staging`, на коммите стенда:
5965

60-
- в `main` нельзя merge с конфликтами (GitHub не даст кнопку);
61-
- можно требовать **актуальную ветку** (`main` обновлён перед merge) и **зелёный CI**.
66+
```bash
67+
git checkout staging && git pull
68+
VER=$(node -p "require('./package.json').version")
69+
git tag -a "qa/v${VER}" -m "QA build on staging"
70+
git push origin "qa/v${VER}"
71+
```
72+
73+
Тег **`qa/v0.7.3`** — точная точка в git, если нужно воспроизвести баг. Номер для людей — тот же **`0.7.3`** в UI.
6274

63-
Автоматически конфликты **не решаются** — только показываются; исправление и новый push — **вы**.
75+
Повторная выкладка на тот же стенд без смены версии на `main` не нужна; новая выкладка — когда на `main` уже **0.7.4** и снова прошли локальные тесты.
6476

6577
---
6678

67-
## Что автоматизировано, что нет
79+
## Конфликты
80+
81+
| Этап | Действие |
82+
|------|----------|
83+
| PR в `main` | GitHub блокирует merge → `git merge main` в feature-ветку, правка, push |
84+
| PR `main``staging` | То же; base — **текущий** `staging`, head — **main** |
85+
| Доска (409) | Не git — логика приложения |
86+
87+
Защита веток: [GITHUB_BRANCH_PROTECTION.md](./GITHUB_BRANCH_PROTECTION.md).
88+
89+
---
90+
91+
## Автоматизация
6892

6993
| Действие | Авто? |
7094
|----------|--------|
71-
| Сборка на PR (CI) | Да |
72-
| Блок merge при конфликте | Да (GitHub + настройки) |
73-
| Bump 2/3 цифры после merge в `main` | Да |
74-
| Push в `main` без PR | Нет (если включена защита) |
75-
| Обновление `staging` | Нет — PR вручную |
76-
| Прод (1-я цифра) | Нет — [ADMIN.md](./ADMIN.md) |
77-
| CHANGELOG | Нет — вручную / `npm run changelog:append` |
95+
| CI на PR в `main` / `staging` | Да |
96+
| Bump версии при merge в `main` | Да |
97+
| Обновление `staging` | **Нет** — только PR после локальных тестов |
98+
| Тег `qa/v…` | Вручную (рекомендуется) |
99+
| Прод | [ADMIN.md](./ADMIN.md) |
78100

79101
---
80102

81-
## Labels (GitHub)
82-
83-
`version:minor`, `version:patch`, `version:skip` — для бота версий.
103+
## Labels
84104

85-
Опционально: `ready-for-staging` на PR в `main`, когда готовы к выкладке на тест после merge.
105+
- `version:minor` / `version:patch` / `version:skip` — бот версий на **main**
106+
- `qa-request` (создайте сами) — PR в `main` готов к выкладке на стенд после merge

0 commit comments

Comments
 (0)