From 63c4886cba07815e299d5c4b3aa208eaf47b637c Mon Sep 17 00:00:00 2001 From: Nick Chapman Date: Sat, 20 Dec 2025 10:07:02 -0800 Subject: [PATCH 1/6] Add automated release build system. - Add GitHub Actions workflow (release.yml) that builds all platforms and creates a GitHub Release on tag push - Add release.sh script for git-flow release automation with semver bumping (make release TYPE=patch|minor|major) - Add VERSION file for version tracking - Add dry-run mode for testing builds without creating releases - Include build provenance attestation for supply chain security --- .github/workflows/release.yml | 90 ++++++++++++++++++++++++++ Makefile | 10 ++- VERSION | 1 + scripts/release.sh | 118 ++++++++++++++++++++++++++++++++++ 4 files changed, 218 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/release.yml create mode 100644 VERSION create mode 100755 scripts/release.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..fd5ad89e --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,90 @@ +name: Release + +on: + push: + tags: + - "v*" + workflow_dispatch: + inputs: + dry_run: + description: "Dry run (build but skip release)" + type: boolean + default: true + +permissions: + attestations: write + contents: write + id-token: write + +concurrency: + group: release + cancel-in-progress: false + +jobs: + build-and-release: + name: Build and Release + runs-on: sprinters:aws:ubuntu-24.04-arm:c7gd.xlarge + timeout-minutes: 120 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: recursive + fetch-depth: 0 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y jq rsync + # Install 7-Zip standalone (7zz) + wget -q https://www.7-zip.org/a/7z2408-linux-arm64.tar.xz + tar -xf 7z2408-linux-arm64.tar.xz + sudo mv 7zz /usr/local/bin/ + rm -f 7z2408-linux-arm64.tar.xz + + - name: Build all platforms + run: make all + + - name: Verify build artifacts + run: | + if ! ls releases/*.zip 1>/dev/null 2>&1; then + echo "Error: No release artifacts found in releases/" + exit 1 + fi + echo "Found artifacts:" + ls -la releases/*.zip + + - name: Get version + id: version + run: | + if [[ "$GITHUB_REF" == refs/tags/* ]]; then + echo "version=${GITHUB_REF#refs/tags/}" >> "$GITHUB_OUTPUT" + else + echo "version=dev-$(git rev-parse --short HEAD)" >> "$GITHUB_OUTPUT" + fi + + - name: Attest build provenance + if: ${{ !inputs.dry_run }} + uses: actions/attest-build-provenance@v3 + with: + subject-path: releases/*.zip + + - name: Upload build artifacts + if: ${{ inputs.dry_run }} + uses: actions/upload-artifact@v4 + with: + name: release-${{ steps.version.outputs.version }} + path: releases/*.zip + retention-days: 7 + + - name: Create GitHub Release + if: ${{ !inputs.dry_run }} + uses: softprops/action-gh-release@v2 + with: + name: LessUI ${{ steps.version.outputs.version }} + files: releases/*.zip + generate_release_notes: true + make_latest: "true" diff --git a/Makefile b/Makefile index d7db83ef..bad5d203 100644 --- a/Makefile +++ b/Makefile @@ -78,7 +78,7 @@ endif export OPT_FLAGS export LOG_FLAGS -.PHONY: help build test coverage lint format dev dev-run dev-run-4x3 dev-run-16x9 dev-clean all shell name clean setup special tidy stage compress package dev-deploy dev-build-deploy +.PHONY: help build test coverage lint format dev dev-run dev-run-4x3 dev-run-16x9 dev-clean all shell name clean setup special tidy stage compress package dev-deploy dev-build-deploy release export MAKEFLAGS=--no-print-directory @@ -115,6 +115,9 @@ help: @echo " make dev-deploy Deploy to SD card (requires LESSUI_DEV volume)" @echo " make dev-build-deploy Build and deploy (no compression)" @echo "" + @echo "Release:" + @echo " make release TYPE=X Create release (patch/minor/major)" + @echo "" @echo "Housekeeping:" @echo " make clean Remove all build artifacts" @echo " make name Print release name" @@ -132,6 +135,11 @@ shell: name: @echo $(RELEASE_NAME) +# Create a release using git-flow +# Usage: make release TYPE=patch (or minor/major) +release: + @./scripts/release.sh $(TYPE) + # QA convenience targets (forward to Makefile.qa) test: @$(MAKE) -f Makefile.qa test diff --git a/VERSION b/VERSION new file mode 100644 index 00000000..ae39fab3 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +v0.0.0 diff --git a/scripts/release.sh b/scripts/release.sh new file mode 100755 index 00000000..20634952 --- /dev/null +++ b/scripts/release.sh @@ -0,0 +1,118 @@ +#!/bin/bash +set -e + +# Usage: ./scripts/release.sh [patch|minor|major] +# +# This script automates the git-flow release process: +# 1. Computes next version from latest tag +# 2. Prompts for confirmation +# 3. Creates git-flow release branch +# 4. Bumps VERSION file +# 5. Finishes release (merges to main and develop) +# 6. Pushes everything including tags +# +# After push, GitHub Actions will build and publish the release. + +TYPE="${1:-patch}" + +# Check prerequisites +if ! git flow version &>/dev/null; then + echo "Error: git-flow is not installed" + echo "Install with: brew install git-flow-avh" + exit 1 +fi + +if ! git config --get gitflow.branch.master &>/dev/null; then + echo "Error: git-flow not initialized in this repository" + echo "Run: git flow init" + exit 1 +fi + +if [[ ! "$TYPE" =~ ^(patch|minor|major)$ ]]; then + echo "Usage: $0 [patch|minor|major]" + echo "" + echo " patch - Bug fixes, minor changes (v1.0.0 → v1.0.1)" + echo " minor - New features, backwards compatible (v1.0.1 → v1.1.0)" + echo " major - Breaking changes (v1.1.0 → v2.0.0)" + exit 1 +fi + +# Get latest tag +LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0") +echo "Current version: $LATEST_TAG" + +# Parse version components +VERSION="${LATEST_TAG#v}" +IFS='.' read -r MAJOR MINOR PATCH <<< "$VERSION" + +# Compute next version +case "$TYPE" in + major) MAJOR=$((MAJOR + 1)); MINOR=0; PATCH=0 ;; + minor) MINOR=$((MINOR + 1)); PATCH=0 ;; + patch) PATCH=$((PATCH + 1)) ;; +esac + +NEXT_VERSION="v${MAJOR}.${MINOR}.${PATCH}" +echo "Next version: $NEXT_VERSION" +echo "" + +# Confirm +read -p "Proceed with release $NEXT_VERSION? [y/N] " -n 1 -r +echo +if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo "Aborted." + exit 1 +fi + +# Ensure we're on develop +CURRENT_BRANCH=$(git branch --show-current) +if [ "$CURRENT_BRANCH" != "develop" ]; then + echo "Error: Must be on develop branch (currently on $CURRENT_BRANCH)" + exit 1 +fi + +# Ensure develop is up to date with remote +echo "Checking remote sync..." +git fetch origin develop --quiet +LOCAL=$(git rev-parse develop) +REMOTE=$(git rev-parse origin/develop) +if [ "$LOCAL" != "$REMOTE" ]; then + echo "Error: Local develop is not in sync with origin/develop" + echo " Local: $LOCAL" + echo " Remote: $REMOTE" + echo "Please pull or push as needed." + exit 1 +fi + +# Ensure working directory is clean +if ! git diff-index --quiet HEAD --; then + echo "Error: Working directory has uncommitted changes" + exit 1 +fi + +# Start release +echo "" +echo "Starting release $NEXT_VERSION..." +git flow release start "$NEXT_VERSION" + +# Update VERSION file +echo "$NEXT_VERSION" > VERSION +git add VERSION +git commit -m "Bump version to $NEXT_VERSION" + +# Finish release (merges to main and develop, creates tag) +# Use GIT_MERGE_AUTOEDIT=no to avoid editor prompts +export GIT_MERGE_AUTOEDIT=no +git flow release finish -m "$NEXT_VERSION" "$NEXT_VERSION" + +# Push everything +echo "" +echo "Pushing to origin..." +git push origin main develop --tags + +echo "" +echo "Release $NEXT_VERSION complete!" +echo "GitHub Actions will now build and publish the release." +echo "" +echo "Monitor the build at:" +echo " https://github.com/lessui-hq/LessUI/actions" From c51b8f0699906792be9866be41d6605a37e4278e Mon Sep 17 00:00:00 2001 From: Nick Chapman Date: Sat, 20 Dec 2025 10:41:25 -0800 Subject: [PATCH 2/6] Undo build changes for rg35xxplus. --- workspace/rg35xxplus/Makefile | 2 +- workspace/rg35xxplus/init/Makefile | 2 +- workspace/rg35xxplus/platform/Makefile.env | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/workspace/rg35xxplus/Makefile b/workspace/rg35xxplus/Makefile index a44a67c1..e6a8c12f 100644 --- a/workspace/rg35xxplus/Makefile +++ b/workspace/rg35xxplus/Makefile @@ -37,7 +37,7 @@ early: $(REQUIRES_SDL2) $(REQUIRES_DTC) $(REQUIRES_FBSET) @mkdir -p other @cd $(REQUIRES_DTC) && CC=${CROSS_COMPILE}gcc $(MAKE) -s NO_PYTHON=1 dtc @cd $(REQUIRES_FBSET) && $(MAKE) -s - @cd $(REQUIRES_SDL2) && MAKEFLAGS=--no-print-directory CFLAGS="-O2 -march=armv8-a+crc -mtune=cortex-a53 -mcpu=cortex-a53 -ffast-math -ftree-vectorize" \ + @cd $(REQUIRES_SDL2) && MAKEFLAGS=--no-print-directory CFLAGS="-O2 -marm -mtune=cortex-a53 -mcpu=cortex-a53 -ffast-math -ftree-vectorize" \ ./configure CC=${CROSS_COMPILE}gcc --host=arm-buildroot-linux-gnueabihf \ --enable-arm-neon \ --disable-oss \ diff --git a/workspace/rg35xxplus/init/Makefile b/workspace/rg35xxplus/init/Makefile index a9e396d4..e8e4f33d 100644 --- a/workspace/rg35xxplus/init/Makefile +++ b/workspace/rg35xxplus/init/Makefile @@ -6,7 +6,7 @@ TARGET = init PRODUCT = $(TARGET).elf CC = $(CROSS_COMPILE)gcc -CFLAGS = -march=armv8-a -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard -mcpu=cortex-a53 +CFLAGS = -marm -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard -mcpu=cortex-a53 CFLAGS += -Wall -Wextra -Wsign-compare -Wshadow -Wnull-dereference -Wundef \ -Wno-unused-variable -Wno-unused-function -Wno-unused-parameter \ -Wno-cast-align -Wno-missing-field-initializers -Wno-format -Werror diff --git a/workspace/rg35xxplus/platform/Makefile.env b/workspace/rg35xxplus/platform/Makefile.env index ee0e5f1f..b625daa4 100644 --- a/workspace/rg35xxplus/platform/Makefile.env +++ b/workspace/rg35xxplus/platform/Makefile.env @@ -1,4 +1,4 @@ # rg35xx -ARCH = -march=armv8-a -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard -mcpu=cortex-a53 +ARCH = -marm -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard -mcpu=cortex-a53 LIBS = -flto SDL = SDL2 \ No newline at end of file From 86c6aa6f54188e3e9ebc630f4d587aa7691c7ebd Mon Sep 17 00:00:00 2001 From: Nick Chapman Date: Sat, 20 Dec 2025 10:41:52 -0800 Subject: [PATCH 3/6] Use proper version numbers in dev and release. --- .github/workflows/release.yml | 12 +++++++++++- Makefile | 24 +++++++++++++++++++----- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fd5ad89e..99d74973 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -47,6 +47,8 @@ jobs: - name: Build all platforms run: make all + env: + CI_RELEASE: ${{ startsWith(github.ref, 'refs/tags/') }} - name: Verify build artifacts run: | @@ -57,6 +59,12 @@ jobs: echo "Found artifacts:" ls -la releases/*.zip + - name: Generate checksums + run: | + cd releases + sha256sum *.zip > SHA256SUMS + cat SHA256SUMS + - name: Get version id: version run: | @@ -85,6 +93,8 @@ jobs: uses: softprops/action-gh-release@v2 with: name: LessUI ${{ steps.version.outputs.version }} - files: releases/*.zip + files: | + releases/*.zip + releases/SHA256SUMS generate_release_notes: true make_latest: "true" diff --git a/Makefile b/Makefile index bad5d203..32506ef7 100644 --- a/Makefile +++ b/Makefile @@ -34,15 +34,27 @@ endif ########################################################### # Release versioning +# +# CI builds (GitHub Actions): Use VERSION file (e.g., v0.0.1) +# Local dev builds: Use dev-YYYYMMDD format +# +# Output: +# - ZIP: LessUI-.zip +# - version.txt: \n BUILD_HASH := $(shell git rev-parse --short HEAD) export BUILD_HASH RELEASE_TIME := $(shell TZ=GMT date +%Y%m%d) -RELEASE_BETA = -RELEASE_BASE = LessUI-$(RELEASE_TIME)$(RELEASE_BETA) + +# Determine release name based on environment +ifeq ($(CI_RELEASE),true) +# CI release build (tag push): use VERSION file (semver) +RELEASE_VERSION := $(shell cat VERSION 2>/dev/null || echo "v0.0.0") +RELEASE_NAME = LessUI-$(RELEASE_VERSION) +else +# Local dev build: use dev-DATE format with collision detection +RELEASE_BASE = LessUI-dev-$(RELEASE_TIME) RELEASE_DOT := $(shell find ./releases/. -name "${RELEASE_BASE}-*.zip" 2>/dev/null | wc -l | sed 's/ //g') -# First build has no suffix, subsequent builds use -1, -2, etc. -# Check if unnumbered release exists, if so start numbering from RELEASE_DOT+1 RELEASE_SUFFIX := $(shell \ if [ "$(RELEASE_DOT)" = "0" ] && [ ! -f "./releases/${RELEASE_BASE}.zip" ]; then \ echo ""; \ @@ -52,6 +64,8 @@ RELEASE_SUFFIX := $(shell \ echo "-$$(($(RELEASE_DOT) + 1))"; \ fi) RELEASE_NAME = $(RELEASE_BASE)$(RELEASE_SUFFIX) +RELEASE_VERSION = dev-$(RELEASE_TIME)$(RELEASE_SUFFIX) +endif ########################################################### # Build configuration @@ -333,7 +347,7 @@ stage: tidy @echo "# ----------------------------------------------------" @mkdir -p ./build/PAYLOAD/.system @rsync -a ./build/SYSTEM/ ./build/PAYLOAD/.system/ - @cd ./build/PAYLOAD/.system && printf '%s\n%s\n' "$(RELEASE_NAME)" "$(BUILD_HASH)" > version.txt + @cd ./build/PAYLOAD/.system && printf '%s\n%s\n' "$(RELEASE_VERSION)" "$(BUILD_HASH)" > version.txt @./commits.sh > ./build/PAYLOAD/.system/commits.txt @mkdir -p ./build/PAYLOAD/.system/common/cores/arm32 ./build/PAYLOAD/.system/common/cores/arm64 @jq -r '.cores[].core' ./workspace/all/paks/Emus/cores.json | sort -u | while read core; do \ From 092375d656e63bed5eec02fa42ec1764537b70f6 Mon Sep 17 00:00:00 2001 From: Nick Chapman Date: Sat, 20 Dec 2025 10:54:14 -0800 Subject: [PATCH 4/6] Simplify 7z usage in build and release. --- .github/workflows/release.yml | 7 +------ Makefile | 6 +++--- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 99d74973..411e081c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -38,12 +38,7 @@ jobs: - name: Install dependencies run: | sudo apt-get update - sudo apt-get install -y jq rsync - # Install 7-Zip standalone (7zz) - wget -q https://www.7-zip.org/a/7z2408-linux-arm64.tar.xz - tar -xf 7z2408-linux-arm64.tar.xz - sudo mv 7zz /usr/local/bin/ - rm -f 7z2408-linux-arm64.tar.xz + sudo apt-get install -y jq rsync 7zip - name: Build all platforms run: make all diff --git a/Makefile b/Makefile index 32506ef7..b40c93dc 100644 --- a/Makefile +++ b/Makefile @@ -372,12 +372,12 @@ compress: rm -rf ./workspace/readmes; \ fi @if [ -d ./build/PAYLOAD/.tmp_update ]; then \ - cd ./build/PAYLOAD && 7zz a -t7z -mx=9 -md=16m -mmt=on LessUI.7z .system .tmp_update; \ + cd ./build/PAYLOAD && 7z a -t7z -mx=9 -md=16m -mmt=on LessUI.7z .system .tmp_update; \ else \ - cd ./build/PAYLOAD && 7zz a -t7z -mx=9 -md=16m -mmt=on LessUI.7z .system; \ + cd ./build/PAYLOAD && 7z a -t7z -mx=9 -md=16m -mmt=on LessUI.7z .system; \ fi @mv ./build/PAYLOAD/LessUI.7z ./build/BASE - @cd ./build/BASE && 7zz a -tzip -mmt=on -mx=5 ../../releases/$(RELEASE_NAME).zip Tools Bios Roms Saves bin miyoo miyoo354 trimui rg35xx rg35xxplus miyoo355 magicx miyoo285 em_ui.sh LessUI.7z README.txt + @cd ./build/BASE && 7z a -tzip -mmt=on -mx=5 ../../releases/$(RELEASE_NAME).zip Tools Bios Roms Saves bin miyoo miyoo354 trimui rg35xx rg35xxplus miyoo355 magicx miyoo285 em_ui.sh LessUI.7z README.txt @echo "$(RELEASE_NAME)" > ./build/latest.txt # Package: full release build (stage + compress) From b5c8310367b0572a3f5f0923be7b5ee9d5f6e391 Mon Sep 17 00:00:00 2001 From: Nick Chapman Date: Sat, 20 Dec 2025 10:57:41 -0800 Subject: [PATCH 5/6] Review fixes. --- .github/workflows/release.yml | 8 +++--- scripts/release.sh | 47 +++++++++++++++++++++++++++++++++-- 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 411e081c..4650a010 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -17,7 +17,7 @@ permissions: id-token: write concurrency: - group: release + group: release-${{ github.ref }} cancel-in-progress: false jobs: @@ -70,13 +70,13 @@ jobs: fi - name: Attest build provenance - if: ${{ !inputs.dry_run }} + if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }} uses: actions/attest-build-provenance@v3 with: subject-path: releases/*.zip - name: Upload build artifacts - if: ${{ inputs.dry_run }} + if: ${{ github.event_name == 'workflow_dispatch' && inputs.dry_run }} uses: actions/upload-artifact@v4 with: name: release-${{ steps.version.outputs.version }} @@ -84,7 +84,7 @@ jobs: retention-days: 7 - name: Create GitHub Release - if: ${{ !inputs.dry_run }} + if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }} uses: softprops/action-gh-release@v2 with: name: LessUI ${{ steps.version.outputs.version }} diff --git a/scripts/release.sh b/scripts/release.sh index 20634952..3d21b59d 100755 --- a/scripts/release.sh +++ b/scripts/release.sh @@ -90,11 +90,48 @@ if ! git diff-index --quiet HEAD --; then exit 1 fi +# Get the main branch name from git-flow config +MAIN_BRANCH=$(git config --get gitflow.branch.master) +if [ -z "$MAIN_BRANCH" ]; then + echo "Error: Could not determine main branch from git-flow config" + exit 1 +fi + +# Ensure main branch exists and is in sync with remote +echo "Checking $MAIN_BRANCH branch..." +git fetch origin "$MAIN_BRANCH" --quiet +if ! git rev-parse "$MAIN_BRANCH" &>/dev/null; then + echo "Error: Branch '$MAIN_BRANCH' does not exist locally" + exit 1 +fi +MAIN_LOCAL=$(git rev-parse "$MAIN_BRANCH") +MAIN_REMOTE=$(git rev-parse "origin/$MAIN_BRANCH" 2>/dev/null) || true +if [ -n "$MAIN_REMOTE" ] && [ "$MAIN_LOCAL" != "$MAIN_REMOTE" ]; then + echo "Error: Local $MAIN_BRANCH is not in sync with origin/$MAIN_BRANCH" + echo " Local: $MAIN_LOCAL" + echo " Remote: $MAIN_REMOTE" + echo "Please pull or push as needed." + exit 1 +fi + +# Cleanup function to handle failures after release branch is created +cleanup_release() { + echo "" + echo "Error: Release failed. Cleaning up..." + echo "You may need to manually clean up with:" + echo " git flow release delete $NEXT_VERSION" + echo " git checkout develop" + exit 1 +} + # Start release echo "" echo "Starting release $NEXT_VERSION..." git flow release start "$NEXT_VERSION" +# Set trap to handle failures after release branch is created +trap cleanup_release ERR + # Update VERSION file echo "$NEXT_VERSION" > VERSION git add VERSION @@ -105,14 +142,20 @@ git commit -m "Bump version to $NEXT_VERSION" export GIT_MERGE_AUTOEDIT=no git flow release finish -m "$NEXT_VERSION" "$NEXT_VERSION" +# Clear trap after successful finish +trap - ERR + # Push everything echo "" echo "Pushing to origin..." -git push origin main develop --tags +git push origin "$MAIN_BRANCH" develop --tags + +# Get repository URL from git remote +REPO_URL=$(git remote get-url origin | sed -E 's/.*github.com[:\/](.*)\.git/\1/' | sed 's/\.git$//') echo "" echo "Release $NEXT_VERSION complete!" echo "GitHub Actions will now build and publish the release." echo "" echo "Monitor the build at:" -echo " https://github.com/lessui-hq/LessUI/actions" +echo " https://github.com/${REPO_URL}/actions" From 423f5a33044924a4576da5373050baa04ecd32fe Mon Sep 17 00:00:00 2001 From: Nick Chapman Date: Sat, 20 Dec 2025 11:03:49 -0800 Subject: [PATCH 6/6] Add release convenience methods. --- Makefile | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index b40c93dc..5b64a1b6 100644 --- a/Makefile +++ b/Makefile @@ -92,7 +92,7 @@ endif export OPT_FLAGS export LOG_FLAGS -.PHONY: help build test coverage lint format dev dev-run dev-run-4x3 dev-run-16x9 dev-clean all shell name clean setup special tidy stage compress package dev-deploy dev-build-deploy release +.PHONY: help build test coverage lint format dev dev-run dev-run-4x3 dev-run-16x9 dev-clean all shell name clean setup special tidy stage compress package dev-deploy dev-build-deploy release release-patch release-minor release-major export MAKEFLAGS=--no-print-directory @@ -130,7 +130,9 @@ help: @echo " make dev-build-deploy Build and deploy (no compression)" @echo "" @echo "Release:" - @echo " make release TYPE=X Create release (patch/minor/major)" + @echo " make release-patch Create patch release (v1.0.0 → v1.0.1)" + @echo " make release-minor Create minor release (v1.0.1 → v1.1.0)" + @echo " make release-major Create major release (v1.1.0 → v2.0.0)" @echo "" @echo "Housekeeping:" @echo " make clean Remove all build artifacts" @@ -150,7 +152,17 @@ name: @echo $(RELEASE_NAME) # Create a release using git-flow -# Usage: make release TYPE=patch (or minor/major) +# Usage: make release-patch (or release-minor/release-major) +release-patch: + @./scripts/release.sh patch + +release-minor: + @./scripts/release.sh minor + +release-major: + @./scripts/release.sh major + +# Legacy alias (deprecated) release: @./scripts/release.sh $(TYPE)