diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..be4b952 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,72 @@ +name: Release + +on: + workflow_dispatch: + inputs: + bump: + description: Version bump type + required: true + default: patch + type: choice + options: + - patch + - minor + - major + +jobs: + release: + runs-on: ubuntu-latest-slim + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Determine new version + id: version + run: | + # Get the latest semver tag + LATEST_TAG=$(git tag --list 'v[0-9]*.[0-9]*.[0-9]*' --sort=-v:refname | head -n1) + if [ -z "$LATEST_TAG" ]; then + echo "No existing version tag found" + exit 1 + fi + + # Strip leading 'v' and split into components + VERSION="${LATEST_TAG#v}" + IFS='.' read -r MAJOR MINOR PATCH <<< "$VERSION" + + case "${{ inputs.bump }}" in + major) + MAJOR=$((MAJOR + 1)) + MINOR=0 + PATCH=0 + ;; + minor) + MINOR=$((MINOR + 1)) + PATCH=0 + ;; + patch) + PATCH=$((PATCH + 1)) + ;; + esac + + NEW_VERSION="v${MAJOR}.${MINOR}.${PATCH}" + echo "previous=$LATEST_TAG" >> "$GITHUB_OUTPUT" + echo "new=$NEW_VERSION" >> "$GITHUB_OUTPUT" + echo "major=v${MAJOR}" >> "$GITHUB_OUTPUT" + echo "Bumping $LATEST_TAG -> $NEW_VERSION" + + - name: Create GitHub release + run: | + gh release create "${{ steps.version.outputs.new }}" \ + --generate-notes \ + --notes-start-tag "${{ steps.version.outputs.previous }}" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Update major version tag + run: | + git tag -f "${{ steps.version.outputs.major }}" "${{ steps.version.outputs.new }}" + git push -f origin "${{ steps.version.outputs.major }}"