From f53dfa1c4c5aed5be556261306c8a9d5ea5ec6b0 Mon Sep 17 00:00:00 2001 From: Tyler Koenig Date: Fri, 12 Jun 2026 16:16:28 -0400 Subject: [PATCH] fix(release): repair pipeline defects found in v0.1.0-rc.1 rehearsal Four defects from the rc.1 dress rehearsal: - Dockerfile pinned golang:1.26-alpine3.23 at a 1.26.3 digest while go.mod requires 1.26.4; golang images set GOTOOLCHAIN=local, so the build hard-fails. Pin 1.26.4-alpine3.23 explicitly. - changelog.disable swallowed --release-notes (the flag is consumed by the changelog pipe), publishing empty release bodies. Re-enable. - Remove the Gitea-side GitHub relay step: redundant with .github/workflows/mirror-release.yml, which runs on GitHub Actions with the built-in token and copies the canonical Gitea assets. - mirror-release.yml: jq '.body // empty' treats "" as truthy so the notes fallback never fired; use select(). Mark rc tags --prerelease. --- .gitea/workflows/release-binaries.yml | 37 +++------------------------ .github/workflows/mirror-release.yml | 7 ++++- .goreleaser.yaml | 7 +++-- Dockerfile | 2 +- 4 files changed, 15 insertions(+), 38 deletions(-) diff --git a/.gitea/workflows/release-binaries.yml b/.gitea/workflows/release-binaries.yml index 85dd4ba..61a302b 100644 --- a/.gitea/workflows/release-binaries.yml +++ b/.gitea/workflows/release-binaries.yml @@ -53,37 +53,6 @@ jobs: GITEA_TOKEN: ${{ secrets.RELEASE_TOKEN }} GITEA_API_URL: http://gitea:3000/api/v1 - # GoReleaser publishes to exactly one SCM (Gitea). The push mirror - # carries git refs but not release artifacts, so relay the release to - # the GitHub mirror — README install links point there. - - name: Mirror release to GitHub - env: - GH_TOKEN: ${{ secrets.GH_MIRROR_TOKEN }} - run: | - if [ -z "$GH_TOKEN" ]; then - echo "GH_MIRROR_TOKEN not set — skipping GitHub release relay" - exit 0 - fi - apk add --no-cache github-cli - TAG="${{ github.ref_name }}" - - # Nudge the push mirror, then wait for the tag to land on GitHub. - curl -sf -X POST \ - -H "Authorization: token ${{ secrets.RELEASE_TOKEN }}" \ - "http://gitea:3000/api/v1/repos/lerkolabs/uptop/push_mirrors-sync" || true - for i in $(seq 1 30); do - if gh api "repos/lerkolabs/uptop/git/ref/tags/${TAG}" >/dev/null 2>&1; then - break - fi - sleep 10 - done - - PRERELEASE="" - case "$TAG" in *-*) PRERELEASE="--prerelease";; esac - gh release create "$TAG" \ - --repo lerkolabs/uptop \ - --verify-tag \ - --title "$TAG" \ - --notes-file /tmp/release-notes.md \ - $PRERELEASE \ - dist/*.tar.gz dist/*.zip dist/*.deb dist/*.rpm dist/checksums.txt + # GitHub release relaying is handled by .github/workflows/mirror-release.yml, + # which runs on GitHub Actions when the push mirror delivers the tag and + # copies this run's Gitea release assets — no PAT needed on this side. diff --git a/.github/workflows/mirror-release.yml b/.github/workflows/mirror-release.yml index 8f5c894..d25c723 100644 --- a/.github/workflows/mirror-release.yml +++ b/.github/workflows/mirror-release.yml @@ -38,7 +38,9 @@ jobs: exit 1 fi - echo "$RESPONSE" | jq -r '.body // empty' > /tmp/release-notes.md + # select() so an empty-string body produces an empty file — `// empty` + # treats "" as truthy and wrote a blank line, defeating this fallback. + echo "$RESPONSE" | jq -r '.body | select(. != null and . != "")' > /tmp/release-notes.md if [ ! -s /tmp/release-notes.md ]; then echo "Release ${TAG} from [Gitea](https://gitea.lerkolabs.com/lerkolabs/uptop/releases/tag/${TAG})" > /tmp/release-notes.md @@ -62,8 +64,11 @@ jobs: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} TAG: ${{ github.ref_name }} run: | + PRERELEASE="" + case "$TAG" in *-*) PRERELEASE="--prerelease" ;; esac gh release create "$TAG" \ --repo "$GITHUB_REPOSITORY" \ --title "$TAG" \ --notes-file /tmp/release-notes.md \ + $PRERELEASE \ /tmp/assets/* diff --git a/.goreleaser.yaml b/.goreleaser.yaml index e53447c..88dc631 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -8,6 +8,7 @@ release: gitea: owner: lerkolabs name: uptop + prerelease: auto builds: - main: ./cmd/uptop @@ -58,5 +59,7 @@ nfpms: dst: /usr/share/doc/uptop/LICENSE type: doc -changelog: - disable: true +# Changelog generation must stay enabled: the --release-notes flag is consumed +# by the changelog pipe, so disabling it silently drops the git-cliff notes +# (empty release body on v0.1.0-rc.1). With --release-notes set, GoReleaser +# skips its own generation and uses the file. diff --git a/Dockerfile b/Dockerfile index 2dcd8bb..aada010 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # --- Stage 1: Builder --- -FROM golang:1.26-alpine3.23@sha256:91eda9776261207ea25fd06b5b7fed8d397dd2c0a283e77f2ab6e91bfa71079d AS builder +FROM golang:1.26.4-alpine3.23@sha256:f23e8b227fb4493eabe03bede4d5a32d04092da71962f1fb79b5f7d1e6c2a17f AS builder WORKDIR /app COPY go.mod go.sum ./ RUN --mount=type=cache,target=/go/pkg/mod \