1111 - " major"
1212 - " minor"
1313 - " patch"
14+ - " retag"
1415 default : " minor"
1516 dry_run :
1617 description : Perform the release dry-run
@@ -56,14 +57,14 @@ jobs:
5657 echo "Release type: $TYPE"
5758
5859 # Branch validation
59- if [ "$TYPE" != "patch" ]; then
60- if [ " $BRANCH" != "main" ]; then
61- echo "::error::Major or minor releases can only be performed from 'main' branch "
60+ if [ "$TYPE" == "patch" ] || [ "$TYPE" == "retag " ]; then
61+ if [[ ! $BRANCH =~ ^release/[0-9]+\.[0-9]+\._$ ] ]; then
62+ echo "::error::${TYPE^} can only be performed from 'release/*' branches (format: release/X.Y._) "
6263 exit 1
6364 fi
6465 else
65- if [[ ! $BRANCH =~ ^release/[0-9]+\.[0-9]+\._$ ] ]; then
66- echo "::error::Patch releases can only be performed from 'release/*' branches (format: release/X.Y._) "
66+ if [ " $BRANCH" != "main" ]; then
67+ echo "::error::Major or minor releases can only be performed from 'main' branch "
6768 exit 1
6869 fi
6970 fi
@@ -104,6 +105,19 @@ jobs:
104105 else
105106 RELEASE_VERSION="$BASE"
106107 fi
108+ elif [ "$TYPE" == "retag" ]; then
109+ # Retag reuses the current version; tag must already exist
110+ RELEASE_VERSION="$BASE"
111+ if ! git rev-parse "v_${RELEASE_VERSION}" >/dev/null 2>&1; then
112+ echo "::error::Tag v_${RELEASE_VERSION} does not exist. Use a normal release to create a new tag."
113+ exit 1
114+ fi
115+ # Refuse if the GitHub release is already public
116+ IS_DRAFT=$(gh release view "v_${RELEASE_VERSION}" --json isDraft --jq '.isDraft' 2>/dev/null || echo "not-found")
117+ if [ "$IS_DRAFT" == "false" ]; then
118+ echo "::error::GitHub release v_${RELEASE_VERSION} is already public. Retagging is not allowed."
119+ exit 1
120+ fi
107121 else
108122 # PATCH always increments
109123 RELEASE_VERSION="$MAJOR.$MINOR.$((PATCH + 1))"
@@ -112,8 +126,8 @@ jobs:
112126 # Compute release branch
113127 RELEASE_BRANCH="release/${RELEASE_VERSION%.*}._"
114128
115- # Check if tag already exists
116- if git rev-parse "v_${RELEASE_VERSION}" >/dev/null 2>&1; then
129+ # Check if tag already exists (skip for retag, which requires it to exist)
130+ if [ "$TYPE" != "retag" ] && git rev-parse "v_${RELEASE_VERSION}" >/dev/null 2>&1; then
117131 echo "::error::Tag v_${RELEASE_VERSION} already exists"
118132 exit 1
119133 fi
@@ -137,7 +151,7 @@ jobs:
137151
138152 pre-release-tests :
139153 needs : validate-inputs
140- if : ${{ inputs.dry_run != true && inputs.skip_tests != true }}
154+ if : ${{ inputs.dry_run != true && inputs.skip_tests != true && inputs.release_type != 'retag' }}
141155 uses : ./.github/workflows/test_workflow.yml
142156 with :
143157 configuration : ' ["debug", "asan"]'
@@ -148,7 +162,7 @@ jobs:
148162 runs-on : ubuntu-latest
149163 steps :
150164 - name : Check test results
151- if : ${{ inputs.dry_run != true && inputs.skip_tests != true && needs.pre-release-tests.result != 'success' }}
165+ if : ${{ inputs.dry_run != true && inputs.skip_tests != true && inputs.release_type != 'retag' && needs.pre-release-tests.result != 'success' }}
152166 run : |
153167 echo "::error::Pre-release tests failed. Cannot proceed with release."
154168 exit 1
0 commit comments