Files
kiddo/scripts/upload_release.sh
2026-01-15 17:24:54 +01:00

161 lines
4.7 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
ADDON_ENV_FILE="${ADDON_ENV_FILE:-${PROJECT_ROOT}/update-addon.env}"
PROFILE="${PROFILE:-dev}"
SERVICE_URL=""
PROJECT_ID=""
UPLOAD_TOKEN=""
UPLOAD_TOKEN_FILE=""
VERSION=""
ARTIFACT_PATH=""
VERBOSE="${VERBOSE:-0}"
log() {
if [[ "${VERBOSE}" == "1" ]]; then
echo "[upload_release] $*"
fi
}
usage() {
cat <<'EOF'
Usage: upload_release.sh [options]
Options:
--service-url URL Update-Service URL (overrides env)
--project-id ID Project ID (overrides env)
--token TOKEN Upload token (overrides env)
--token-file PATH Upload token file (overrides env)
--profile NAME Environment profile: dev|stage|prod (default: dev)
--addon-env PATH Addon env file (default: ./update-addon.env)
--verbose Enable debug logging
--artifact PATH Use existing tar.gz artifact instead of building
--version VERSION Override VERSION file
-h, --help Show this help
EOF
}
read_env_value() {
local key="$1"
python3 - <<'PY' "${ADDON_ENV_FILE}" "${key}"
from pathlib import Path
import sys
env_paths = [Path(sys.argv[1])]
key = sys.argv[2]
for path in env_paths:
if not path.exists():
continue
try:
lines = path.read_text(encoding="utf-8").splitlines()
except OSError:
continue
for raw in lines:
line = raw.strip()
if not line or line.startswith("#"):
continue
if not line.startswith(f"{key}="):
continue
value = line.split("=", 1)[1].strip()
if (value.startswith('"') and value.endswith('"')) or (value.startswith("'") and value.endswith("'")):
value = value[1:-1]
print(value)
sys.exit(0)
PY
}
while [[ $# -gt 0 ]]; do
case "$1" in
--service-url) SERVICE_URL="$2"; shift 2 ;;
--project-id) PROJECT_ID="$2"; shift 2 ;;
--token) UPLOAD_TOKEN="$2"; shift 2 ;;
--token-file) UPLOAD_TOKEN_FILE="$2"; shift 2 ;;
--profile) PROFILE="$2"; shift 2 ;;
--addon-env) ADDON_ENV_FILE="$2"; shift 2 ;;
--verbose) VERBOSE="1"; shift 1 ;;
--artifact) ARTIFACT_PATH="$2"; shift 2 ;;
--version) VERSION="$2"; shift 2 ;;
-h|--help) usage; exit 0 ;;
*) echo "Unknown option: $1" >&2; usage; exit 1 ;;
esac
done
PROFILE_UPPER="$(printf '%s' "${PROFILE}" | tr '[:lower:]' '[:upper:]')"
SERVICE_URL="${SERVICE_URL:-$(read_env_value "${PROFILE_UPPER}_UPDATE_SERVICE_URL")}"
PROJECT_ID="${PROJECT_ID:-$(read_env_value "${PROFILE_UPPER}_UPDATE_PROJECT_ID")}"
UPLOAD_TOKEN="${UPLOAD_TOKEN:-$(read_env_value "${PROFILE_UPPER}_UPDATE_UPLOAD_TOKEN")}"
UPLOAD_TOKEN_FILE="${UPLOAD_TOKEN_FILE:-$(read_env_value "${PROFILE_UPPER}_UPDATE_UPLOAD_TOKEN_FILE")}"
VERSION="${VERSION:-$(cat "${PROJECT_ROOT}/VERSION" 2>/dev/null || true)}"
log "Profile: ${PROFILE}"
log "Addon env: ${ADDON_ENV_FILE}"
log "Service URL: ${SERVICE_URL}"
log "Project ID: ${PROJECT_ID}"
log "Version: ${VERSION}"
if [[ -z "${SERVICE_URL}" || -z "${PROJECT_ID}" ]]; then
echo "Missing service URL or project ID." >&2
echo "Set SKD_UPDATE_SERVICE_URL and SKD_UPDATE_PROJECT_ID or pass --service-url/--project-id." >&2
exit 1
fi
if [[ -z "${VERSION}" ]]; then
echo "Missing VERSION." >&2
exit 1
fi
if [[ -z "${UPLOAD_TOKEN}" && -n "${UPLOAD_TOKEN_FILE}" && -f "${UPLOAD_TOKEN_FILE}" ]]; then
UPLOAD_TOKEN="$(cat "${UPLOAD_TOKEN_FILE}" | tr -d '\n')"
fi
if [[ -n "${UPLOAD_TOKEN_FILE}" ]]; then
log "Upload token file: ${UPLOAD_TOKEN_FILE}"
fi
if [[ -z "${UPLOAD_TOKEN}" ]]; then
echo "Missing upload token. Provide --token or SKD_UPDATE_UPLOAD_TOKEN[_FILE]." >&2
exit 1
fi
if [[ -z "${ARTIFACT_PATH}" ]]; then
log "Building artifact..."
ARTIFACT_PATH="$(mktemp "/tmp/sk_release_${VERSION}.XXXXXX.tar.gz")"
tar czf "${ARTIFACT_PATH}" \
--exclude '.git' \
--exclude '.venv' \
--exclude 'upload.token' \
-C "${PROJECT_ROOT}" .
fi
if [[ ! -f "${ARTIFACT_PATH}" ]]; then
echo "Artifact not found: ${ARTIFACT_PATH}" >&2
exit 1
fi
SHA256="$(sha256sum "${ARTIFACT_PATH}" | awk '{print $1}')"
log "Artifact: ${ARTIFACT_PATH}"
log "SHA256: ${SHA256}"
UPLOAD_URL="${SERVICE_URL%/}/v1/projects/${PROJECT_ID}/releases"
log "Upload URL: ${UPLOAD_URL}"
response_file="$(mktemp)"
trap 'rm -f "${response_file}"' EXIT
http_code=$(curl -sS -o "${response_file}" -w '%{http_code}' \
-X POST "${UPLOAD_URL}" \
-H "Authorization: Bearer ${UPLOAD_TOKEN}" \
-F "version=${VERSION}" \
-F "sha256=${SHA256}" \
-F "artifact=@${ARTIFACT_PATH}")
if [[ "${http_code}" != "201" && "${http_code}" != "200" ]]; then
echo "Upload failed (HTTP ${http_code}). Response:" >&2
cat "${response_file}" >&2
exit 1
fi
echo "Upload finished: version=${VERSION} sha256=${SHA256}"