diff --git a/.build/prod/release.sh b/.build/prod/release.sh index 53fb6d1..37efc47 100755 --- a/.build/prod/release.sh +++ b/.build/prod/release.sh @@ -1,11 +1,12 @@ #!/usr/bin/env bash # -# Create a Gitea release and upload everything in out/. -# Mirrors the repo's existing Gitea-API release convention. +# Publish a NEW Gitea release for this build and upload everything in out/. +# Never deletes existing releases/tags - each build gets its own tag. # # Config via env (or a local .env next to this script): # GITEA_SERVER_URL, GITEA_REPOSITORY, PAT_GITEA -# Tag: $1 if given, else the tag on HEAD, else derived as v-. +# Tag: $1 if given, else derived as v- +# (a build suffix is appended if that tag already exists). # set -euo pipefail cd "$(dirname "$0")" @@ -18,36 +19,49 @@ cd "$(dirname "$0")" : "${PAT_GITEA:?}" ROOT="$(git rev-parse --show-toplevel)" +SHA="$(git rev-parse HEAD)" +SHORT="$(git rev-parse --short HEAD)" +OUT_DIR="$(pwd)/out" +REPO_API="${GITEA_SERVER_URL}/api/v1/repos/${GITEA_REPOSITORY}" +AUTH=(-H "Authorization: token ${PAT_GITEA}") -# Resolve a release tag: -TAG="${1:-$(git tag --points-at HEAD | head -n1)}" +# Resolve a unique release tag: +TAG="${1:-}" if [ -z "$TAG" ]; then VER="$(jq -r .version "$ROOT/httptoolkit-server/package.json")" - TAG="v${VER}-$(git rev-parse --short HEAD)" + TAG="v${VER}-${SHORT}" + # If a release for this commit already exists (e.g. a scheduled rebuild of an + # unchanged commit), keep the old one and make this tag unique instead. + if curl -sf "${AUTH[@]}" "${REPO_API}/releases/tags/${TAG}" > /dev/null 2>&1; then + TAG="${TAG}-${GITHUB_RUN_NUMBER:-$(date -u +%Y%m%d%H%M%S)}" + fi fi -OUT_DIR="$(pwd)/out" -API="${GITEA_SERVER_URL}/api/v1/repos/${GITEA_REPOSITORY}/releases" - -echo "==> Creating release $TAG" -RESP=$(curl -s -X POST "$API" \ - -H "Authorization: token ${PAT_GITEA}" \ +echo "==> Creating release $TAG @ $SHORT" +RESP=$(curl -s -X POST "${REPO_API}/releases" "${AUTH[@]}" \ -H "Content-Type: application/json" \ - -d "{\"tag_name\": \"${TAG}\", \"name\": \"HTTP Toolkit ${TAG}\", \"body\": \"Self-hosted single-file build.\"}") + -d "{ + \"tag_name\": \"${TAG}\", + \"target_commitish\": \"${SHA}\", + \"name\": \"HTTP Toolkit ${TAG}\", + \"body\": \"Self-hosted single-file build from ${SHORT}.\", + \"draft\": false, + \"prerelease\": false + }") -RID=$(echo "$RESP" | jq -r '.id') -if [ "$RID" = "null" ] || [ -z "$RID" ]; then +RID=$(echo "$RESP" | jq -r '.id // empty') +if [ -z "$RID" ]; then echo "!! Failed to create release:"; echo "$RESP"; exit 1 fi echo "==> Release id $RID" +# Upload artifacts. shopt -s nullglob for f in "$OUT_DIR"/*; do [ -f "$f" ] || continue name=$(basename "$f") echo "==> Uploading $name" - curl -s -X POST "${API}/${RID}/assets?name=${name}" \ - -H "Authorization: token ${PAT_GITEA}" \ + curl -s -X POST "${REPO_API}/releases/${RID}/assets?name=${name}" "${AUTH[@]}" \ -H "Content-Type: application/octet-stream" \ --data-binary "@${f}" > /dev/null done