From 594f39aa9c750fd4f4aabf6fd14f84d8df856039 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20N=C3=BCtzi?= Date: Sun, 21 Apr 2024 16:09:18 +0200 Subject: [PATCH] fix: Release workflow :anchor: --- .github/workflows/release.yml | 49 ++++++++++++++++-- README.md | 8 +-- githooks/.goreleaser-small.yaml | 88 +++++++++++++++++++++++++++++++++ githooks/.goreleaser.yaml | 6 +-- nix/pkgs/version.json | 4 +- scripts/release.sh | 2 +- 6 files changed, 143 insertions(+), 14 deletions(-) create mode 100644 githooks/.goreleaser-small.yaml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6c24a0cf..a2041554 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,6 +16,10 @@ jobs: with: fetch-depth: 0 + - name: Fetch annotated tags + run: | + git fetch origin --force "$GITHUB_REF:$GITHUB_REF" + - name: Set up Go uses: actions/setup-go@v2 with: @@ -42,10 +46,17 @@ jobs: git config user.name 'githooks-bot' git config user.email 'githooks-bot@users.noreply.github.com' + # Check we got an annotated tag. + [ "$(git cat-file -t "$TRIGGER_TAG")" = "tag" ] || { + echo "Tag '$TRIGGER_TAG' is not an annotated tag." + exit 1 + } + # Gets the message on the annotated commit: deref() { git for-each-ref "refs/tags/$TRIGGER_TAG" --format="%($1)" ; }; + # Creates a new tag with the same message, including trailing headers. - git tag "$RELEASE_TAG" -a -m "$(deref contents)" + git tag -a -m "$(deref contents)" "$RELEASE_TAG" git tag "githooks/$RELEASE_TAG" - name: Define Release Branch @@ -57,39 +68,67 @@ jobs: RELEASE_BRANCH="main" RELEASE_VERSION="${RELEASE_TAG##v}" - regex="^Release-Branch:\s+(.*)$" + echo "Get release branch on tag '$RELEASE_TAG'." + # Gets the message on the annotated commit: deref() { git for-each-ref "refs/tags/$RELEASE_TAG" --format="%($1)" ; }; + deref contents + + regex="^Release-Branch:\s+(.*)$" if deref contents | grep -qE "$regex"; then RELEASE_BRANCH=$(deref contents | grep -E "$regex" | sed -E "s/$regex/\1/") || { echo "Release-Branch trailer is wrong." exit 1 } + [ -n "$RELEASE_BRANCH" ] || { + echo "Release-Branch trailer is empty." + exit 1 + } fi + # Fetch the branch. git fetch --depth 50 origin "$RELEASE_BRANCH" # Check if its reachable. [ -n "$(git rev-list --first-parent \ - --ancestry-path + --ancestry-path \ "$RELEASE_TAG^..origin/$RELEASE_BRANCH")" ] || { echo "Tag is not reachable from '$RELEASE_BRANCH' (--first-parent) !" >&2 exit 1 } + # Use only a small release config + # when not on `main` branch. + if [ "$RELEASE_BRANCH" != "main"]; then + echo "**WARNING: Do not install this version! For internal testing only.**" >githooks/.release-notes.md + fi + echo ::set-output name=releaseVersion ::$RELEASE_VERSION echo ::set-output name=releaseBranch ::$RELEASE_BRANCH - name: Run GoReleaser - uses: goreleaser/goreleaser-action@v2 + if: ${{ steps.releaseBranch.outputs.releaseBranch == 'main' }} + uses: goreleaser/goreleaser-action@v5 + with: + version: latest + workdir: githooks + args: "release --clean" + env: + GORELEASER_CURRENT_TAG: ${{ steps.getTag.outputs.releaseTag }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GPG_FINGERPRINT: ${{ steps.import_gpg.outputs.fingerprint }} + + - name: Run GoReleaser (non-main) + if: ${{ steps.releaseBranch.outputs.releaseBranch != 'main' }} + uses: goreleaser/goreleaser-action@v5 with: version: latest workdir: githooks - args: release --clean + args: "release --clean -f .goreleaser-small.yaml --release-notes .release-notes.md" env: GORELEASER_CURRENT_TAG: ${{ steps.getTag.outputs.releaseTag }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/README.md b/README.md index b45786fc..86d22e92 100644 --- a/README.md +++ b/README.md @@ -1514,10 +1514,10 @@ matches the regex `^Update-NoSkip: *true`, than this version **will not be skipped**. This feature enables to enforce an update to a specific version. In some cases this is useful (serialization changes etc.). -The single-line commit trailers `^Update-Info: *(.*)` on version tagged commits -are used to assemble a small changelog during update, which is presented to the -user. The single line can contain important information/links to relevant fixes -and changes. +The single-line commit trailers `^Update-Info: *(.*)` (multiple ones allowed) on +the annotated tag is used to assemble a small changelog during update, which is +presented to the user. The single line can contain important information/links +to relevant fixes and changes. You can also check for updates at any time by executing [`git hooks update`](docs/cli/git_hooks_update.md) or using diff --git a/githooks/.goreleaser-small.yaml b/githooks/.goreleaser-small.yaml new file mode 100644 index 00000000..5fd97f86 --- /dev/null +++ b/githooks/.goreleaser-small.yaml @@ -0,0 +1,88 @@ +# Check Documentation: +# https://goreleaser.com/customization/ +project_name: githooks +before: + hooks: + - go mod download + - go mod vendor + - go generate -mod=vendor ./... +builds: + - id: runner + binary: runner + main: ./apps/runner + env: &ENV + - CGO_ENABLED=0 + goos: &GOOS + - linux + goarch: &GOARCH + - amd64 + - id: cli + binary: cli + main: ./apps/cli + env: *ENV + goos: *GOOS + goarch: *GOARCH + - id: dialog + binary: dialog + main: ./apps/dialog + env: *ENV + goos: *GOOS + goarch: *GOARCH +archives: + - id: githooks + builds: + - runner + - cli + - dialog + name_template: '{{ .ProjectName }}-{{ .Version }}-{{ if eq .Os "darwin" }}macos{{else}}{{ .Os }}{{end}}.{{ .Arch }}' + format: tar.gz + files: + - none* + format_overrides: + - goos: windows + format: zip +checksum: + name_template: "{{ .ProjectName }}.checksums" + algorithm: sha256 +snapshot: + name_template: "{{ .Tag }}" +changelog: + filters: + # Commit messages matching the regexp listed here will be removed from + # the changelog + exclude: + - '^\[np\]' + - '^\[docs\]' +signs: + - artifacts: checksum + cmd: gpg + # Signing with the private key where 'deploy.asc' is this public key in this repo. + args: + [ + "-u", + "{{ .Env.GPG_FINGERPRINT }}", + "--output", + "${signature}", + "--detach-sign", + "${artifact}", + ] + signature: "${artifact}.sig" +release: + github: + owner: gabyx + name: githooks + prerelease: auto +# Use these values for you own gitea instance... +# gitea_urls: +# api: "https://git.company.com/api/v1" +# download: "https://git.company.com" +# # set to true if you use a self-signed certificate +# skip_tls_verify: true + +# Use these values for you own github instance... +# github_urls: +# api: https://git.company.com/api/v3/ +# upload: https://git.company.com/api/uploads/ +# download: https://git.company.com/ +# # set to true if you use a self-signed certificate +# skip_tls_verify: false diff --git a/githooks/.goreleaser.yaml b/githooks/.goreleaser.yaml index 6dcf0535..9a5f22a3 100644 --- a/githooks/.goreleaser.yaml +++ b/githooks/.goreleaser.yaml @@ -8,7 +8,7 @@ before: - go generate -mod=vendor ./... builds: - id: runner - binary: runner + binary: githooks-runner main: ./apps/runner env: &ENV - CGO_ENABLED=0 @@ -35,14 +35,14 @@ builds: - goos: windows goarch: arm64 - id: cli - binary: cli + binary: githooks-cli main: ./apps/cli env: *ENV goos: *GOOS goarch: *GOARCH ignore: *IGNORE - id: dialog - binary: dialog + binary: githooks-dialog main: ./apps/dialog env: *ENV goos: *GOOS diff --git a/nix/pkgs/version.json b/nix/pkgs/version.json index f339f7b9..80cc1aad 100644 --- a/nix/pkgs/version.json +++ b/nix/pkgs/version.json @@ -1 +1,3 @@ -{ "version": "3.0.0" } +{ + "version": "3.0.0-rc1" +} diff --git a/scripts/release.sh b/scripts/release.sh index cddb8bac..2a44a7c1 100755 --- a/scripts/release.sh +++ b/scripts/release.sh @@ -34,7 +34,7 @@ function commit_version_file() { jq ".version |= \"$version\"" nix/pkgs/version.json >"$temp" mv "$temp" nix/pkgs/version.json - if git diff --quiet --exit-code; then + if ! git diff --quiet --exit-code; then git add nix/pkgs/version.json git commit -m "np: Update version to '$version'" fi