197 lines
5.5 KiB
Bash
Executable File
197 lines
5.5 KiB
Bash
Executable File
#!/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 <path> --version <ver> --page <relative-path> [--site-dir <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: <repo>/site)
|
|
|
|
Behavior:
|
|
Uploads exactly one file to:
|
|
docs/<namespace>/<provider>/<version>/<page>
|
|
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}"
|