Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 37 additions & 17 deletions RUN.md
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@
| [x] | T09 | Решения для поставки | я + Claude | — | T01 |
| [x] | T10 | Terraform | Claude | да | T04, T09 |
| [x] | T11 | CD | Claude | да | T06, T07, T08, T10 |
| [ ] | T12 | Первый деплой | я + Claude | — | T11 |
| [x] | T12 | Первый деплой | я + Claude | — | T11 |

**Почему такой порядок.** Начало задал я. Сначала правила (T01), простейший сервер (T02) и сразу вся DevX-часть (T03–T12). К первой строчке продукта уже работают проверки, релиз и выкладка, и каждая следующая задача проходит через тот же конвейер.

Expand Down Expand Up @@ -262,6 +262,7 @@
| Д12 | shellcheck скриптов composite actions в `.github/actions/` — в CI. actionlint берёт у action только объявленные входы, а скрипты не читает | T11 | Ошибка в скрипте `deployment-target`, `gcloud`, `firebase` или `docker-mirror` проявится только в прогоне после мержа. Сейчас их проверяют shellcheck руками, при правке | Со следующей правкой этих action |
| Д13 | actionlint закреплён руками, 1.7.12 — последняя на 2026-10-14; Dependabot образы из `justfile` не читает. Новая версия, которая знает `queue`, снимет исключение в `.github/actionlint.yaml` | T11 | Новые проверки actionlint не приходят, а исключение может пережить свою причину | При выходе actionlint новее 1.7.12 |
| Д14 | Выкладка ждёт только токен нового аккаунта (`ci-identity-ready`), но не роли, которые тот же apply ему выдаёт: запись в реестр, роль деплоя на сервисе, роли Hosting. В задании SPA Firebase CLI получает токен заново, не тот, что дождался gcloud | T12 | На свежем развёртывании или с новым аккаунтом push, выкатка или публикация могут получить 403, пока IAM не разошёлся по своим серверам. Лечит «Re-run failed jobs» | Если повтор понадобится снова: проверять права шага через `testIamPermissions`, прежде чем шаг их потребует |
| Д15 | Выкладка собирает образ релиза заново, а время сборки и время файла сервера в слое дают новый digest: повторная выкладка того же релиза — возврат кнопкой, «Re-run failed jobs» — переносит тег и добавляет ещё одну версию образа | T12, вторая выкладка | Образ прошлого релиза может раньше времени выпасть из пяти `keep-recent`, а через 30 дней его удалит `delete-old`; откат на ревизию с удалённым образом не поднимет экземпляр | До ближайшего отката с возвратом кнопкой. Проще всего — выкатывать образ, который уже называет тег релиза, если он есть; иначе собирать воспроизводимо: `SOURCE_DATE_EPOCH` и `rewrite-timestamp` вместе |

---

Expand Down Expand Up @@ -1370,11 +1371,11 @@
- На коммите 0538208 `plan` зелёный. Это первое живое доказательство subject PR и условия пула: старой привязки уже нет. План — `31 to add`; лишний против первого прогона — бюджет, который без ID платёжного аккаунта не планировался. ID в логе нет: `***` и `(sensitive value)`.
- Задание «Workflows» зелёное. «Release build» и «Terraform» автор внёс в обязательные проверки ruleset «main».
- **Открыто:**
- «Workflows» — в обязательные проверки ruleset «main»: до первого прогона GitHub его не предлагал (R50);
- «Workflows» — в обязательные проверки ruleset «main»: до первого прогона GitHub его не предлагал (R50) — внесено автором 2026-10-14 (T12);
- мерж — первая выкладка. «Как проверить» после мержа сверяется в T12, откат и возврат — на второй выкладке (T12);
- пересборка devcontainer автором: в нём появится `firebase`;
- `tee /dev/stderr` в `ci-toolchain-image` — в таблице 4 (Д6); неизменяемые релизы и правило на теги — в таблице 3 (В1);
- concurrency вызванного workflow держится на опыте сообщества, а не на документации — сверить на первых выкладках (T12).
- concurrency вызванного workflow держится на опыте сообщества, а не на документации — сверить на первых выкладках (T12) — сверено в T12: кнопка ждала, пока выкладка релиза не кончится.

#### T12. Первый деплой

Expand Down Expand Up @@ -1482,21 +1483,40 @@
- пять запросов `usage` по очереди — рецепт запускают руками, а параллельные запросы усложнили бы разбор ошибок.

Исправления второго круга прошли проверки, третьего ревью нет.
- **Открыто — часть 2, после мержа:**
- шаги автора до неё:
- **Сделано (2026-10-14) — часть 2, вторая выкладка:**
- **шаги автора:**
- секрет `TF_VAR_operator_email`;
- мерж — вторая выкладка;
- Rebuild Container;
- узкое разрешение в `.claude/settings.local.json` на `gh workflow run deploy.yml --ref main`, `gcloud run services update-traffic` и `firebase hosting:clone`;
- **очередь `cd`:** кнопка Deploy во время выкладки релиза должна ждать её конца. Затем она выкатывает тот же релиз, и её apply без изменений — проверка `ignore_changes` и `traffic`;
- **чек-лист на v0.1.4,** с алертом и каналом;
- **откат и возврат** по командам `docs/self-hosting.md`: ревизия и выпуск SPA v0.1.3, затем снова v0.1.4;
- **итог:**
- `just usage`;
- удалить файл разрешения;
- отчёт со статусом «закрыто»;
- T12 `[x]`;
- второй PR.
- Rebuild Container — в нём `firebase` 15.33.0;
- «Workflows» — в обязательные проверки ruleset «main»;
- узкое разрешение в `.claude/settings.local.json` на кнопку, `update-traffic` и `hosting:clone`;
- мерж PR #16. После прогона Claude файл разрешения удалил;
- **вторая выкладка v0.1.4 (09938cd)** — зелёная с первой попытки:
- apply — 2 ресурса, алерт и канал;
- `ci-identity-ready` в обоих заданиях получил токен с первой попытки;
- smoke идёт по адресу по номеру проекта;
- **очередь `cd` проверена.**
- Кнопка Deploy нажата в 20:29:17 UTC, во время выкладки релиза. Её прогон стоял в `pending` и начал первое задание в 20:31:23 — через секунду после последнего задания выкладки релиза.
- Затем кнопка выкатила тот же v0.1.4. Её apply — `0 added, 0 changed, 0 destroyed`: это проверка `ignore_changes`, `traffic` и исправления sink;
- **чек-лист на v0.1.4** — «да» по всем пунктам. Алерт `canvas-api load` и канал `canvas-api operator` включены;
- **откат и возврат** — командами `docs/self-hosting.md`:
- ревизия `canvas-api-00002-p84` и выпуск Hosting v0.1.3: `/health` и скрипт страницы назвали v0.1.3;
- затем `--to-latest` и выпуск v0.1.4 — снова v0.1.4;
- около полуминуты в каждую сторону;
- **находка:** `hosting:clone` пишет выпуск `ROLLBACK` без сообщения — дописано в `docs/self-hosting.md`;
- **расход:** `just usage 1d` — 31,1 vCPU-с за сутки, 0,017 % лимита месяца;
- **отчёт** `docs/live/01-first-deploy.md` — «закрыто»; в «Открыто» T11 закрыты «Workflows» и очередь `cd`;
- **ревью `/code-review high` итоговой правки** — первый круг, 8 находок, все исправлены:
- повторная выкладка того же релиза меняет digest образа и тратит место автоочистки — находка 5 отчёта и долг Д15;
- список выпусков Hosting не показывал вид выпуска и брал 5 строк — теперь вид и 20 строк;
- в RUN.md стояла заглушка вместо итога ревью, а «эпик E1 закрыт» спорил с правилом о сделанных эпиках;
- в отчёте — команда `hosting:clone` без проекта квоты, «выпуск» вместо версии, строка старта без версии и времени, два разных времени начала заданий кнопки;
- **второй круг, 8 находок, все исправлены:** у Д15 названа и вторая причина нового digest — время файла в слое — и повод вернуться: возврат кнопкой и «Re-run» тоже повторные выкладки; отчёт больше не говорит, что это «не вредит»; токен в списке выпусков Hosting — заголовком из дескриптора, а не аргументом `curl`; выпуск без версии не роняет `jq`; полное имя раздела чек-листа; шаг автора с «Workflows» вписан; лишняя пустая строка в списке. Исправления второго круга прошли проверки, третьего ревью нет.
- **Открыто:**
- из «Как проверить» T11 вживую не проверено: план на PR Dependabot, коммит с красным CI, кнопка на другой ветке, перезапуск CI старого коммита. Их держат условия workflow и проверки без облака;
- письмо алерта не проверено: такой нагрузки не было;
- что откат не отменяет следующий apply, вживую не проверялось: трафика в конфигурации нет;
- долги Д14 — роли нового аккаунта выкладка не ждёт, и Д15 — повторная выкладка того же релиза даёт новый образ;
- все задачи таблицы 1 отмечены. Перенести E1 в «Сделанные эпики» и выбрать следующий эпик — шаг автора («Как устроен план»).

> **Точка проверки эпика E1.**
> - Правила работы и версии сверены с образцом от 2026-10-11.
Expand Down
Loading