diff --git a/.github/scripts/check-version.sh b/.github/scripts/check-version.sh new file mode 100755 index 0000000000..6ea4d154be --- /dev/null +++ b/.github/scripts/check-version.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +# Get current version +CURRENT_VERSION=$1 +if [ -z "$CURRENT_VERSION" ]; then + echo "Error: Failed to get current version" + exit 1 +fi + +# Get the latest version from GitHub Releases +API_RESPONSE=$(curl -s "https://api.github.com/repos/GreptimeTeam/greptimedb/releases/latest") + +if [ -z "$API_RESPONSE" ] || [ "$(echo "$API_RESPONSE" | jq -r '.message')" = "Not Found" ]; then + echo "Error: Failed to fetch latest version from GitHub" + exit 1 +fi + +# Get the latest version +LATEST_VERSION=$(echo "$API_RESPONSE" | jq -r '.tag_name') + +if [ -z "$LATEST_VERSION" ] || [ "$LATEST_VERSION" = "null" ]; then + echo "Error: No valid version found in GitHub releases" + exit 1 +fi + +# Cleaned up version number format (removed possible 'v' prefix and -nightly suffix) +CLEAN_CURRENT=$(echo "$CURRENT_VERSION" | sed 's/^v//' | sed 's/-nightly-.*//') +CLEAN_LATEST=$(echo "$LATEST_VERSION" | sed 's/^v//' | sed 's/-nightly-.*//') + +echo "Current version: $CLEAN_CURRENT" +echo "Latest release version: $CLEAN_LATEST" + +# Use sort -V to compare versions +HIGHER_VERSION=$(printf "%s\n%s" "$CLEAN_CURRENT" "$CLEAN_LATEST" | sort -V | tail -n1) + +if [ "$HIGHER_VERSION" = "$CLEAN_CURRENT" ]; then + echo "Current version ($CLEAN_CURRENT) is NEWER than or EQUAL to latest ($CLEAN_LATEST)" + echo "should-push-latest-tag=true" >> $GITHUB_OUTPUT +else + echo "Current version ($CLEAN_CURRENT) is OLDER than latest ($CLEAN_LATEST)" + echo "should-push-latest-tag=false" >> $GITHUB_OUTPUT +fi diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 42828b7f01..fe7afa661c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -110,6 +110,8 @@ jobs: # The 'version' use as the global tag name of the release workflow. version: ${{ steps.create-version.outputs.version }} + + should-push-latest-tag: ${{ steps.check-version.outputs.should-push-latest-tag }} steps: - name: Checkout uses: actions/checkout@v4 @@ -135,6 +137,11 @@ jobs: GITHUB_REF_NAME: ${{ github.ref_name }} NIGHTLY_RELEASE_PREFIX: ${{ env.NIGHTLY_RELEASE_PREFIX }} + - name: Check version + id: check-version + run: | + ./.github/scripts/check-version.sh "${{ steps.create-version.outputs.version }}" + - name: Allocate linux-amd64 runner if: ${{ inputs.build_linux_amd64_artifacts || github.event_name == 'push' || github.event_name == 'schedule' }} uses: ./.github/actions/start-runner @@ -314,7 +321,7 @@ jobs: image-registry-username: ${{ secrets.DOCKERHUB_USERNAME }} image-registry-password: ${{ secrets.DOCKERHUB_TOKEN }} version: ${{ needs.allocate-runners.outputs.version }} - push-latest-tag: ${{ github.ref_type == 'tag' && !contains(github.ref_name, 'nightly') && github.event_name != 'schedule' }} + push-latest-tag: ${{ needs.allocate-runners.outputs.should-push-latest-tag == 'true' && github.ref_type == 'tag' && !contains(github.ref_name, 'nightly') && github.event_name != 'schedule' }} - name: Set build image result id: set-build-image-result @@ -361,7 +368,7 @@ jobs: dev-mode: false upload-to-s3: true update-version-info: true - push-latest-tag: ${{ github.ref_type == 'tag' && !contains(github.ref_name, 'nightly') && github.event_name != 'schedule' }} + push-latest-tag: ${{ needs.allocate-runners.outputs.should-push-latest-tag == 'true' && github.ref_type == 'tag' && !contains(github.ref_name, 'nightly') && github.event_name != 'schedule' }} publish-github-release: name: Create GitHub release and upload artifacts