5 Commits

Author SHA1 Message Date
gffranco d21237cfdc fix(release): checkout main by ref instead of tag (avoids Gitea ref pattern failure)
CI / cargo fmt --check (push) Successful in 33s
CI / cargo clippy (push) Successful in 46s
CI / cargo test (push) Successful in 1m5s
2026-06-24 02:10:57 +00:00
gffranco 14301586e0 fix(release): skip tag push when version stamp produced no changes
CI / cargo fmt --check (push) Successful in 35s
CI / cargo clippy (push) Successful in 36s
CI / cargo test (push) Successful in 49s
2026-06-24 01:43:28 +00:00
gffranco 2c835120f8 fix(release): dispatch trigger should succeed when tag already exists
CI / cargo fmt --check (push) Successful in 33s
CI / cargo clippy (push) Successful in 37s
CI / cargo test (push) Successful in 39s
2026-06-24 01:38:39 +00:00
gffranco 84d3b03485 fix(release): use single stamp step for both push and dispatch triggers
CI / cargo fmt --check (push) Successful in 25s
CI / cargo clippy (push) Successful in 28s
CI / cargo test (push) Successful in 37s
2026-06-24 01:29:44 +00:00
gffranco d293e6b5b6 ci(release): enable tag push trigger for automatic cross-compilation
CI / cargo fmt --check (push) Successful in 35s
CI / cargo clippy (push) Successful in 35s
CI / cargo test (push) Successful in 41s
2026-06-24 01:13:23 +00:00
+48 -23
View File
@@ -6,6 +6,9 @@ name: Release
# the vX.Y.Z tag. The build matrix + release job then run off that tag. No # the vX.Y.Z tag. The build matrix + release job then run off that tag. No
# more hand-editing versions across Cargo.toml and individual crate manifests. # more hand-editing versions across Cargo.toml and individual crate manifests.
on: on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+*'
workflow_dispatch: workflow_dispatch:
inputs: inputs:
version: version:
@@ -32,8 +35,6 @@ jobs:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
fetch-depth: 0 fetch-depth: 0
# Push the release commit + tag back with a write-capable token.
token: ${{ secrets.RELEASE_TOKEN }}
- uses: dtolnay/rust-toolchain@1.83 - uses: dtolnay/rust-toolchain@1.83
@@ -48,26 +49,43 @@ jobs:
restore-keys: | restore-keys: |
${{ runner.os }}-cargo-prepare- ${{ runner.os }}-cargo-prepare-
- name: Validate version + stamp - name: Stamp version + tag
id: stamp id: stamp
env:
VERSION: ${{ inputs.version }}
run: | run: |
set -euo pipefail set -euo pipefail
ver="${VERSION#v}" # tolerate a leading v if [ "${GITHUB_EVENT_NAME}" = "push" ]; then
if ! printf '%s' "$ver" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+([-.][0-9A-Za-z.-]+)?$'; then # Tag pushed locally: tag already exists, just extract version
echo "::error::'$ver' is not a semver version (expected e.g. 0.4.0)" tag="${GITHUB_REF_NAME}"
ver="${tag#v}"
else
# Manual dispatch from Gitea UI: use the input version
ver="${VERSION#v}"
tag="v${ver}"
if ! printf '%s' "$ver" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+([-.][0-9A-Za-z.-]+)?$'; then
echo "::error::'$ver' is not a semver version (expected e.g. 0.4.0)"
exit 1
fi
# If the tag already exists locally, skip version stamping.
# This covers the case where the tag was created outside this
# workflow — we just need the version number for downstream jobs.
if git rev-parse -q --verify "refs/tags/$tag" >/dev/null && \
! git ls-remote --exit-code --tags origin "$tag" >/dev/null 2>&1; then
echo "Tag already exists locally — skipping version stamp."
else
echo "Stamping version $ver …"
bash scripts/set-version.sh "$ver"
fi
fi
# Verify the Cargo.toml version matches so downstream jobs are safe.
manifest_ver=$(grep '^version' Cargo.toml | head -1 | sed 's/version = "//;s/"//')
if [ "$ver" != "$manifest_ver" ]; then
echo "::error::version mismatch: step says $ver but Cargo.toml says $manifest_ver"
exit 1 exit 1
fi fi
tag="v$ver"
if git rev-parse -q --verify "refs/tags/$tag" >/dev/null \
|| git ls-remote --exit-code --tags origin "$tag" >/dev/null 2>&1; then
echo "::error::tag $tag already exists"
exit 1
fi
bash scripts/set-version.sh "$ver"
echo "version=$ver" >> "$GITHUB_OUTPUT" echo "version=$ver" >> "$GITHUB_OUTPUT"
echo "tag=$tag" >> "$GITHUB_OUTPUT" echo "tag=$tag" >> "$GITHUB_OUTPUT"
env:
VERSION: ${{ inputs.version }}
# Gate: never tag code that doesn't build/test. If this fails nothing # Gate: never tag code that doesn't build/test. If this fails nothing
# is committed or pushed, so the release simply doesn't happen. # is committed or pushed, so the release simply doesn't happen.
@@ -75,6 +93,7 @@ jobs:
run: cargo test --workspace run: cargo test --workspace
- name: Commit, tag, push - name: Commit, tag, push
if: github.event_name == 'workflow_dispatch'
env: env:
VER: ${{ steps.stamp.outputs.version }} VER: ${{ steps.stamp.outputs.version }}
TAG: ${{ steps.stamp.outputs.tag }} TAG: ${{ steps.stamp.outputs.tag }}
@@ -84,10 +103,18 @@ jobs:
git config user.email "gitea-actions@users.noreply.code.gfran.co" git config user.email "gitea-actions@users.noreply.code.gfran.co"
git add Cargo.toml Cargo.lock \ git add Cargo.toml Cargo.lock \
crates/nuwiki-lsp/Cargo.toml crates/nuwiki-ls/Cargo.toml crates/nuwiki-lsp/Cargo.toml crates/nuwiki-ls/Cargo.toml
git commit -m "chore(release): $VER" # Check if there are staged changes. If not, the version was already
git tag -a "$TAG" -m "nuwiki $VER" # correct — create an empty commit just to have a release commit,
git push origin "HEAD:${GITHUB_REF_NAME}" # and skip the tag push since it already exists on origin.
git push origin "$TAG" if git diff --cached --quiet; then
git commit --allow-empty -m "chore(release): $VER"
echo "No version changes — skipping tag push."
else
git commit -m "chore(release): $VER"
git tag -a "$TAG" -m "nuwiki $VER"
git push origin "HEAD:${GITHUB_REF_NAME}"
git push origin "$TAG"
fi
build: build:
name: build ${{ matrix.target }} name: build ${{ matrix.target }}
@@ -115,8 +142,7 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
# Build the just-tagged commit, not the branch tip. ref: main
ref: ${{ needs.prepare.outputs.tag }}
- uses: dtolnay/rust-toolchain@1.83 - uses: dtolnay/rust-toolchain@1.83
with: with:
@@ -176,8 +202,7 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
ref: ${{ needs.prepare.outputs.tag }} ref: main
fetch-depth: 0
- name: Download all build artifacts - name: Download all build artifacts
# download-artifact@v3 nests each artifact under its own dir # download-artifact@v3 nests each artifact under its own dir