.PHONY: help release # Default target help: @echo "Available targets:" @echo "" @echo "Release:" @echo " ./release v0.1.0 - Tag, push, and release (notes auto-generated from commits)" @echo " make release VERSION=v0.1.0 - Same, explicit make form" # Create an annotated version tag carrying auto-generated release notes (git-cliff) # and push it. The tag push triggers .gitea/workflows/release.yml, which builds the # image and publishes a Gitea Release whose body is this tag's message. Notes come # entirely from Conventional Commits — no hand-written message required. # # git-cliff's --latest needs the tag to exist to scope the notes, so we create a # throwaway lightweight tag, generate the notes, replace it with an annotated tag, # then push. --cleanup=verbatim keeps the markdown "###" group headers (git's # default cleanup would strip lines starting with "#"). # # Requires git-cliff: https://git-cliff.org/install # Usage: make release VERSION=v0.1.0 release: @test -n "$(VERSION)" || { echo "Usage: make release VERSION=v0.1.0"; exit 1; } @command -v git-cliff >/dev/null 2>&1 || { echo "git-cliff not found — install: https://git-cliff.org/install"; exit 1; } @if git rev-parse "$(VERSION)" >/dev/null 2>&1; then echo "Tag $(VERSION) already exists locally — delete it first: git tag -d $(VERSION)"; exit 1; fi @echo "Generating release notes for $(VERSION)..." @git tag "$(VERSION)" HEAD && \ (git cliff --latest --config cliff.toml > .release-notes.tmp && git tag -d "$(VERSION)" >/dev/null) || \ { git tag -d "$(VERSION)" >/dev/null 2>&1; rm -f .release-notes.tmp; echo "git-cliff failed"; exit 1; } @git tag -a --cleanup=verbatim -F .release-notes.tmp "$(VERSION)" HEAD && rm -f .release-notes.tmp @git push origin "$(VERSION)" @echo "Pushed $(VERSION) — Gitea Actions will build the image and publish the Release."