Compare commits
5
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9ebe5b19d6 | ||
|
|
62d8d7b45d | ||
|
|
02b7d7b701 | ||
|
|
9090488731 | ||
|
|
9e02b696ba |
@@ -35,6 +35,21 @@ API стенда ──▶ generated/<стенд>/resources_yaml/ ──▶ gene
|
||||
|
||||
В `profile.env` также: `PROVIDER_NAME=nubes`, пути GPG-ключей, актуальная `VERSION` стенда.
|
||||
|
||||
## Нумерация версий провайдера по стендам
|
||||
|
||||
> ⛔ **ЕДИНСТВЕННАЯ схема (с 2026-09-03).** Старые диапазоны (`prod=2.*`, `dev=3.*`,
|
||||
> `test=5.*`, а также `0.0.x`) — ЛЕГАСИ, **НЕ ИСПОЛЬЗОВАТЬ**. Полная чистка реестра
|
||||
> выполнена 2026-09-03 — старые версии удалены из S3.
|
||||
|
||||
| Стенд | Диапазон версий | Первая |
|
||||
|---|---|---|
|
||||
| **prod** (`nubes`) | `1.*.*` | `1.0.0` |
|
||||
| **dev** (`nubes-dev`) | `2.*.*` | `2.0.0` |
|
||||
| **test** (`nubes-test`) | `3.*.*` | `3.0.0` |
|
||||
|
||||
Версия передаётся аргументом в `03_build_and_upload_provider.sh <ver>` и хранится в
|
||||
`VERSION` в `profile.env`. Источник правды — [`VERSIONS.md`](../../VERSIONS.md).
|
||||
|
||||
## Поток A — генерация Markdown (API → YAML → .md)
|
||||
|
||||
| Шаг | Скрипт | Результат |
|
||||
@@ -106,6 +121,45 @@ API стенда ──▶ generated/<стенд>/resources_yaml/ ──▶ gene
|
||||
- Доставка до браузера: S3 → ВМ-зеркало (`/var/www/tf-docs/`) → nginx ВМ отдаёт `/<namespace>/` → под `tf_docs` (reverse-proxy в кластере) → `https://tf-docs.nodejsk8s.dev.nubes.ru/<namespace>/`.
|
||||
- ВМ отдаёт также по прямому IP `http://5.172.178.213/<namespace>/`.
|
||||
|
||||
## Требования к окружению (настроено 2026-09-03)
|
||||
|
||||
Чтобы пайплайн работал **штатно и не ломался**, на машине сборки должно быть:
|
||||
|
||||
| Компонент | Как проверить | Что ставить |
|
||||
|---|---|---|
|
||||
| `python3-venv` (Debian/Ubuntu) | `python3 -m venv /tmp/v && ls /tmp/v/bin/pip` | `sudo apt install -y python3.12-venv` — без него venv создаётся БЕЗ pip |
|
||||
| `.venv` проекта с mkdocs | `.venv/bin/python -m mkdocs --version` | пересоздать: `rm -rf .venv && python3 -m venv .venv && .venv/bin/pip install mkdocs==1.6.1 mkdocs-material==9.7.3` |
|
||||
| Системный mkdocs (запасной) | `python3 -m mkdocs --version` | `pip3 install --user mkdocs==1.6.1 mkdocs-material==9.7.3` |
|
||||
| `mc` (MinIO client) | `mc --version` | см. docs min.io |
|
||||
| docker + образ `squidfunk/mkdocs-material` (запасной) | `docker images` | `docker pull squidfunk/mkdocs-material` |
|
||||
|
||||
> **Почему так.** `04` при `--profile` собирает через `.venv` проекта. Если `.venv` пустой/сломан (нет pip/mkdocs) — сборка падает. Корень: без системного пакета `python3.12-venv` виртуальное окружение создаётся без `pip`/`ensurepip`. Это чинится один раз (apt + пересоздание `.venv`), дальше не ломается.
|
||||
> Версии зафиксированы: `mkdocs==1.6.1`, `mkdocs-material==9.7.3` (совпадают и в системном python3, и в `.venv`).
|
||||
|
||||
## Публикация: где запускать `mc mirror`
|
||||
|
||||
S3 (`s3.msk-1.ngcloud.ru`) из локальной сети **рвёт большие ответы** (рекурсивный листинг >нескольких сотен объектов зависает: `mc: Unable to list ... unexpected EOF`; малые `mc ls`/`mc cp` работают). Поэтому **заливку на S3 делать с ВМ `5.172.178.213`** — у неё быстрый канал до S3 (~10 МБ/с).
|
||||
|
||||
Полный цикл публикации стенда (сборка локально → S3 с ВМ → зеркало на ВМ):
|
||||
|
||||
```bash
|
||||
# 1. Сборка (локально, штатно)
|
||||
./TOOLS/scripts/04_build_and_publish_docs.sh --profile TOOLS/config/test 5.0.8
|
||||
# (если site/ собирался docker-ом от root — mkdocs не сможет его перезаписать:
|
||||
# sudo rm -rf site или docker run --rm -v $PWD:/docs --entrypoint rm squidfunk/mkdocs-material -rf /docs/site)
|
||||
|
||||
# 2. Передать собранный site/ на ВМ
|
||||
tar -C site -cf - . | ssh naeel@5.172.178.213 'rm -rf ~/tmp-docs-site && mkdir -p ~/tmp-docs-site && tar -C ~/tmp-docs-site -xf -'
|
||||
|
||||
# 3. Залить на S3 с ВМ (быстрый канал)
|
||||
ssh naeel@5.172.178.213 'mc mirror --overwrite --remove ~/tmp-docs-site/ registry/terraform-registry/docs/nubes-test/nubes/'
|
||||
|
||||
# 4. Обновить зеркало /var/www/tf-docs (откуда nginx отдаёт сайт)
|
||||
ssh naeel@5.172.178.213 'mc mirror --overwrite --remove "registry/terraform-registry/docs/nubes-test/nubes/" /var/www/tf-docs/nubes-test/'
|
||||
```
|
||||
|
||||
> ⚠️ Если `mc mirror`/`mc ls -r` локально зависает — это не баг скрипта, а сеть до S3; заливать с ВМ.
|
||||
|
||||
## Быстрые команды
|
||||
|
||||
```bash
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
# Баг Dev-генератора: рассинхрон nested-параметра
|
||||
|
||||
**Дата:** 2026-09-03
|
||||
**Статус:** план решения, изменения не выполнены
|
||||
|
||||
## Симптом
|
||||
|
||||
Сборка Dev-провайдера падает на сгенерированном `95_nodejs_resource.go`:
|
||||
|
||||
```text
|
||||
plan.JsonEnv.IsNull undefined
|
||||
plan.JsonEnv.IsUnknown undefined
|
||||
plan.JsonEnv.ValueString undefined
|
||||
```
|
||||
|
||||
## Причина
|
||||
|
||||
В Dev API один и тот же параметр `jsonEnv` описан по-разному:
|
||||
|
||||
- в `create` — `map` с `sub_params` (`DB_PASS`), то есть nested-параметр;
|
||||
- в `modify` — `map` без `sub_params`, то есть параметр выглядит плоским.
|
||||
|
||||
Генератор объединяет параметры через `params.Merge`. Поэтому в канонической
|
||||
`SchemaParams` `jsonEnv` становится nested и модель содержит
|
||||
`*NodejsJsonEnvModel`.
|
||||
|
||||
Однако `params.AlignParamTypes` переносит вложенные параметры только когда у
|
||||
параметра операции уже установлен `HasSubParams`. У `modify.jsonEnv` этот флаг
|
||||
ложный, поэтому `ModifyParams` сохраняет scalar-представление.
|
||||
|
||||
Шаблон `Update` видит `modify.jsonEnv` как scalar и генерирует вызовы
|
||||
`IsNull()`, `IsUnknown()` и `ValueString()`. В сгенерированной модели это
|
||||
указатель на nested-структуру, поэтому Go-код не компилируется.
|
||||
|
||||
## Универсальное решение
|
||||
|
||||
Генератор не должен содержать условий для Dev, Test, Prod или конкретного
|
||||
сервиса. Нужна единая нормализация всех operation params относительно общей
|
||||
канонической схемы:
|
||||
|
||||
```text
|
||||
schemaParams = Merge(createParams, modifyParams, deleteParams)
|
||||
createParams = NormalizeAgainstSchema(createParams, schemaParams)
|
||||
modifyParams = NormalizeAgainstSchema(modifyParams, schemaParams)
|
||||
deleteParams = NormalizeAgainstSchema(deleteParams, schemaParams)
|
||||
```
|
||||
|
||||
Нормализация должна рекурсивно переносить из канонической схемы структурные
|
||||
свойства:
|
||||
|
||||
- `Type`;
|
||||
- `HasSubParams`;
|
||||
- `SubParams` и их типы.
|
||||
|
||||
Собственные свойства конкретной операции должны сохраняться: `ID`,
|
||||
`Required`, `Default`, описания и остальные operation-specific поля.
|
||||
|
||||
После нормализации `SchemaParams.jsonEnv` и `ModifyParams.jsonEnv` будут иметь
|
||||
одинаковую nested-структуру, а шаблон сгенерирует nested-обработку вместо
|
||||
scalar-методов.
|
||||
|
||||
## Граница ответственности
|
||||
|
||||
Расхождение Dev API остаётся дефектом входной схемы, но не должно ломать
|
||||
универсальный генератор. Исправление только YAML Dev или специальная проверка
|
||||
`jsonEnv` были бы стендовыми обходами и не решают общий класс проблем.
|
||||
|
||||
## Обязательная проверка
|
||||
|
||||
Добавить генераторный тест на общий случай:
|
||||
|
||||
```text
|
||||
create: map-fixed/map с sub_params
|
||||
modify: тот же code без sub_params
|
||||
ожидание: modify после нормализации — nested
|
||||
```
|
||||
|
||||
Проверка результата: сгенерированный Go-код должен компилироваться, а nested
|
||||
параметр не должен получать scalar-вызовы в `Update`.
|
||||
|
||||
## Текущий статус стендов
|
||||
|
||||
- Test `3.0.0` опубликован.
|
||||
- Prod `1.0.0` опубликован.
|
||||
- Dev `2.0.0` не опубликован: сборка остановилась на компиляции generated Go.
|
||||
@@ -0,0 +1,61 @@
|
||||
# 2026-09-03 — Чистка реестра + новая нумерация версий + баг dev
|
||||
|
||||
## Новая схема нумерации версий (с 2026-09-03)
|
||||
|
||||
| Стенд | Namespace | Диапазон | Первая |
|
||||
|---|---|---|---|
|
||||
| prod | `nubes` | `1.*.*` | `1.0.0` |
|
||||
| dev | `nubes-dev` | `2.*.*` | `2.0.0` |
|
||||
| test | `nubes-test` | `3.*.*` | `3.0.0` |
|
||||
|
||||
⛔ Старые схемы (`prod=2.*`, `dev=3.*`, `test=5.*`, `0.0.x`) — ЛЕГАСИ, не использовать.
|
||||
Обновлено: `VERSIONS.md`, `TOOLS/config/*/profile.env`, `DOCS_PIPELINE/README.md`,
|
||||
`docs/30_registry/guides/getting-started.md`.
|
||||
|
||||
## Чистка реестра
|
||||
|
||||
Из S3 (`nubes-terraform-registry`, креды super `1112_terraform`) удалены ВСЕ старые версии:
|
||||
- `nubes-dev`: 3.0.2–3.0.6
|
||||
- `nubes`: 2.0.2, 2.0.3, 2.0.5, 2.0.6
|
||||
- `nubes-test`: 0.0.1, 5.0.1–5.0.5, 5.1.17
|
||||
|
||||
После чистки в каждом namespace — 0 объектов. Легаси (5.1.17 и т.д.) нигде не осталось.
|
||||
|
||||
## Статус перегенерации (2026-09-03)
|
||||
|
||||
- ✅ **test** `3.0.0` — сгенерирован и загружен (`Done. Version 3.0.0 uploaded`).
|
||||
- ❌ **dev** `2.0.0` — НЕ собирается (пропущен по решению пользователя), см. баг ниже.
|
||||
- ⏳ **prod** `1.0.0` — в работе.
|
||||
|
||||
## Баг dev: nodejs jsonEnv (create vs modify)
|
||||
|
||||
Симптом: `03` dev падает на компиляции сгенерированного кода:
|
||||
```
|
||||
internal/resources_gen/95_nodejs_resource.go:350-353:
|
||||
plan.JsonEnv.IsNull / IsUnknown / ValueString undefined
|
||||
(type *NodejsJsonEnvModel has no field or method ...)
|
||||
```
|
||||
|
||||
Причина: **API dev** для nodejs `jsonEnv`:
|
||||
- в `create` (op id=58) — `map` **с `sub_params`** (типизированные ключи, напр. DB_PASS) → генератор создаёт вложенную модель `NodejsJsonEnvModel`;
|
||||
- в `modify` (op id=59) — `map` **без `sub_params`** → генератор для diff генерирует строковое сравнение (`IsNull/ValueString`).
|
||||
|
||||
У test/prod `jsonEnv` без sub_params в обоих операциях → строка → собирается.
|
||||
|
||||
Корень: `TOOLS/resource-generator/internal/params/params.go`, `AlignParamTypes` —
|
||||
подмешивает `SubParams` из schema в modify только если `HasSubParams` уже true:
|
||||
```go
|
||||
if !p.HasSubParams { continue } // modify-jsonEnv (без sub) пропускается
|
||||
```
|
||||
|
||||
Возможный фикс: наследовать `HasSubParams`/`SubParams` из schema для параметров с тем же
|
||||
code. ⚠️ Нюанс: diff-шаблон исключает nested-поля из `hasServiceParamChanges` — изменение
|
||||
nested jsonEnv не будет триггерить modify (нужно продумать отдельно).
|
||||
|
||||
**Вывод:** сервисы/структуры API стендов отличаются (dev jsonEnv — nested в create).
|
||||
Каждый стенд рассматривать независимо. dev отложен до решения по генератору/API.
|
||||
|
||||
## Прочее (инфраструктура, этот же день)
|
||||
- Токены API `secrets/*.token` были отозваны на стороне IAM (401 IAM error при валидном exp) — обновлены 2026-09-03.
|
||||
- S3-креды `.s3cfg_registry` (docs) не имеют прав на бакет бинарников `nubes-terraform-registry`;
|
||||
заливка бинарников — subuser `super` аккаунта `1112_terraform` (см. `tf_registry/HISTORY/HOWTO-UPLOAD.md`).
|
||||
@@ -0,0 +1,106 @@
|
||||
# План: чистка реестра + новая нумерация версий по стендам
|
||||
|
||||
> Для Flash. Цель — убрать ВСЕ старые залитые версии (легаси) и ввести единый
|
||||
> принцип нумерации, чтобы старое (5.1.17 и т.п.) больше нигде не всплывало.
|
||||
|
||||
## Новый принцип нумерации (ЗАФИКСИРОВАТЬ)
|
||||
|
||||
| Стенд | Namespace | Диапазон версий | Первая версия по новой схеме |
|
||||
|---|---|---|---|
|
||||
| **prod** | `nubes` | `1.*.*` | `1.0.0` |
|
||||
| **dev** | `nubes-dev` | `2.*.*` | `2.0.0` |
|
||||
| **test** | `nubes-test` | `3.*.*` | `3.0.0` |
|
||||
|
||||
> ⛔ Старые схемы (`prod=2.*`, `dev=3.*`, `test=5.*`, а также `0.0.1`) — ЛЕГАСИ.
|
||||
> Никогда больше не использовать.
|
||||
|
||||
## Текущее состояние в S3 (нужно УДАЛИТЬ ВСЁ)
|
||||
|
||||
Бакет `nubes-terraform-registry`, префикс `tf-registry.containerk8s.services.ngcloud.ru/<ns>/nubes/`:
|
||||
|
||||
- `nubes-dev`: `3.0.2 3.0.3 3.0.4 3.0.5 3.0.6`
|
||||
- `nubes` (prod): `2.0.2 2.0.3 2.0.5 2.0.6`
|
||||
- `nubes-test`: `0.0.1 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.1.17`
|
||||
|
||||
## Шаг 1 — Удалить все залитые версии из S3
|
||||
|
||||
Креды на запись: subuser `super` аккаунта `1112_terraform`,
|
||||
передаются через переменные окружения `S3_ACCESS_KEY` и `S3_SECRET_KEY`.
|
||||
|
||||
```bash
|
||||
mc alias set super-s3 https://s3.msk-1.ngcloud.ru "$S3_ACCESS_KEY" "$S3_SECRET_KEY" --api S3v4
|
||||
|
||||
# Удалить ВСЕ версии каждого стенда (рекursивно, включая подфайлы)
|
||||
mc rm --recursive --force super-s3/nubes-terraform-registry/tf-registry.containerk8s.services.ngcloud.ru/nubes-test/nubes/
|
||||
mc rm --recursive --force super-s3/nubes-terraform-registry/tf-registry.containerk8s.services.ngcloud.ru/nubes-dev/nubes/
|
||||
mc rm --recursive --force super-s3/nubes-terraform-registry/tf-registry.containerk8s.services.ngcloud.ru/nubes/nubes/
|
||||
```
|
||||
|
||||
Проверка после удаления (должно быть пусто):
|
||||
```bash
|
||||
mc ls super-s3/nubes-terraform-registry/tf-registry.containerk8s.services.ngcloud.ru/nubes-test/nubes/
|
||||
mc ls super-s3/nubes-terraform-registry/tf-registry.containerk8s.services.ngcloud.ru/nubes-dev/nubes/
|
||||
mc ls super-s3/nubes-terraform-registry/tf-registry.containerk8s.services.ngcloud.ru/nubes/nubes/
|
||||
```
|
||||
|
||||
## Шаг 2 — Зафиксировать новую нумерацию в конфигах и док-файлах
|
||||
|
||||
Обновить (каждый файл — по новому принципу prod=1.*, dev=2.*, test=3.*):
|
||||
|
||||
1. **`VERSIONS.md`** — таблица версий по стендам + схема:
|
||||
- PROD → `1.*` (первая `1.0.0`)
|
||||
- DEV → `2.*` (первая `2.0.0`)
|
||||
- TEST → `3.*` (первая `3.0.0`)
|
||||
2. **`TOOLS/config/prod/profile.env`** → `VERSION="1.0.0"`
|
||||
3. **`TOOLS/config/dev/profile.env`** → `VERSION="2.0.0"`
|
||||
4. **`TOOLS/config/test/profile.env`** → `VERSION="3.0.0"`
|
||||
5. **`DOCS_PIPELINE/README.md`** — раздел про нумерацию версий (схема выше).
|
||||
6. **`docs/30_registry/guides/getting-started.md`** — `version = "..."` в примере привести
|
||||
к актуальной (или оставить как «подставьте нужную», но НЕ 5.0.5 и не 5.1.17).
|
||||
|
||||
> ⚠️ Проверить, что в этих файлах нигде не осталось `5.1.17`, `5.0.x`, `3.0.x`
|
||||
> (кроме новой схемы), `2.0.x` (кроме новой `1.x` для prod). Сделать `grep -rn`.
|
||||
|
||||
## Шаг 3 — Перегенерировать провайдеры по новой схеме (01→02→03)
|
||||
|
||||
Для каждого стенда (порядок test → dev → prod), версия = первая по новой схеме:
|
||||
|
||||
```bash
|
||||
cd /home/naeel/TF/tf_provider
|
||||
|
||||
# TEST → 3.0.0
|
||||
./TOOLS/scripts/01_generate_yamls.sh --profile TOOLS/config/test
|
||||
./TOOLS/scripts/02_generate_resources_and_docs_v2.sh --profile TOOLS/config/test
|
||||
S3_ACCESS_KEY="$S3_ACCESS_KEY" S3_SECRET_KEY="$S3_SECRET_KEY" \
|
||||
./TOOLS/scripts/03_build_and_upload_provider.sh --profile TOOLS/config/test 3.0.0
|
||||
|
||||
# DEV → 2.0.0
|
||||
./TOOLS/scripts/01_generate_yamls.sh --profile TOOLS/config/dev
|
||||
./TOOLS/scripts/02_generate_resources_and_docs_v2.sh --profile TOOLS/config/dev
|
||||
S3_ACCESS_KEY="$S3_ACCESS_KEY" S3_SECRET_KEY="$S3_SECRET_KEY" \
|
||||
./TOOLS/scripts/03_build_and_upload_provider.sh --profile TOOLS/config/dev 2.0.0
|
||||
|
||||
# PROD → 1.0.0
|
||||
./TOOLS/scripts/01_generate_yamls.sh --profile TOOLS/config/prod
|
||||
./TOOLS/scripts/02_generate_resources_and_docs_v2.sh --profile TOOLS/config/prod
|
||||
S3_ACCESS_KEY="$S3_ACCESS_KEY" S3_SECRET_KEY="$S3_SECRET_KEY" \
|
||||
./TOOLS/scripts/03_build_and_upload_provider.sh --profile TOOLS/config/prod 1.0.0
|
||||
```
|
||||
|
||||
> Документацию (04) НЕ запускать — пользователь пока не просил.
|
||||
|
||||
## Предусловия (ПРОВЕРЕНО)
|
||||
|
||||
- Go 1.23.1, docker, `mc`, GPG-ключи — на месте.
|
||||
- Токены API `secrets/{dev,test,prod}.token` — ОБНОВЛЕНЫ 2026-09-03 (валидны, exp 2027-03-02).
|
||||
- `operation_timeouts.json` в каждом профиле — на месте.
|
||||
- S3-креды на запись бинарников — `super` subuser (см. выше).
|
||||
- `registry.env`: hostname `tf-registry.containerk8s.services.ngcloud.ru`, bucket `nubes-terraform-registry`.
|
||||
|
||||
## Контроль
|
||||
|
||||
После каждого `03` — сообщение `Done. Version X.Y.Z uploaded.`
|
||||
После всех — в S3 должны остаться ТОЛЬКО:
|
||||
- `nubes/nubes/1.0.0/`
|
||||
- `nubes-dev/nubes/2.0.0/`
|
||||
- `nubes-test/nubes/3.0.0/`
|
||||
@@ -0,0 +1,78 @@
|
||||
# План: перегенерация провайдеров всех стендов (версия 0.0.1)
|
||||
|
||||
> Для Flash. Генерацию выполняет Flash по этому плану. Документацию НЕ трогать.
|
||||
|
||||
## Цель
|
||||
Перегенерировать код Terraform-провайдера Nubes для 3 стендов из API и залить
|
||||
бинарники **версии 0.0.1**. Документацию не генерировать и не публиковать.
|
||||
|
||||
## Версия
|
||||
`0.0.1` — для всех трёх стендов.
|
||||
|
||||
## Порядок стендов
|
||||
`test` → `dev` → `prod`
|
||||
|
||||
## Команды (для каждого стенда, по порядку)
|
||||
|
||||
```bash
|
||||
cd /home/naeel/TF/tf_provider
|
||||
|
||||
# стенд = test | dev | prod
|
||||
./TOOLS/scripts/01_generate_yamls.sh --profile TOOLS/config/<стенд>
|
||||
./TOOLS/scripts/02_generate_resources_and_docs_v2.sh --profile TOOLS/config/<стенд>
|
||||
./TOOLS/scripts/03_build_and_upload_provider.sh --profile TOOLS/config/<стенд> 0.0.1
|
||||
```
|
||||
|
||||
Полные команды:
|
||||
```bash
|
||||
# TEST
|
||||
./TOOLS/scripts/01_generate_yamls.sh --profile TOOLS/config/test
|
||||
./TOOLS/scripts/02_generate_resources_and_docs_v2.sh --profile TOOLS/config/test
|
||||
./TOOLS/scripts/03_build_and_upload_provider.sh --profile TOOLS/config/test 0.0.1
|
||||
|
||||
# DEV
|
||||
./TOOLS/scripts/01_generate_yamls.sh --profile TOOLS/config/dev
|
||||
./TOOLS/scripts/02_generate_resources_and_docs_v2.sh --profile TOOLS/config/dev
|
||||
./TOOLS/scripts/03_build_and_upload_provider.sh --profile TOOLS/config/dev 0.0.1
|
||||
|
||||
# PROD
|
||||
./TOOLS/scripts/01_generate_yamls.sh --profile TOOLS/config/prod
|
||||
./TOOLS/scripts/02_generate_resources_and_docs_v2.sh --profile TOOLS/config/prod
|
||||
./TOOLS/scripts/03_build_and_upload_provider.sh --profile TOOLS/config/prod 0.0.1
|
||||
```
|
||||
|
||||
## Что делает каждый шаг
|
||||
|
||||
| Шаг | Результат |
|
||||
|---|---|
|
||||
| `01` | тянет YAML-спеки ресурсов из API стенда → `generated/<стенд>/resources_yaml/` |
|
||||
| `02` | YAML → **Go-код** (`generated/<стенд>/go/`) + `.md`-доки (`generated/<стенд>/docs/`, побочный продукт — НЕ публикуем) |
|
||||
| `03` | кросс-сборка linux/windows/darwin amd64 (`go build -ldflags "-X main.version=0.0.1 -X main.address=tf-registry.containerk8s.services.ngcloud.ru/<ns>/nubes"`) → `SHA256SUMS` + GPG-подпись → `mc cp` в S3 |
|
||||
|
||||
## Namespace и target S3 (автоматически из profile.env + registry.env)
|
||||
|
||||
| Стенд | Namespace | Бинарники в S3 |
|
||||
|---|---|---|
|
||||
| dev | `nubes-dev` | `nubes-terraform-registry/tf-registry.containerk8s.services.ngcloud.ru/nubes-dev/nubes/0.0.1/` |
|
||||
| test | `nubes-test` | `.../nubes-test/nubes/0.0.1/` |
|
||||
| prod | `nubes` | `.../nubes/nubes/0.0.1/` |
|
||||
|
||||
## Предусловия — ПРОВЕРЕНО, всё готово
|
||||
- Go 1.23.1, docker 29.1.3, `mc`, GPG (`secrets/private_key.asc`, `public_key.asc`).
|
||||
- Токены API: `secrets/{dev,test,prod}.token` на месте.
|
||||
- API-эндпоинты доступны (HTTP 403 без токена — ожидаемо, токен передаёт 01).
|
||||
- `TOOLS/config/<стенд>/operation_timeouts.json` на месте.
|
||||
- `registry.env`: `REGISTRY_HOSTNAME=tf-registry.containerk8s.services.ngcloud.ru`, `S3_BUCKET=nubes-terraform-registry`.
|
||||
|
||||
## Чего НЕ делать
|
||||
- НЕ запускать `04_build_and_publish_docs.sh` (документация не нужна сейчас).
|
||||
- НЕ менять версию `0.0.1` на другую.
|
||||
- НЕ трогать `.venv`/mkdocs (для 03 не нужны).
|
||||
|
||||
## Контроль успеха
|
||||
Каждый `03` должен завершиться сообщением `Done. Version 0.0.1 uploaded.`
|
||||
Проверка версии в реестре после заливки (опционально):
|
||||
```bash
|
||||
curl -s https://tf-registry.containerk8s.services.ngcloud.ru/v1/providers/<ns>/nubes/versions
|
||||
```
|
||||
(должна появиться `0.0.1`).
|
||||
@@ -4,7 +4,7 @@ TOKEN_FILE="secrets/dev.token"
|
||||
|
||||
# Release versions
|
||||
# Version
|
||||
VERSION="3.0.8"
|
||||
VERSION="2.0.0"
|
||||
|
||||
NAMESPACE="nubes-dev"
|
||||
PROVIDER_NAME="nubes"
|
||||
|
||||
@@ -4,7 +4,7 @@ TOKEN_FILE="secrets/prod.token"
|
||||
|
||||
# Release versions
|
||||
# Version
|
||||
VERSION="2.0.8"
|
||||
VERSION="1.0.0"
|
||||
|
||||
NAMESPACE="nubes"
|
||||
PROVIDER_NAME="nubes"
|
||||
|
||||
@@ -3,7 +3,7 @@ NUBES_API_ENDPOINT="https://lk-api-gateway-test.ngcloud.ru/api/v1/svc"
|
||||
TOKEN_FILE="secrets/test.token"
|
||||
|
||||
# Version
|
||||
VERSION="5.0.8"
|
||||
VERSION="3.0.0"
|
||||
|
||||
NAMESPACE="nubes-test"
|
||||
PROVIDER_NAME="nubes"
|
||||
|
||||
@@ -74,8 +74,8 @@ S3CFG_REGISTRY="$(resolve_root_path "$S3CFG_REGISTRY")"
|
||||
TMP_DOCS_DIR=""
|
||||
|
||||
if [[ -n "$PROFILE_DIR" ]]; then
|
||||
# ⛔ NEVER merge with docs/ — ONLY generated docs from docs_gen/<stand>/
|
||||
DOCS_GEN_DIR="${DOCS_GEN_DIR:-generated/test}"
|
||||
# ⛔ NEVER merge with docs/ — ONLY generated docs from generated/<stand>/docs/
|
||||
DOCS_GEN_DIR="${DOCS_GEN_DIR:-generated/$(basename "$PROFILE_DIR")/docs}"
|
||||
DOCS_GEN_DIR="$(resolve_root_path "$DOCS_GEN_DIR")"
|
||||
if [[ -d "$DOCS_GEN_DIR" ]]; then
|
||||
export MKDOCS_DOCS_DIR="$DOCS_GEN_DIR"
|
||||
@@ -89,34 +89,6 @@ fi
|
||||
DOCS_API_ENDPOINT="${NUBES_API_ENDPOINT:-https://lk-api-gateway.ngcloud.ru/api/v1/svc}"
|
||||
DOCS_API_ENDPOINT="$(normalize_api_endpoint "$DOCS_API_ENDPOINT")"
|
||||
|
||||
if [[ -n "${MKDOCS_DOCS_DIR:-}" ]]; then
|
||||
export DOCS_GUIDE_VERSION="$VERSION"
|
||||
export DOCS_GUIDE_API_ENDPOINT="$DOCS_API_ENDPOINT"
|
||||
export DOCS_GUIDE_FILE="${MKDOCS_DOCS_DIR}/guides/getting-started.md"
|
||||
python3 - <<'PY'
|
||||
import os
|
||||
import re
|
||||
from pathlib import Path
|
||||
|
||||
guide_path = Path(os.environ["DOCS_GUIDE_FILE"])
|
||||
if guide_path.exists():
|
||||
text = guide_path.read_text(encoding="utf-8")
|
||||
text = re.sub(
|
||||
r'(version\s*=\s*")([0-9.]+)("\s*#\s*Поставьте нужную вам версию провайдера)',
|
||||
lambda m: f'{m.group(1)}{os.environ["DOCS_GUIDE_VERSION"]}{m.group(3)}',
|
||||
text,
|
||||
count=1,
|
||||
)
|
||||
text = re.sub(
|
||||
r'(api_endpoint\s*=\s*")([^"]+)(")',
|
||||
lambda m: f'{m.group(1)}{os.environ["DOCS_GUIDE_API_ENDPOINT"]}{m.group(3)}',
|
||||
text,
|
||||
count=1,
|
||||
)
|
||||
guide_path.write_text(text, encoding="utf-8")
|
||||
PY
|
||||
fi
|
||||
|
||||
load_s3cfg_registry() {
|
||||
local cfg="$1"
|
||||
if [[ ! -f "$cfg" ]]; then
|
||||
@@ -159,7 +131,7 @@ load_s3cfg_registry() {
|
||||
TMP_CFG="${ROOT_DIR}/.mkdocs.tmp.yml"
|
||||
export ROOT_DIR
|
||||
|
||||
# Copy 30_registry assets and curated content into docs dir
|
||||
# Copy 30_registry assets and curated content into docs dir (ДО подстановки версии)
|
||||
if [[ -n "${MKDOCS_DOCS_DIR:-}" ]]; then
|
||||
if [[ -d "${ROOT_DIR}/docs/30_registry" ]]; then
|
||||
mkdir -p "${MKDOCS_DOCS_DIR}/30_registry"
|
||||
@@ -171,6 +143,39 @@ if [[ -n "${MKDOCS_DOCS_DIR:-}" ]]; then
|
||||
fi
|
||||
fi
|
||||
|
||||
# Per-стенд подстановка в getting-started (после копирования 30_registry в docs_dir)
|
||||
if [[ -n "${MKDOCS_DOCS_DIR:-}" ]]; then
|
||||
export DOCS_GUIDE_VERSION="$VERSION"
|
||||
export DOCS_GUIDE_API_ENDPOINT="$DOCS_API_ENDPOINT"
|
||||
export DOCS_GUIDE_NAMESPACE="$NAMESPACE"
|
||||
export DOCS_GUIDE_FILE="${MKDOCS_DOCS_DIR}/30_registry/guides/getting-started.md"
|
||||
python3 - <<'PY'
|
||||
import os
|
||||
import re
|
||||
from pathlib import Path
|
||||
|
||||
guide_path = Path(os.environ["DOCS_GUIDE_FILE"])
|
||||
if guide_path.exists():
|
||||
text = guide_path.read_text(encoding="utf-8")
|
||||
# source namespace: .../{{NAMESPACE}}/nubes -> .../<ns>/nubes
|
||||
text = text.replace("{{NAMESPACE}}", os.environ["DOCS_GUIDE_NAMESPACE"])
|
||||
# version (первое вхождение version = "x.y.z" — блок required_providers)
|
||||
text = re.sub(
|
||||
r'(version\s*=\s*")([0-9.]+)(")',
|
||||
lambda m: f'{m.group(1)}{os.environ["DOCS_GUIDE_VERSION"]}{m.group(3)}',
|
||||
text,
|
||||
count=1,
|
||||
)
|
||||
text = re.sub(
|
||||
r'(api_endpoint\s*=\s*")([^"]+)(")',
|
||||
lambda m: f'{m.group(1)}{os.environ["DOCS_GUIDE_API_ENDPOINT"]}{m.group(3)}',
|
||||
text,
|
||||
count=1,
|
||||
)
|
||||
guide_path.write_text(text, encoding="utf-8")
|
||||
PY
|
||||
fi
|
||||
|
||||
python3 - <<'PY'
|
||||
import os
|
||||
import re
|
||||
|
||||
+10
-7
@@ -4,9 +4,9 @@
|
||||
|
||||
| Стенд | Namespace | Версия | Дата заливки |
|
||||
|---|---|---|---|
|
||||
| DEV | `nubes-dev` | `3.0.2` | 2026-08-09 | ✅ из DEV API |
|
||||
| TEST | `nubes-test` | `5.0.1` | 2026-08-09 | ✅ |
|
||||
| PROD | `nubes` | `2.0.1` | — | |
|
||||
| PROD | `nubes` | `1.0.0` | 2026-09-03 | (новая нумерация) |
|
||||
| DEV | `nubes-dev` | `2.0.0` | 2026-09-03 | (новая нумерация) |
|
||||
| TEST | `nubes-test` | `3.0.0` | 2026-09-03 | (новая нумерация) |
|
||||
|
||||
## Как проверить
|
||||
|
||||
@@ -23,8 +23,11 @@ curl -s https://tf-registry.containerk8s.services.ngcloud.ru/v1/providers/nubes/
|
||||
|
||||
## Схема версионирования
|
||||
|
||||
| Стенд | Первая цифра |
|
||||
> ⛔ ЕДИНСТВЕННАЯ СХЕМА (с 2026-09-03). Старые диапазоны (prod=2.*, dev=3.*,
|
||||
> test=5.*, а также 0.0.x) — ЛЕГАСИ, НЕ ИСПОЛЬЗОВАТЬ.
|
||||
|
||||
| Стенд | Диапазон |
|
||||
|---|---|
|
||||
| PROD | `2.*` |
|
||||
| DEV | `3.*` |
|
||||
| TEST | `5.*` |
|
||||
| PROD | `1.*` |
|
||||
| DEV | `2.*` |
|
||||
| TEST | `3.*` |
|
||||
|
||||
@@ -24,8 +24,8 @@
|
||||
terraform {
|
||||
required_providers {
|
||||
nubes = {
|
||||
source = "tf-registry.containerk8s.services.ngcloud.ru/nubes/nubes"
|
||||
version = "5.0.5" # Поставьте нужную вам версию провайдера
|
||||
source = "tf-registry.containerk8s.services.ngcloud.ru/{{NAMESPACE}}/nubes"
|
||||
version = "0.0.0" # автозамена на версию стенда при сборке (prod=1.x, dev=2.x, test=3.x)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
# Проверка решения бага Dev-генератора
|
||||
|
||||
Ты выполняешь короткий read-only review. Ничего не меняй, не запускай генерацию,
|
||||
не собирай и не публикуй провайдер.
|
||||
|
||||
## Задача
|
||||
|
||||
Проверь, правильно ли диагностирован баг и правильно ли предложено решение:
|
||||
|
||||
1. `create.jsonEnv` может быть nested (`sub_params`), а `modify.jsonEnv` — без
|
||||
`sub_params`.
|
||||
2. `Merge` формирует каноническую схему из параметров операций.
|
||||
3. `AlignParamTypes` выравнивает типы, но не переносит `HasSubParams/SubParams`,
|
||||
если у operation-параметра `HasSubParams` изначально false.
|
||||
4. Шаблон `Update` поэтому генерирует scalar-вызовы для поля, которое в модели
|
||||
является nested-структурой.
|
||||
5. Универсальное решение — нормализовать каждый набор operation params
|
||||
относительно канонической `SchemaParams`, рекурсивно наследуя структурные
|
||||
свойства, без условий по стенду или сервису.
|
||||
|
||||
## Прочитать только эти файлы
|
||||
|
||||
1. `TOOLS/resource-generator/internal/params/params.go`
|
||||
2. `TOOLS/resource-generator/internal/loader/loader.go`
|
||||
3. `TOOLS/resource-generator/internal/helpers/helpers.go` — только функции
|
||||
`IsNested` и связанные с nested-моделями
|
||||
4. `TOOLS/resource-generator/internal/templates/instance.go` — только участки
|
||||
`Update` и проверки `IsNested`
|
||||
5. `TOOLS/resource-generator/internal/types/types.go`
|
||||
6. `generated/dev/resources_yaml/95_nodejs.yaml` — только `jsonEnv` в create и modify
|
||||
7. `generated/dev/go/95_nodejs_resource.go` — только модель `JsonEnv` и `Update`
|
||||
|
||||
Не изучай остальные сервисы, стенды, историю проекта или API вне этих файлов.
|
||||
|
||||
## Формат ответа
|
||||
|
||||
Ответь максимум в 5 коротких пунктах:
|
||||
|
||||
- **Вердикт:** прав / частично прав / неправ.
|
||||
- **Доказательство:** одна конкретная цепочка от YAML до ошибочного Go-кода.
|
||||
- **Решение:** корректно ли выравнивать operation params по канонической схеме.
|
||||
- **Риск:** один главный риск предлагаемого решения.
|
||||
- **Итог:** что именно нужно изменить или что менять не следует.
|
||||
|
||||
Не предлагай реализацию, diff, рефакторинг или дополнительные исследования.
|
||||
Reference in New Issue
Block a user