From f32159b3af23ecc6c59bf8393c41b5d57ca998fa Mon Sep 17 00:00:00 2001 From: Repinoid Date: Sun, 20 Sep 2026 20:00:34 +0300 Subject: [PATCH] fix: publish generated providers to working registry --- PLAN_regenerate_providers_0.0.1.md | 8 +-- TOOLS/config/registry.env | 2 +- TOOLS/scripts/01_generate_yamls.sh | 2 +- .../02_generate_resources_and_docs_v2.sh | 15 ++++- TOOLS/scripts/03_build_and_upload_provider.sh | 5 +- TOOLS/scripts/build-provider.sh | 2 +- docs/help/build-and-publish.md | 60 +++++++++++++++++++ 7 files changed, 84 insertions(+), 10 deletions(-) diff --git a/PLAN_regenerate_providers_0.0.1.md b/PLAN_regenerate_providers_0.0.1.md index 811962c..b2a3aba 100644 --- a/PLAN_regenerate_providers_0.0.1.md +++ b/PLAN_regenerate_providers_0.0.1.md @@ -53,16 +53,16 @@ cd /home/naeel/TF/tf_provider | Стенд | 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/` | +| dev | `nubes-dev` | `terraform-registry/tf-registry.containerk8s.services.ngcloud.ru/nubes-dev/nubes/0.0.1/` | +| test | `nubes-test` | `terraform-registry/tf-registry.containerk8s.services.ngcloud.ru/nubes-test/nubes/0.0.1/` | +| prod | `nubes` | `terraform-registry/tf-registry.containerk8s.services.ngcloud.ru/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`. +- `registry.env`: `REGISTRY_HOSTNAME=tf-registry.containerk8s.services.ngcloud.ru`, `S3_BUCKET=terraform-registry`. ## Чего НЕ делать - НЕ запускать `04_build_and_publish_docs.sh` (документация не нужна сейчас). diff --git a/TOOLS/config/registry.env b/TOOLS/config/registry.env index 15c5b40..704eafa 100644 --- a/TOOLS/config/registry.env +++ b/TOOLS/config/registry.env @@ -1,5 +1,5 @@ # Единый реестр Terraform-провайдеров — независим от стенда. # Подгружается скриптами вместе с profile.env. REGISTRY_HOSTNAME="tf-registry.containerk8s.services.ngcloud.ru" -S3_BUCKET="nubes-terraform-registry" +S3_BUCKET="terraform-registry" S3_ENDPOINT="https://s3.msk-1.ngcloud.ru" diff --git a/TOOLS/scripts/01_generate_yamls.sh b/TOOLS/scripts/01_generate_yamls.sh index d9c216b..8d39e5c 100755 --- a/TOOLS/scripts/01_generate_yamls.sh +++ b/TOOLS/scripts/01_generate_yamls.sh @@ -141,7 +141,7 @@ rm -f "$FAILURES_FILE" # Auto-rebuild yaml-generator if sources are newer than binary BIN="${ROOT_DIR}/TOOLS/bin/yaml-generator" SRC="${ROOT_DIR}/TOOLS/yaml-generator/" -if [[ ! -x "$BIN" ]] || [[ "$SRC" -nt "$BIN" ]]; then +if [[ ! -x "$BIN" ]] || find "$SRC" -type f -newer "$BIN" -print -quit | grep -q .; then echo "Building yaml-generator..." (cd "${ROOT_DIR}/TOOLS/yaml-generator" && go build -o "$BIN" .) fi diff --git a/TOOLS/scripts/02_generate_resources_and_docs_v2.sh b/TOOLS/scripts/02_generate_resources_and_docs_v2.sh index 11d3833..49d2b6e 100755 --- a/TOOLS/scripts/02_generate_resources_and_docs_v2.sh +++ b/TOOLS/scripts/02_generate_resources_and_docs_v2.sh @@ -93,9 +93,20 @@ echo "Generating resources from unified YAML specs..." TMP_GEN_DIR="$(mktemp -d)" trap 'rm -rf "$TMP_GEN_DIR"' EXIT +RESOURCE_GENERATOR_BIN="${ROOT_DIR}/TOOLS/bin/resource-generator" +RESOURCE_GENERATOR_SRC="${ROOT_DIR}/TOOLS/resource-generator" +DOCS_GENERATOR_BIN="${ROOT_DIR}/TOOLS/bin/docs-generator" +DOCS_GENERATOR_SRC="${ROOT_DIR}/TOOLS/docs-generator" +if [[ ! -x "$RESOURCE_GENERATOR_BIN" ]] || find "$RESOURCE_GENERATOR_SRC" -type f -newer "$RESOURCE_GENERATOR_BIN" -print -quit | grep -q .; then + (cd "$RESOURCE_GENERATOR_SRC" && go build -o "$RESOURCE_GENERATOR_BIN" .) +fi +if [[ ! -x "$DOCS_GENERATOR_BIN" ]] || find "$DOCS_GENERATOR_SRC" -type f -newer "$DOCS_GENERATOR_BIN" -print -quit | grep -q .; then + (cd "$DOCS_GENERATOR_SRC" && go build -o "$DOCS_GENERATOR_BIN" .) +fi + NUBES_RESOURCES_DIR="$RESOURCES_YAML_DIR" \ NUBES_RESOURCES_GEN_DIR="$TMP_GEN_DIR" \ -${ROOT_DIR}/TOOLS/bin/resource-generator +"$RESOURCE_GENERATOR_BIN" mkdir -p "$GO_OUTPUT_DIR" rm -rf "${GO_OUTPUT_DIR}"/* @@ -113,7 +124,7 @@ if [[ "$DOCS_API_ENDPOINT" != *"/index.cfm"* ]] && [[ "$DOCS_API_ENDPOINT" != *" DOCS_API_ENDPOINT="${DOCS_API_ENDPOINT%/}/index.cfm" fi -${ROOT_DIR}/TOOLS/bin/docs-generator \ +"$DOCS_GENERATOR_BIN" \ -resources "$RESOURCES_YAML_DIR" \ -docs "$DOCS_DIR" \ -services "$SERVICES_LIST_PATH" \ diff --git a/TOOLS/scripts/03_build_and_upload_provider.sh b/TOOLS/scripts/03_build_and_upload_provider.sh index ad021d1..7362092 100755 --- a/TOOLS/scripts/03_build_and_upload_provider.sh +++ b/TOOLS/scripts/03_build_and_upload_provider.sh @@ -38,6 +38,9 @@ if [[ -z "$PROFILE_DIR" ]]; then exit 2 fi +"${ROOT_DIR}/TOOLS/scripts/01_generate_yamls.sh" --profile "$PROFILE_DIR" +"${ROOT_DIR}/TOOLS/scripts/02_generate_resources_and_docs_v2.sh" --profile "$PROFILE_DIR" + resolve_root_path() { local path_value="$1" if [[ -z "$path_value" ]]; then @@ -153,7 +156,7 @@ validate_registry_completeness() { tmp_registered="$(mktemp)" tmp_missing="$(mktemp)" - find "$resources_gen_dir" -maxdepth 1 -type f -name '*_resource.go' -print0 \ + find "$resources_gen_dir" -maxdepth 1 -type f \( -name '*_resource.go' -o -name '*_modifier.go' -o -name '*_action.go' \) -print0 \ | xargs -0 grep -hE 'func[[:space:]]+New[[:alnum:]_]+Resource[[:space:]]*\(' \ | sed -E 's/.*(New[[:alnum:]_]+Resource).*/\1/' \ | sort -u > "$tmp_expected" diff --git a/TOOLS/scripts/build-provider.sh b/TOOLS/scripts/build-provider.sh index eef8704..c699a1d 100755 --- a/TOOLS/scripts/build-provider.sh +++ b/TOOLS/scripts/build-provider.sh @@ -37,7 +37,7 @@ VERSION="${1:-2.0.2}" REGISTRY_HOSTNAME="${REGISTRY_HOSTNAME:-tf-registry.containerk8s.services.ngcloud.ru}" NAMESPACE="${NAMESPACE:-nubes}" PROVIDER_NAME="${PROVIDER_NAME:-nubes}" -S3_BUCKET="${S3_BUCKET:-nubes-terraform-registry}" +S3_BUCKET="${S3_BUCKET:-terraform-registry}" S3_ENDPOINT="${S3_ENDPOINT:-https://s3.msk-1.ngcloud.ru}" S3_ACCESS_KEY="${S3_ACCESS_KEY:-}" diff --git a/docs/help/build-and-publish.md b/docs/help/build-and-publish.md index eebb000..c332efe 100644 --- a/docs/help/build-and-publish.md +++ b/docs/help/build-and-publish.md @@ -17,6 +17,66 @@ - Хранилище: S3 bucket terraform-registry - Префикс: docs//// для документации, отдельный префикс для бинарников по правилам registry-сервера +### Канонический provider release workflow + +Рабочий registry для provider-бинарников использует: + +- Registry hostname: `tf-registry.containerk8s.services.ngcloud.ru`; +- S3 endpoint: `https://s3.msk-1.ngcloud.ru`; +- S3 bucket: `terraform-registry`; +- DEV namespace: `nubes-dev`; +- Provider name: `nubes`. + +Для DEV version `2.0.1` полный путь бинарников: + +```text +terraform-registry/tf-registry.containerk8s.services.ngcloud.ru/nubes-dev/nubes/2.0.1/ +``` + +Публикация выполняется из корня репозитория одной командой: + +```bash +cd /home/naeel/TF/tf_provider +REQUEST_DELAY=0.05 ATTEMPTS=3 \ + ./TOOLS/scripts/03_build_and_upload_provider.sh \ + --profile TOOLS/config/dev 2.0.1 +``` + +`03_build_and_upload_provider.sh` перед сборкой автоматически запускает `01` и `02`, поэтому отдельно запускать генераторы для обычного release не требуется. В результате создаются: + +- `generated/dev/resources_yaml/` — актуальные YAML из DEV API; +- `generated/dev/go/` — generated Go, включая `*_modifier.go` и `registry.go`; +- `generated/dev/docs/` — generated docs; +- `generated/dev/provider_build/` — три ZIP, `SHA256SUMS` и `SHA256SUMS.sig`. + +Перед upload скрипт проверяет, что каждый constructor из resource/modifier/action-файлов присутствует в `registry.go`, затем собирает provider для `linux/amd64`, `windows/amd64` и `darwin/amd64`. + +### Credentials и VM + +S3 credentials не хранятся в `registry.env` и не должны попадать в командную строку или документацию. Источники рабочего ключа: + +- локально: `secrets/.s3cfg_registry`; +- на VM `5.172.178.213`: `/home/naeel/.mc/config.json`; +- SSH-ключ к VM: `~/.ssh/naeel_vm_id_ed25519`. + +VM использовалась для прежних публикаций и содержит aliases `registry`, `reg`, `tfreg` и `nubes`. Проверка bucket без вывода секретов: + +```bash +mc ls registry/terraform-registry +``` + +Нельзя заменять bucket на `nubes-terraform-registry`: у рабочего ключа нет прав на этот bucket. Симптом ошибки — `Insufficient permissions to access this path` на стадии `mc cp`; сборка provider при этом уже может быть успешной. + +### Контроль успешной публикации + +Успех подтверждается только после всех трёх условий: + +1. В выводе есть `Done. Version uploaded.` и exit code `0`. +2. В `generated//provider_build/` присутствуют ZIP, `SHA256SUMS` и `.sig`. +3. Объекты видны в точном S3 prefix через `mc ls`. + +Если публикация прервалась во время `01`, повторный запуск безопасен: он только читает service specs из API и перезаписывает generated YAML. Terraform apply, modify и delete для публикации не запускаются. + ### Важное про GPG ключи - Приватный ключ должен быть стабильным между релизами. - Если ключ перевыпущен, обнови публичный ключ в registry server (ASCII Armor в `registry-server-build/main.go` и `operator/cmd/registry/main.go`) и задеплой сервис.