Publish release candidates to a testing apt distribution

Pre-releases (versions with a hyphen) now upload their .debs to the
"testing" distribution instead of "stable", so servers following stable
never get an RC from apt upgrade. An RC can take its release notes from
its final version's section or Unreleased; the workflow checks the notes
with 'gitea-release.sh notes'. Also fix publishing RCs, whose .deb names
carry the Debian version (0.2.0~rc.1) and were rejected.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
abrown38andClaude Opus 5.5 committed 2026-10-09 14:56:08 +00:00
1 parent b22ffee1bb
commit 21cb14262d
5 files changed
+116 -19

No files matched your search

+59 -12
View File
@@ -11,22 +11,75 @@
# Run by .gitea/workflows/release.yml when a v* tag is pushed. Running it
# again for the same version replaces the attachments and packages.
#
# A version with a hyphen (0.2.0-rc.1) is a pre-release: Gitea marks the
# release so and doesn't count it as the latest, and its packages go to
# the "testing" distribution, so servers that follow "stable" never get
# a pre-release from apt.
#
# Release notes: the CHANGELOG section "## [VERSION]". A pre-release
# without one of its own uses the section of the version it leads up to
# ("## [0.2.0]"), or else "## [Unreleased]".
#
# 'gitea-release.sh notes' only prints the notes, failing if there are
# none (the workflow checks this before building).
#
# Variables:
# GITEA_URL e.g. https://gitea.example.com (in Actions:
# GITHUB_SERVER_URL)
# GITEA_REPO owner/name (in Actions: GITHUB_REPOSITORY)
# GITEA_TOKEN a token with write:repository and write:package
# VERSION default: the VERSION file
# DEB_DISTRIBUTION the apt distribution (default: stable)
# DEB_DISTRIBUTION the apt distribution (default: stable, testing for
# a pre-release)
# DEB_COMPONENT the apt component (default: main)
#
# Needs curl and jq.
set -eu
VERSION=${VERSION:-$(cat VERSION)}
prerelease=false
case $VERSION in *-*) prerelease=true ;; esac
# section prints the CHANGELOG section headed "## [$1]" (without the
# heading); nothing if there is none.
section() {
awk -v v="$1" '
/^## \[/ { if (on) exit; on = index($0, "## [" v "]") == 1; next }
on' CHANGELOG.md
}
# The release notes (see above). A section with only blank lines counts
# as missing.
notes=$(section "$VERSION")
from="[$VERSION]"
if [ "$prerelease" = true ]; then
for s in "${VERSION%%-*}" Unreleased; do
[ -z "$(printf '%s' "$notes" | tr -d '[:space:]')" ] || break
notes=$(section "$s")
from="[$s]"
done
fi
if [ -z "$(printf '%s' "$notes" | tr -d '[:space:]')" ]; then
if [ "$prerelease" = true ]; then
echo "gitea-release: CHANGELOG.md has no '## [$VERSION]', '## [${VERSION%%-*}]' or '## [Unreleased]' section with notes" >&2
else
echo "gitea-release: CHANGELOG.md has no '## [$VERSION]' section with notes" >&2
fi
exit 1
fi
if [ "${1:-}" = notes ]; then
echo "gitea-release: notes for $VERSION from CHANGELOG.md $from" >&2
printf '%s\n' "$notes"
exit 0
fi
: "${GITEA_URL:=${GITHUB_SERVER_URL:-}}" "${GITEA_REPO:=${GITHUB_REPOSITORY:-}}"
: "${GITEA_URL:?set GITEA_URL}" "${GITEA_REPO:?set GITEA_REPO}" "${GITEA_TOKEN:?set GITEA_TOKEN}"
VERSION=${VERSION:-$(cat VERSION)}
DEB_DISTRIBUTION=${DEB_DISTRIBUTION:-stable}
if [ "$prerelease" = true ]; then
DEB_DISTRIBUTION=${DEB_DISTRIBUTION:-testing}
else
DEB_DISTRIBUTION=${DEB_DISTRIBUTION:-stable}
fi
DEB_COMPONENT=${DEB_COMPONENT:-main}
GITEA_URL=${GITEA_URL%/}
owner=${GITEA_REPO%%/*}
@@ -51,21 +104,15 @@ call() {
files=$(find dist -maxdepth 1 -type f ! -name SHA256SUMS | sort)
[ -n "$files" ] || { echo "gitea-release: nothing in dist/" >&2; exit 1; }
# (Debian package versions have ~ for -: jarl_0.2.0~rc.1_amd64.deb.)
debversion=$(printf '%s' "$VERSION" | tr - '~')
for f in $files; do
case $f in *"$VERSION"*) ;; *) echo "gitea-release: $f is not version $VERSION" >&2; exit 1 ;; esac
case $f in *"$VERSION"* | *"$debversion"*) ;; *) echo "gitea-release: $f is not version $VERSION" >&2; exit 1 ;; esac
done
# shellcheck disable=SC2046 # file names have no spaces
(cd dist && sha256sum $(printf '%s\n' "$files" | sed 's|^dist/||')) > dist/SHA256SUMS
files="$files dist/SHA256SUMS"
# The release notes: the CHANGELOG section for this version.
notes=$(awk -v v="$VERSION" '
/^## \[/ { if (on) exit; on = index($0, "## [" v "]") == 1; next }
on' CHANGELOG.md)
[ -n "$notes" ] || notes="See CHANGELOG.md."
prerelease=false
case $VERSION in *-*) prerelease=true ;; esac
# The release (created, or found when publishing again).
release=$(call 404 "$api/releases/tags/$tag")
id=$(printf '%s\n' "$release" | jq -r '.id // empty')