From 0c0d7b6ebe8e4c2ef665c57e8ec4198b4f512c5a Mon Sep 17 00:00:00 2001 From: Ron Date: Mon, 17 Aug 2026 13:11:55 +0800 Subject: [PATCH 1/3] ci(release): tag automatically when a dev-v* branch merges to main MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Delegates to the reusable workflow in fleetbase/fleetbase, which validates and pushes the tag; create-release.yml and the publish jobs here already chain off the tag push. The version is never retyped — it comes from the dev-v* branch name, and the tag is refused unless the version files and RELEASE.md already agree with it. This repository is an ember addon plus a server, so it carries composer.json, package.json and extension.json. Co-Authored-By: Claude Opus 5 --- .github/workflows/release.yml | 46 +++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..e1476e73c --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,46 @@ +name: Release Tag + +# Tags a release when a `dev-v*` branch is merged to main, and pushes the tag. Delegates +# to the reusable workflow in fleetbase/fleetbase. Requires org secret _GITHUB_AUTH_TOKEN +# (inherited); no-ops with a warning until it is set. +# +# It pushes the tag and nothing else — create-release.yml and the publish jobs in this +# repository already chain off `push: tags: v*`. +# +# The version is never retyped: it comes from the branch name, and the tag is refused +# unless the files below and RELEASE.md already agree with it. This repository is +# an ember addon plus a server, so it carries composer.json, package.json and extension.json. +# +# RELEASE.md is required, and its first line must name the version being released. That +# check is the only thing that can tell notes written for this release from the previous +# release's notes nobody replaced. +# +# Deliberately unpinned, like postman.yml — it tracks the reusable workflow on main, so +# there is no ref here to remember to bump. +# +# workflow_dispatch is the recovery path. Use it when a release failed validation and the +# fix landed on main after the merge: re-running the merge event would check out the +# merge commit and never see that fix. + +on: + pull_request: + types: [closed] + branches: [main] + workflow_dispatch: + inputs: + version: + description: "Version to tag, e.g. 1.2.3. Recovery only — a normal release reads it from the branch." + required: true +permissions: + contents: read + +jobs: + tag: + if: github.event_name == 'workflow_dispatch' || + (github.event.pull_request.merged == true && + startsWith(github.event.pull_request.head.ref, 'dev-v')) + uses: fleetbase/fleetbase/.github/workflows/release-tag.yml@main + with: + version-files: composer.json,package.json,extension.json + version: ${{ github.event.inputs.version || '' }} + secrets: inherit From 542cf901ca0098c21e0cfb2507420b8bd0d67912 Mon Sep 17 00:00:00 2001 From: Ron Date: Mon, 17 Aug 2026 13:21:54 +0800 Subject: [PATCH 2/3] docs(release): seed the release notes template --- RELEASE.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 RELEASE.md diff --git a/RELEASE.md b/RELEASE.md new file mode 100644 index 000000000..035f4ca38 --- /dev/null +++ b/RELEASE.md @@ -0,0 +1,15 @@ +> v0.6.59 ~ "RELEASE_NOTES_PLACEHOLDER — replace this line with the release title" + +--- +## Highlights + +RELEASE_NOTES_PLACEHOLDER + +Describe what changed in this release. The first line above must name the version +being released, and both placeholder markers must be gone, or the release workflow +refuses to tag. + +--- +## Need help? +- [GitHub Discussions](https://github.com/fleetbase/fleetbase/discussions) +- [Discord](https://discord.gg/HnTqQ6zAVn) From da92ac01706ae2814df0a54f98c23804d8937369 Mon Sep 17 00:00:00 2001 From: Ron Date: Mon, 17 Aug 2026 13:21:58 +0800 Subject: [PATCH 3/3] ci(release): publish RELEASE.md as the release body Matches fleetbase/fleetbase, which has always used body_path. The release workflow now requires RELEASE.md and refuses to tag without it, so without this the notes would be mandatory to write and displayed nowhere. generate_release_notes stays on so GitHub's commit list is appended beneath the hand-written notes. --- .github/workflows/create-release.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index c4016de2f..40e80db2e 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -14,8 +14,9 @@ jobs: with: tag_name: ${{ github.ref_name }} name: ${{ github.ref_name }} - generate_release_notes: true + body_path: RELEASE.md + generate_release_notes: true draft: false prerelease: false env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}