diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 0b586a8..3ccda7e 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -63,6 +63,8 @@ jobs: - name: Build release binaries run: | VERSION="${{ github.event.inputs.tag || github.ref_name }}" + BUILD_DATE="$(date -u +"%Y-%m-%d %H:%M:%S UTC")" + LDFLAGS="-X 'git.warky.dev/wdevs/relspecgo/pkg/buildinfo.Version=${VERSION}' -X 'git.warky.dev/wdevs/relspecgo/pkg/buildinfo.BuildDate=${BUILD_DATE}'" for target in "linux/amd64" "linux/arm64" "darwin/amd64" "darwin/arm64" "windows/amd64"; do GOOS="${target%/*}" GOARCH="${target#*/}" @@ -71,7 +73,7 @@ jobs: NAME="relspec-${GOOS}-${GOARCH}${EXT}" GOOS="$GOOS" GOARCH="$GOARCH" go build \ -trimpath \ - -ldflags "-X git.warky.dev/wdevs/relspecgo/cmd/relspec.version=${VERSION}" \ + -ldflags "$LDFLAGS" \ -o "$NAME" ./cmd/relspec echo "Built $NAME" done @@ -234,11 +236,12 @@ jobs: run: | VERSION="${{ github.event.inputs.tag || github.ref_name }}" PKGVER="${VERSION#v}" + BUILD_DATE="$(date -u +"%Y-%m-%d %H:%M:%S UTC")" for GOARCH in amd64 arm64; do GOOS=linux GOARCH=$GOARCH go build \ -trimpath \ - -ldflags "-X git.warky.dev/wdevs/relspecgo/cmd/relspec.version=${PKGVER}" \ + -ldflags "-X 'git.warky.dev/wdevs/relspecgo/pkg/buildinfo.Version=v${PKGVER}' -X 'git.warky.dev/wdevs/relspecgo/pkg/buildinfo.BuildDate=${BUILD_DATE}'" \ -o relspec ./cmd/relspec PKGDIR="relspec_${PKGVER}_${GOARCH}" diff --git a/Makefile b/Makefile index 96725b3..34b6fac 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,9 @@ STATICCHECK = go run honnef.co/go/tools/cmd/staticcheck@latest GOVULNCHECK = go run golang.org/x/vuln/cmd/govulncheck@latest # Version information -VERSION := $(shell git describe --tags --always --dirty 2>/dev/null || echo "dev") +# VERSION file is the single source of truth (bumped by `make release-version`). +# Falls back to git describe for ad-hoc builds where VERSION hasn't been committed yet. +VERSION := $(shell [ -f VERSION ] && echo "v$$(cat VERSION | tr -d '[:space:]')" || git describe --tags --always --dirty 2>/dev/null || echo "dev") BUILD_DATE := $(shell date -u +"%Y-%m-%d %H:%M:%S UTC") LDFLAGS := -X 'git.warky.dev/wdevs/relspecgo/pkg/buildinfo.Version=$(VERSION)' -X 'git.warky.dev/wdevs/relspecgo/pkg/buildinfo.BuildDate=$(BUILD_DATE)' @@ -223,6 +225,15 @@ release: lint fmt-check test build ## Run lint, format check, tests, build, then echo "Creating new release: $$version"; \ commit_logs=$$(git log "$${latest_tag}..HEAD" --pretty=format:"- %s" --no-merges); \ fi; \ + PKGVER=$${version#v}; \ + echo "Updating package metadata to $$PKGVER..."; \ + echo "$$PKGVER" > VERSION; \ + sed -i "s/^pkgver=.*/pkgver=$$PKGVER/" linux/arch/PKGBUILD; \ + sed -i "s/^Version:.*/Version: $$PKGVER/" linux/centos/relspec.spec; \ + git add VERSION linux/arch/PKGBUILD linux/centos/relspec.spec; \ + if ! git diff --cached --quiet; then \ + git commit -m "chore(release): update package version to $$PKGVER"; \ + fi; \ if [ -z "$$commit_logs" ]; then \ tag_message="Release $$version"; \ else \ @@ -232,17 +243,18 @@ release: lint fmt-check test build ## Run lint, format check, tests, build, then git push origin "$$version"; \ echo "Tag $$version created and pushed to remote repository." -release-version: ## Auto-increment patch version, update package files, commit, tag, and push - @CURRENT=$$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0"); \ - MAJOR=$$(echo $$CURRENT | sed 's/v\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1/'); \ - MINOR=$$(echo $$CURRENT | sed 's/v\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\2/'); \ - PATCH=$$(echo $$CURRENT | sed 's/v\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\3/'); \ - NEXT="v$$MAJOR.$$MINOR.$$((PATCH + 1))"; \ +release-version: ## Auto-increment patch version, update VERSION/package files, commit, tag, and push + @CURRENT=$$([ -f VERSION ] && cat VERSION | tr -d '[:space:]' || (git describe --tags --abbrev=0 2>/dev/null | sed 's/^v//') || echo "0.0.0"); \ + MAJOR=$$(echo $$CURRENT | cut -d. -f1); \ + MINOR=$$(echo $$CURRENT | cut -d. -f2); \ + PATCH=$$(echo $$CURRENT | cut -d. -f3); \ PKGVER="$$MAJOR.$$MINOR.$$((PATCH + 1))"; \ - echo "Current: $$CURRENT → Next: $$NEXT"; \ + NEXT="v$$PKGVER"; \ + echo "Current: v$$CURRENT → Next: $$NEXT"; \ + echo "$$PKGVER" > VERSION; \ sed -i "s/^pkgver=.*/pkgver=$$PKGVER/" linux/arch/PKGBUILD; \ sed -i "s/^Version:.*/Version: $$PKGVER/" linux/centos/relspec.spec; \ - git add linux/arch/PKGBUILD linux/centos/relspec.spec; \ + git add VERSION linux/arch/PKGBUILD linux/centos/relspec.spec; \ git commit -m "chore(release): update package version to $$PKGVER"; \ git tag -a "$$NEXT" -m "Release $$NEXT"; \ git push origin HEAD "$$NEXT"; \ diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..818b8de --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +1.0.81 diff --git a/linux/arch/PKGBUILD b/linux/arch/PKGBUILD index 41d2e05..751e1a5 100644 --- a/linux/arch/PKGBUILD +++ b/linux/arch/PKGBUILD @@ -1,6 +1,6 @@ # Maintainer: Hein (Warky Devs) pkgname=relspec -pkgver=1.0.74 +pkgver=1.0.81 pkgrel=1 pkgdesc="RelSpec is a comprehensive database relations management tool that reads, transforms, and writes database table specifications across multiple formats and ORMs." arch=('x86_64' 'aarch64') @@ -15,7 +15,7 @@ build() { export CGO_ENABLED=0 go build \ -trimpath \ - -ldflags "-X git.warky.dev/wdevs/relspecgo/cmd/relspec.version=$pkgver" \ + -ldflags "-X 'git.warky.dev/wdevs/relspecgo/pkg/buildinfo.Version=v$pkgver' -X 'git.warky.dev/wdevs/relspecgo/pkg/buildinfo.BuildDate=$(date -u +"%Y-%m-%d %H:%M:%S UTC")'" \ -o "$pkgname" ./cmd/relspec } diff --git a/linux/centos/relspec.spec b/linux/centos/relspec.spec index db5013d..bfd6abc 100644 --- a/linux/centos/relspec.spec +++ b/linux/centos/relspec.spec @@ -1,5 +1,5 @@ Name: relspec -Version: 1.0.74 +Version: 1.0.81 Release: 1%{?dist} Summary: RelSpec is a comprehensive database relations management tool that reads, transforms, and writes database table specifications across multiple formats and ORMs. @@ -25,7 +25,7 @@ DBML, GraphQL, and more. export CGO_ENABLED=0 go build \ -trimpath \ - -ldflags "-X git.warky.dev/wdevs/relspecgo/cmd/relspec.version=%{version}" \ + -ldflags "-X 'git.warky.dev/wdevs/relspecgo/pkg/buildinfo.Version=v%{version}' -X 'git.warky.dev/wdevs/relspecgo/pkg/buildinfo.BuildDate=$(date -u +"%%Y-%%m-%%d %%H:%%M:%%S UTC")'" \ -o %{name} ./cmd/relspec %install