127 lines
4.0 KiB
Bash
Executable File
127 lines
4.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
ENV_FILE="${ENV_FILE:-/etc/skd/env}"
|
|
UPDATE_ENV_FILE="${UPDATE_ENV_FILE:-/etc/skd/update.env}"
|
|
|
|
SERVICE_URL="${SKD_UPDATE_SERVICE_URL:-}"
|
|
PROJECT_ID="${SKD_UPDATE_PROJECT_ID:-}"
|
|
UPLOAD_TOKEN="${SKD_UPDATE_UPLOAD_TOKEN:-}"
|
|
UPLOAD_TOKEN_FILE="${SKD_UPDATE_UPLOAD_TOKEN_FILE:-${PROJECT_ROOT}/upload.token}"
|
|
VERSION=""
|
|
ARTIFACT_PATH=""
|
|
|
|
usage() {
|
|
cat <<'EOF'
|
|
Usage: upload_release.sh [options]
|
|
|
|
Options:
|
|
--service-url URL Update-Service URL (default: SKD_UPDATE_SERVICE_URL)
|
|
--project-id ID Project ID (default: SKD_UPDATE_PROJECT_ID)
|
|
--token TOKEN Upload token (default: SKD_UPDATE_UPLOAD_TOKEN)
|
|
--token-file PATH Upload token file (default: ./upload.token or SKD_UPDATE_UPLOAD_TOKEN_FILE)
|
|
--artifact PATH Use existing tar.gz artifact instead of building
|
|
--version VERSION Override VERSION file
|
|
--env-file PATH Read core env file (default: /etc/skd/env)
|
|
--update-env PATH Read update env file (default: /etc/skd/update.env)
|
|
-h, --help Show this help
|
|
EOF
|
|
}
|
|
|
|
read_env_value() {
|
|
local key="$1"
|
|
python3 - <<'PY' "${ENV_FILE}" "${UPDATE_ENV_FILE}" "${key}"
|
|
from pathlib import Path
|
|
import sys
|
|
|
|
env_paths = [Path(sys.argv[1]), Path(sys.argv[2])]
|
|
key = sys.argv[3]
|
|
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 ;;
|
|
--artifact) ARTIFACT_PATH="$2"; shift 2 ;;
|
|
--version) VERSION="$2"; shift 2 ;;
|
|
--env-file) ENV_FILE="$2"; shift 2 ;;
|
|
--update-env) UPDATE_ENV_FILE="$2"; shift 2 ;;
|
|
-h|--help) usage; exit 0 ;;
|
|
*) echo "Unknown option: $1" >&2; usage; exit 1 ;;
|
|
esac
|
|
done
|
|
|
|
SERVICE_URL="${SERVICE_URL:-$(read_env_value SKD_UPDATE_SERVICE_URL)}"
|
|
PROJECT_ID="${PROJECT_ID:-$(read_env_value SKD_UPDATE_PROJECT_ID)}"
|
|
UPLOAD_TOKEN="${UPLOAD_TOKEN:-$(read_env_value SKD_UPDATE_UPLOAD_TOKEN)}"
|
|
UPLOAD_TOKEN_FILE="${UPLOAD_TOKEN_FILE:-$(read_env_value SKD_UPDATE_UPLOAD_TOKEN_FILE)}"
|
|
VERSION="${VERSION:-$(cat "${PROJECT_ROOT}/VERSION" 2>/dev/null || true)}"
|
|
|
|
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 [[ -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
|
|
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}')"
|
|
|
|
UPLOAD_URL="${SERVICE_URL%/}/v1/projects/${PROJECT_ID}/releases"
|
|
|
|
curl -fsS -X POST "${UPLOAD_URL}" \
|
|
-H "Authorization: Bearer ${UPLOAD_TOKEN}" \
|
|
-F "version=${VERSION}" \
|
|
-F "sha256=${SHA256}" \
|
|
-F "artifact=@${ARTIFACT_PATH}"
|
|
|
|
echo "Upload finished: version=${VERSION} sha256=${SHA256}"
|