Skip to content

Create Release

Create Release #5

name: Create Release
on:
workflow_dispatch:
inputs:
release_version:
description: 'Version for the release (e.g., 1.0.0, 1.0.0-rc-1)'
required: false
release_alias:
description: 'Alias for the release (e.g., v1, v2)'
required: false
permissions:
contents: write
packages: write
jobs:
release:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v4
with:
fetch-depth: 0 # Ensure all history and tags are fetched
- name: Determine Release Version
if: ${{ github.event.inputs.release_version == '' }}
id: determine_version
run: |
if [ -z "${{ github.event.inputs.release_version }}" ]; then
echo "No release_version input provided. Computing next version..."
# Get the latest tag
latest_tag=$(git describe --tags $(git rev-list --tags --max-count=1) 2>/dev/null)
echo "Latest tag: $latest_tag"
if [ -z "$latest_tag" ]; then
# No previous tags exist; start with initial version
release_version="1.0.0"
else
# Extract version components based on Maven versioning rules
version_pattern='^([0-9]+)\.([0-9]+)\.([0-9]+)(-.+)?$'
if [[ "$latest_tag" =~ $version_pattern ]]; then
major="${BASH_REMATCH[1]}"
minor="${BASH_REMATCH[2]}"
patch="${BASH_REMATCH[3]}"
suffix="${BASH_REMATCH[4]}"
echo "Version components - Major: $major, Minor: $minor, Patch: $patch, Suffix: $suffix"
if [[ -n "$suffix" ]]; then
# Handle pre-release versions (e.g., -rc-1, -milestone-1)
suffix_pattern='^-(.+)-([0-9]+)$'
if [[ "$suffix" =~ $suffix_pattern ]]; then
suffix_type="${BASH_REMATCH[1]}"
suffix_number="${BASH_REMATCH[2]}"
next_suffix_number=$((suffix_number + 1))
release_version="${major}.${minor}.${patch}-${suffix_type}-${next_suffix_number}"
else
# Unrecognized suffix format; increment patch version
next_patch=$((patch + 1))
release_version="${major}.${minor}.${next_patch}"
fi
else
# No suffix; increment patch version
next_patch=$((patch + 1))
release_version="${major}.${minor}.${next_patch}"
fi
else
echo "Latest tag does not match expected version pattern. Defaulting to 1.0.0."
release_version="1.0.0"
fi
fi
else
echo "Using provided release_version input: ${{ github.event.inputs.release_version }}"
release_version="${{ github.event.inputs.release_version }}"
fi
echo "Release version: $release_version"
echo "release_version=$release_version" >> $GITHUB_OUTPUT
- name: Create Git Tag
run: |
git tag ${{ steps.determine_version.outputs.release_version }}
git push origin ${{ steps.determine_version.outputs.release_version }}
- name: Create Alias Tag (if specified)
if: ${{ github.event.inputs.release_alias != '' }}
run: |
git tag -f ${{ github.event.inputs.release_alias }} ${{ steps.determine_version.outputs.release_version }}
git push origin -f ${{ github.event.inputs.release_alias }}
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ steps.determine_version.outputs.release_version }}
name: ${{ steps.determine_version.outputs.release_version }}
generate_release_notes: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}