fix: publish generated providers to working registry
This commit is contained in:
@@ -53,16 +53,16 @@ cd /home/naeel/TF/tf_provider
|
|||||||
|
|
||||||
| Стенд | Namespace | Бинарники в S3 |
|
| Стенд | Namespace | Бинарники в S3 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| dev | `nubes-dev` | `nubes-terraform-registry/tf-registry.containerk8s.services.ngcloud.ru/nubes-dev/nubes/0.0.1/` |
|
| dev | `nubes-dev` | `terraform-registry/tf-registry.containerk8s.services.ngcloud.ru/nubes-dev/nubes/0.0.1/` |
|
||||||
| test | `nubes-test` | `.../nubes-test/nubes/0.0.1/` |
|
| test | `nubes-test` | `terraform-registry/tf-registry.containerk8s.services.ngcloud.ru/nubes-test/nubes/0.0.1/` |
|
||||||
| prod | `nubes` | `.../nubes/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`).
|
- Go 1.23.1, docker 29.1.3, `mc`, GPG (`secrets/private_key.asc`, `public_key.asc`).
|
||||||
- Токены API: `secrets/{dev,test,prod}.token` на месте.
|
- Токены API: `secrets/{dev,test,prod}.token` на месте.
|
||||||
- API-эндпоинты доступны (HTTP 403 без токена — ожидаемо, токен передаёт 01).
|
- API-эндпоинты доступны (HTTP 403 без токена — ожидаемо, токен передаёт 01).
|
||||||
- `TOOLS/config/<стенд>/operation_timeouts.json` на месте.
|
- `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` (документация не нужна сейчас).
|
- НЕ запускать `04_build_and_publish_docs.sh` (документация не нужна сейчас).
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Единый реестр Terraform-провайдеров — независим от стенда.
|
# Единый реестр Terraform-провайдеров — независим от стенда.
|
||||||
# Подгружается скриптами вместе с profile.env.
|
# Подгружается скриптами вместе с profile.env.
|
||||||
REGISTRY_HOSTNAME="tf-registry.containerk8s.services.ngcloud.ru"
|
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"
|
S3_ENDPOINT="https://s3.msk-1.ngcloud.ru"
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ rm -f "$FAILURES_FILE"
|
|||||||
# Auto-rebuild yaml-generator if sources are newer than binary
|
# Auto-rebuild yaml-generator if sources are newer than binary
|
||||||
BIN="${ROOT_DIR}/TOOLS/bin/yaml-generator"
|
BIN="${ROOT_DIR}/TOOLS/bin/yaml-generator"
|
||||||
SRC="${ROOT_DIR}/TOOLS/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..."
|
echo "Building yaml-generator..."
|
||||||
(cd "${ROOT_DIR}/TOOLS/yaml-generator" && go build -o "$BIN" .)
|
(cd "${ROOT_DIR}/TOOLS/yaml-generator" && go build -o "$BIN" .)
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -93,9 +93,20 @@ echo "Generating resources from unified YAML specs..."
|
|||||||
TMP_GEN_DIR="$(mktemp -d)"
|
TMP_GEN_DIR="$(mktemp -d)"
|
||||||
trap 'rm -rf "$TMP_GEN_DIR"' EXIT
|
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_DIR="$RESOURCES_YAML_DIR" \
|
||||||
NUBES_RESOURCES_GEN_DIR="$TMP_GEN_DIR" \
|
NUBES_RESOURCES_GEN_DIR="$TMP_GEN_DIR" \
|
||||||
${ROOT_DIR}/TOOLS/bin/resource-generator
|
"$RESOURCE_GENERATOR_BIN"
|
||||||
|
|
||||||
mkdir -p "$GO_OUTPUT_DIR"
|
mkdir -p "$GO_OUTPUT_DIR"
|
||||||
rm -rf "${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"
|
DOCS_API_ENDPOINT="${DOCS_API_ENDPOINT%/}/index.cfm"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
${ROOT_DIR}/TOOLS/bin/docs-generator \
|
"$DOCS_GENERATOR_BIN" \
|
||||||
-resources "$RESOURCES_YAML_DIR" \
|
-resources "$RESOURCES_YAML_DIR" \
|
||||||
-docs "$DOCS_DIR" \
|
-docs "$DOCS_DIR" \
|
||||||
-services "$SERVICES_LIST_PATH" \
|
-services "$SERVICES_LIST_PATH" \
|
||||||
|
|||||||
@@ -38,6 +38,9 @@ if [[ -z "$PROFILE_DIR" ]]; then
|
|||||||
exit 2
|
exit 2
|
||||||
fi
|
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() {
|
resolve_root_path() {
|
||||||
local path_value="$1"
|
local path_value="$1"
|
||||||
if [[ -z "$path_value" ]]; then
|
if [[ -z "$path_value" ]]; then
|
||||||
@@ -153,7 +156,7 @@ validate_registry_completeness() {
|
|||||||
tmp_registered="$(mktemp)"
|
tmp_registered="$(mktemp)"
|
||||||
tmp_missing="$(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:]]*\(' \
|
| xargs -0 grep -hE 'func[[:space:]]+New[[:alnum:]_]+Resource[[:space:]]*\(' \
|
||||||
| sed -E 's/.*(New[[:alnum:]_]+Resource).*/\1/' \
|
| sed -E 's/.*(New[[:alnum:]_]+Resource).*/\1/' \
|
||||||
| sort -u > "$tmp_expected"
|
| sort -u > "$tmp_expected"
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ VERSION="${1:-2.0.2}"
|
|||||||
REGISTRY_HOSTNAME="${REGISTRY_HOSTNAME:-tf-registry.containerk8s.services.ngcloud.ru}"
|
REGISTRY_HOSTNAME="${REGISTRY_HOSTNAME:-tf-registry.containerk8s.services.ngcloud.ru}"
|
||||||
NAMESPACE="${NAMESPACE:-nubes}"
|
NAMESPACE="${NAMESPACE:-nubes}"
|
||||||
PROVIDER_NAME="${PROVIDER_NAME:-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_ENDPOINT="${S3_ENDPOINT:-https://s3.msk-1.ngcloud.ru}"
|
||||||
S3_ACCESS_KEY="${S3_ACCESS_KEY:-}"
|
S3_ACCESS_KEY="${S3_ACCESS_KEY:-}"
|
||||||
|
|||||||
@@ -17,6 +17,66 @@
|
|||||||
- Хранилище: S3 bucket terraform-registry
|
- Хранилище: S3 bucket terraform-registry
|
||||||
- Префикс: docs/<namespace>/<name>/<version>/ для документации, отдельный префикс для бинарников по правилам registry-сервера
|
- Префикс: docs/<namespace>/<name>/<version>/ для документации, отдельный префикс для бинарников по правилам 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 <version> uploaded.` и exit code `0`.
|
||||||
|
2. В `generated/<stand>/provider_build/` присутствуют ZIP, `SHA256SUMS` и `.sig`.
|
||||||
|
3. Объекты видны в точном S3 prefix через `mc ls`.
|
||||||
|
|
||||||
|
Если публикация прервалась во время `01`, повторный запуск безопасен: он только читает service specs из API и перезаписывает generated YAML. Terraform apply, modify и delete для публикации не запускаются.
|
||||||
|
|
||||||
### Важное про GPG ключи
|
### Важное про GPG ключи
|
||||||
- Приватный ключ должен быть стабильным между релизами.
|
- Приватный ключ должен быть стабильным между релизами.
|
||||||
- Если ключ перевыпущен, обнови публичный ключ в registry server (ASCII Armor в `registry-server-build/main.go` и `operator/cmd/registry/main.go`) и задеплой сервис.
|
- Если ключ перевыпущен, обнови публичный ключ в registry server (ASCII Armor в `registry-server-build/main.go` и `operator/cmd/registry/main.go`) и задеплой сервис.
|
||||||
|
|||||||
Reference in New Issue
Block a user