diff --git a/.github/scripts/validate_version.sh b/.github/scripts/validate_version.sh new file mode 100755 index 00000000..36f1b693 --- /dev/null +++ b/.github/scripts/validate_version.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +set -e + +if [ $# -ne 1 ]; then + echo "Usage: $0 " + echo "Example: $0 3.6.4" + exit 1 +fi + +version="$1" + +echo "Validating version: $version" + +if [[ ! $version =~ ^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(-((0|[1-9][0-9]*|[0-9]*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9][0-9]*|[0-9]*[a-zA-Z-][0-9a-zA-Z-]*))*))?(\+([0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*))?$ ]]; then + echo "Error: Invalid semver format: \"$version\". Must be something like 1.2.3 without leading \"v\"" + exit 1 +fi + +echo "✓ Valid semver format" + +existing_tags=$(git tag --sort=-version:refname) + +if [ -z "$existing_tags" ]; then + echo "No existing versions found, allowing version $version" + exit 0 +fi + +if echo "$existing_tags" | grep -q "^v$version$"; then + echo "Error: Version $version already exists as a release" + exit 1 +fi + +latest_version=$(echo "$existing_tags" | head -1 | sed 's/^v//') +echo "Latest existing version: $latest_version" +echo "Proposed version: $version" + +if [ "$(printf '%s\n%s\n' "$latest_version" "$version" | sort -V | tail -1)" = "$version" ] && [ "$latest_version" != "$version" ]; then + echo "✓ Version $version is higher than latest version $latest_version" + exit 0 +else + echo "Error: Version $version is not higher than the latest version $latest_version" + exit 1 +fi diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index f1f0b7cf..9e189ccf 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -24,6 +24,11 @@ jobs: enable_alpha: ${{ steps.check.outputs.enable_alpha }} goreleaser_config: ${{ steps.check.outputs.goreleaser_config }} steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Check input id: check run: | @@ -31,22 +36,16 @@ jobs: enable_alpha="" goreleaser_config="" - # validate semver. - if [[ $version =~ ^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(-((0|[1-9][0-9]*|[0-9]*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9][0-9]*|[0-9]*[a-zA-Z-][0-9a-zA-Z-]*))*))?(\+([0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*))?$ ]]; then - echo "Valid release version: $version" - - if [[ $version =~ ^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$ ]]; then - # Release is something like x.y.z - enable_alpha="false" - goreleaser_config=".goreleaser-stable.yml" - else - # Release is something like x.y.z-something - enable_alpha="true" - goreleaser_config=".goreleaser-alpha.yml" - fi + bash ./.github/scripts/validate_version.sh "$version" + + if [[ $version =~ ^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$ ]]; then + # Release is something like x.y.z + enable_alpha="false" + goreleaser_config=".goreleaser-stable.yml" else - echo "Invalid semver: \"$version\". Must be something like 1.2.3 without leading \"v\"" - exit 1 + # Release is something like x.y.z-something + enable_alpha="true" + goreleaser_config=".goreleaser-alpha.yml" fi echo "enable_alpha=${enable_alpha}" >> "${GITHUB_OUTPUT}"