#!/usr/bin/env bash set -euo pipefail # Publish a single rendered docs page (or a small file set) to a specific docs version path. # # Usage examples: # ./scripts/publish-doc-page.sh \ # --profile devops/profiles/test \ # --version 5.0.17 \ # --page 30_registry/guides/getting-started/index.html # # ./scripts/publish-doc-page.sh \ # --profile devops/profiles/prod \ # --version 2.1.26 \ # --page 30_registry/guides/getting-started/ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/.." && pwd)}" PROFILE_DIR="" SITE_DIR="${ROOT_DIR}/site" PAGE_REL="" VERSION="" REGISTRY_HOST="${REGISTRY_HOST:-terra.k8c.ru}" NAMESPACE="${NAMESPACE:-nubes}" PROVIDER_NAME="${PROVIDER_NAME:-nubes}" S3CFG_REGISTRY="${S3CFG_REGISTRY:-${ROOT_DIR}/secrets/.s3cfg_registry}" usage() { cat <<'EOF' Usage: publish-doc-page.sh --profile --version --page [--site-dir ] Required: --profile Path to stand profile dir (e.g. devops/profiles/test) --version Docs version (e.g. 5.0.17) --page Relative path inside built site dir, e.g.: 30_registry/guides/getting-started/index.html 30_registry/guides/getting-started/ (auto -> index.html) Optional: --site-dir Built MkDocs site directory (default: /site) Behavior: Uploads exactly one file to: docs//// in S3 bucket terraform-registry. EOF } resolve_root_path() { local path_value="$1" if [[ -z "$path_value" ]]; then echo "" return fi if [[ "$path_value" = /* ]]; then echo "$path_value" return fi echo "${ROOT_DIR}/${path_value}" } load_s3cfg_registry() { local cfg="$1" if [[ ! -f "$cfg" ]]; then echo "Error: S3 config not found: $cfg" >&2 exit 2 fi local access_key secret_key host_base use_https endpoint access_key=$(awk -F '=' '/^\s*access_key\s*=/ {gsub(/^[ \t]+|[ \t]+$/, "", $2); print $2; exit}' "$cfg") secret_key=$(awk -F '=' '/^\s*secret_key\s*=/ {gsub(/^[ \t]+|[ \t]+$/, "", $2); print $2; exit}' "$cfg") host_base=$(awk -F '=' '/^\s*host_base\s*=/ {gsub(/^[ \t]+|[ \t]+$/, "", $2); print $2; exit}' "$cfg") use_https=$(awk -F '=' '/^\s*use_https\s*=/ {gsub(/^[ \t]+|[ \t]+$/, "", $2); print tolower($2); exit}' "$cfg") if [[ -z "${S3_ACCESS_KEY:-}" && -n "$access_key" ]]; then export S3_ACCESS_KEY="$access_key" fi if [[ -z "${S3_SECRET_KEY:-}" && -n "$secret_key" ]]; then export S3_SECRET_KEY="$secret_key" fi if [[ -z "${S3_ENDPOINT:-}" && -n "$host_base" ]]; then if [[ "$host_base" == http* ]]; then endpoint="$host_base" else if [[ "$use_https" == "false" || "$use_https" == "0" || "$use_https" == "no" ]]; then endpoint="http://${host_base}" else endpoint="https://${host_base}" fi fi export S3_ENDPOINT="$endpoint" fi if [[ -z "${S3_ENDPOINT:-}" || -z "${S3_ACCESS_KEY:-}" || -z "${S3_SECRET_KEY:-}" ]]; then echo "Error: S3 credentials are not set (S3_ENDPOINT/S3_ACCESS_KEY/S3_SECRET_KEY)" >&2 exit 2 fi } while [[ $# -gt 0 ]]; do case "$1" in --profile) PROFILE_DIR="${2:-}" shift 2 ;; --version) VERSION="${2:-}" shift 2 ;; --page) PAGE_REL="${2:-}" shift 2 ;; --site-dir) SITE_DIR="${2:-}" shift 2 ;; -h|--help) usage exit 0 ;; *) echo "Error: unknown argument: $1" >&2 usage exit 2 ;; esac done if [[ -z "$PROFILE_DIR" || -z "$VERSION" || -z "$PAGE_REL" ]]; then echo "Error: --profile, --version and --page are required" >&2 usage exit 2 fi PROFILE_DIR="$(resolve_root_path "$PROFILE_DIR")" SITE_DIR="$(resolve_root_path "$SITE_DIR")" S3CFG_REGISTRY="$(resolve_root_path "$S3CFG_REGISTRY")" if [[ ! -d "$PROFILE_DIR" ]]; then echo "Error: profile directory not found: $PROFILE_DIR" >&2 exit 2 fi PROFILE_ENV_FILE="${PROFILE_DIR}/profile.env" if [[ -f "$PROFILE_ENV_FILE" ]]; then set -a # shellcheck disable=SC1090 source "$PROFILE_ENV_FILE" set +a fi # Re-apply defaults from profile if provided REGISTRY_HOST="${REGISTRY_HOSTNAME:-${REGISTRY_HOST:-$REGISTRY_HOST}}" NAMESPACE="${NAMESPACE:-$NAMESPACE}" PROVIDER_NAME="${PROVIDER_NAME:-$PROVIDER_NAME}" if [[ -n "${S3CFG_REGISTRY:-}" ]]; then S3CFG_REGISTRY="$(resolve_root_path "${S3CFG_REGISTRY}")" fi if [[ ! -d "$SITE_DIR" ]]; then echo "Error: site dir not found: $SITE_DIR" >&2 exit 2 fi page="${PAGE_REL#/}" if [[ "$page" == */ ]]; then page="${page}index.html" fi if [[ "$page" != *.html && "$page" != *.xml && "$page" != *.txt && "$page" != *.json && "$page" != *.css && "$page" != *.js ]]; then # convenience: if user passed folder-like path without trailing slash if [[ -f "$SITE_DIR/${page}/index.html" ]]; then page="${page}/index.html" fi fi SOURCE_FILE="${SITE_DIR}/${page}" if [[ ! -f "$SOURCE_FILE" ]]; then echo "Error: page file not found: $SOURCE_FILE" >&2 exit 2 fi load_s3cfg_registry "$S3CFG_REGISTRY" MC_ALIAS="registry" mc alias set "$MC_ALIAS" "$S3_ENDPOINT" "$S3_ACCESS_KEY" "$S3_SECRET_KEY" --api S3v4 >/dev/null TARGET="${MC_ALIAS}/terraform-registry/docs/${NAMESPACE}/${PROVIDER_NAME}/${VERSION}/${page}" mc cp "$SOURCE_FILE" "$TARGET" PUBLIC_TARGET="${MC_ALIAS}/terraform-registry/docs/${NAMESPACE}/${PROVIDER_NAME}/${VERSION}/" mc policy set public "$PUBLIC_TARGET" >/dev/null || true echo "Published single page: https://${REGISTRY_HOST}/docs/${NAMESPACE}/${PROVIDER_NAME}/${VERSION}/${page}"