Files

73 lines
2.7 KiB
Bash
Executable File

#!/usr/bin/env bash
# Publica dist/duckbrain.phar (+ su sha256) como assets de la release `vX.Y.Z`
# en Forgejo, usando la version del instalador (Config::VERSION) como tag.
# self-update detecta la nueva version eligiendo el mayor semver de la lista
# de releases; no se necesita ningun tag magico `latest`.
# Requiere FORGEJO_TOKEN (token de la API con scope write:repository).
# Variables: FORGEJO_URL, FORGEJO_REPO, DUCKBRAIN_DIST.
set -euo pipefail
: "${FORGEJO_TOKEN:?Define FORGEJO_TOKEN (token de la API de Forgejo con write:repository)}"
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
OUT="${DUCKBRAIN_DIST:-$ROOT/dist}"
FORGEJO_URL="${FORGEJO_URL:-https://git.kj2.me}"
FORGEJO_REPO="${FORGEJO_REPO:-kj/duckbrain-toolbox}"
API="$FORGEJO_URL/api/v1/repos/$FORGEJO_REPO"
VERSION="$(grep -oP "const VERSION = '\K[^']+" "$ROOT/packages/commands/src/Toolbox/Config.php")"
TAG="v$VERSION"
if [ ! -f "$OUT/duckbrain.phar" ] || [ ! -f "$OUT/duckbrain.phar.sha256" ]; then
"$ROOT/scripts/build-phar"
fi
# El tag apunta al commit actual (de donde se construye el phar).
if ! git -C "$ROOT" rev-parse -q --verify "refs/tags/$TAG" >/dev/null; then
git -C "$ROOT" tag -a "$TAG" -m "duckbrain-toolbox $TAG"
fi
git -C "$ROOT" push -q origin "refs/tags/$TAG"
body="$(mktemp)"
trap 'rm -f "$body"' EXIT
code="$(curl -s -o "$body" -w '%{http_code}' -X POST "$API/releases" \
-H "Authorization: token $FORGEJO_TOKEN" -H 'Content-Type: application/json' \
-d "{\"tag_name\":\"$TAG\",\"name\":\"$TAG\",\"draft\":false,\"prerelease\":false}")"
if [ "$code" = 409 ] || [ "$code" = 422 ]; then
code="$(curl -s -o "$body" -w '%{http_code}' -H "Authorization: token $FORGEJO_TOKEN" "$API/releases/tags/$TAG")"
fi
if [ "$code" != 200 ] && [ "$code" != 201 ]; then
echo "Forgejo respondio HTTP $code al crear/leer la release $TAG:" >&2
cat "$body" >&2
exit 1
fi
id="$(jq -r '.id // empty' "$body")"
if [ -z "$id" ]; then
echo "La respuesta no trae id de release:" >&2
cat "$body" >&2
exit 1
fi
# Idempotente: quita assets previos con los nombres que se van a subir.
for a in $(jq -r '.assets[]? | select(.name == "duckbrain.phar" or .name == "duckbrain.phar.sha256") | .id' "$body"); do
curl -s -o /dev/null -X DELETE -H "Authorization: token $FORGEJO_TOKEN" "$API/releases/assets/$a"
done
for f in duckbrain.phar duckbrain.phar.sha256; do
resp="$(mktemp)"
if ! curl -s -f -o "$resp" -X POST "$API/releases/$id/assets?name=$f" \
-H "Authorization: token $FORGEJO_TOKEN" -F "attachment=@$OUT/$f"; then
echo "Fallo subiendo $f:" >&2
cat "$resp" >&2
exit 1
fi
rm -f "$resp"
done
echo "OK: release $TAG publicada con duckbrain.phar + duckbrain.phar.sha256"
echo " $FORGEJO_URL/$FORGEJO_REPO/releases/tag/$TAG"