From e1ed585e2a2f2e45508f3e4df725b525d6a600ba Mon Sep 17 00:00:00 2001 From: Michal Date: Sat, 21 Feb 2026 14:04:07 +0000 Subject: [PATCH] fix: improve release scripts with .env loading and idempotent publish Scripts now auto-load .env for GITEA_TOKEN, handle re-publishing by deleting existing versions first, and release.sh does build + publish + install in one command. Co-Authored-By: Claude Opus 4.6 --- package.json | 3 ++- scripts/build-rpm.sh | 6 +++++- scripts/publish-rpm.sh | 37 +++++++++++++++++++++++++++++-------- scripts/release.sh | 41 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+), 10 deletions(-) create mode 100755 scripts/release.sh diff --git a/package.json b/package.json index da018bc..3fcea89 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,8 @@ "db:down": "docker compose -f deploy/docker-compose.yml down", "typecheck": "tsc --build", "rpm:build": "bash scripts/build-rpm.sh", - "rpm:publish": "bash scripts/publish-rpm.sh" + "rpm:publish": "bash scripts/publish-rpm.sh", + "release": "bash scripts/release.sh" }, "engines": { "node": ">=20.0.0", diff --git a/scripts/build-rpm.sh b/scripts/build-rpm.sh index a81a1c5..7d90ec6 100755 --- a/scripts/build-rpm.sh +++ b/scripts/build-rpm.sh @@ -5,13 +5,17 @@ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" cd "$PROJECT_ROOT" -export VERSION="${VERSION:-0.1.0}" +# Load .env if present +if [ -f .env ]; then + set -a; source .env; set +a +fi echo "==> Building TypeScript..." pnpm build echo "==> Bundling standalone binary..." mkdir -p dist +rm -f dist/mcpctl dist/mcpctl-*.rpm bun build src/cli/src/index.ts --compile --outfile dist/mcpctl echo "==> Packaging RPM..." diff --git a/scripts/publish-rpm.sh b/scripts/publish-rpm.sh index 2966518..2be80f4 100755 --- a/scripts/publish-rpm.sh +++ b/scripts/publish-rpm.sh @@ -5,23 +5,44 @@ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" cd "$PROJECT_ROOT" +# Load .env if present +if [ -f .env ]; then + set -a; source .env; set +a +fi + GITEA_URL="${GITEA_URL:-http://10.0.0.194:3012}" GITEA_OWNER="${GITEA_OWNER:-michal}" if [ -z "$GITEA_TOKEN" ]; then - echo "Error: GITEA_TOKEN environment variable is required" - echo "Create one at: ${GITEA_URL}/user/settings/applications" + echo "Error: GITEA_TOKEN not set. Add it to .env or export it." exit 1 fi RPM_FILE=$(ls dist/mcpctl-*.rpm 2>/dev/null | head -1) if [ -z "$RPM_FILE" ]; then - echo "Error: No RPM file found in dist/. Run scripts/build-rpm.sh first." + echo "Error: No RPM found in dist/. Run scripts/build-rpm.sh first." exit 1 fi -echo "==> Publishing $RPM_FILE to ${GITEA_URL}..." -curl --fail -X PUT \ +# Get version string as it appears in Gitea (e.g. "0.1.0-1") +RPM_VERSION=$(rpm -qp --queryformat '%{VERSION}-%{RELEASE}' "$RPM_FILE") + +echo "==> Publishing $RPM_FILE (version $RPM_VERSION) to ${GITEA_URL}..." + +# Check if version already exists and delete it first +EXISTING=$(curl -s -o /dev/null -w "%{http_code}" \ + -H "Authorization: token ${GITEA_TOKEN}" \ + "${GITEA_URL}/api/v1/packages/${GITEA_OWNER}/rpm/mcpctl/${RPM_VERSION}") + +if [ "$EXISTING" = "200" ]; then + echo "==> Version $RPM_VERSION already exists, replacing..." + curl -s -o /dev/null -X DELETE \ + -H "Authorization: token ${GITEA_TOKEN}" \ + "${GITEA_URL}/api/v1/packages/${GITEA_OWNER}/rpm/mcpctl/${RPM_VERSION}" +fi + +# Upload +curl --fail -s -X PUT \ -H "Authorization: token ${GITEA_TOKEN}" \ --upload-file "$RPM_FILE" \ "${GITEA_URL}/api/packages/${GITEA_OWNER}/rpm/upload" @@ -29,6 +50,6 @@ curl --fail -X PUT \ echo "" echo "==> Published successfully!" echo "" -echo "Users can install with:" -echo " dnf config-manager --add-repo ${GITEA_URL}/api/packages/${GITEA_OWNER}/rpm.repo" -echo " dnf install mcpctl" +echo "Install with:" +echo " sudo dnf config-manager --add-repo ${GITEA_URL}/api/packages/${GITEA_OWNER}/rpm.repo" +echo " sudo dnf install mcpctl" diff --git a/scripts/release.sh b/scripts/release.sh new file mode 100755 index 0000000..ac84893 --- /dev/null +++ b/scripts/release.sh @@ -0,0 +1,41 @@ +#!/bin/bash +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" +cd "$PROJECT_ROOT" + +# Load .env if present +if [ -f .env ]; then + set -a; source .env; set +a +fi + +echo "=== mcpctl release ===" +echo "" + +# Build +bash scripts/build-rpm.sh + +echo "" + +# Publish +bash scripts/publish-rpm.sh + +echo "" + +# Install locally +echo "==> Installing locally..." +RPM_FILE=$(ls dist/mcpctl-*.rpm 2>/dev/null | head -1) +sudo rpm -U --force "$RPM_FILE" + +echo "" +echo "==> Installed:" +mcpctl --version +echo "" + +GITEA_URL="${GITEA_URL:-http://10.0.0.194:3012}" +GITEA_OWNER="${GITEA_OWNER:-michal}" +echo "=== Done! ===" +echo "Others can install with:" +echo " sudo dnf config-manager --add-repo ${GITEA_URL}/api/packages/${GITEA_OWNER}/rpm.repo" +echo " sudo dnf install mcpctl"