@@ -28,27 +28,38 @@ jobs:
2828 id : ver
2929 shell : bash
3030 run : |
31- # versionName
32- if [[ "${GITHUB_REF}" == refs/tags/v* ]]; then
33- VERSION_NAME="${GITHUB_REF#refs/tags/v}" # v1.4.2 -> 1.4.2
31+ REF="${GITHUB_REF}" # e.g. refs/heads/release/v0.1.0
32+
33+ if [[ "$REF" == refs/heads/release/* ]]; then
34+ # Extract version string after "release/"
35+ VERSION_TAG="${REF#refs/heads/release/}" # v0.1.0
36+ VERSION_NAME="${VERSION_TAG#v}" # 0.1.0
3437 else
38+ # Non-release branches: snapshot
3539 LAST_TAG="$(git describe --tags --abbrev=0 2>/dev/null || echo v0.0.0)"
3640 VERSION_NAME="${LAST_TAG#v}-SNAPSHOT+${GITHUB_SHA::7}"
41+ VERSION_TAG="v${VERSION_NAME%%-*}" # v0.0.0 for reference; won't be used to tag
3742 fi
38-
39- # A) From SemVer (x.y.z -> x*10000 + y*100 + z)
40- MAJOR="${VERSION_NAME%%.*}"; rest="${VERSION_NAME#*.}"
41- MINOR="${rest%%.*}"; PATCH="${rest#*.}"
42- PATCH="${PATCH%%-*}" # strip -SNAPSHOT if present
43+
44+ # Compute a safe, monotonic versionCode
45+ # Prefer SemVer encoding when VERSION_NAME is x.y.z (not snapshot)
46+ BASE_NAME="${VERSION_NAME%%-*}" # strip -SNAPSHOT if present
47+ IFS='.' read -r MAJOR MINOR PATCH <<< "$BASE_NAME"
48+
4349 if [[ "$MAJOR" =~ ^[0-9]+$ && "$MINOR" =~ ^[0-9]+$ && "$PATCH" =~ ^[0-9]+$ ]]; then
4450 VC=$((10#${MAJOR}*10000 + 10#${MINOR}*100 + 10#${PATCH}))
4551 else
46- # B) Fallback for snapshots: time-based code (UTC yyyymmddHH)
52+ # Fallback for snapshots or odd formats
4753 VC="$(date -u +%Y%m%d%H)"
4854 fi
49-
50- echo "version_name=${VERSION_NAME}" >> $GITHUB_OUTPUT
51- echo "version_code=${VC}" >> $GITHUB_OUTPUT
55+
56+ echo "version_name=$VERSION_NAME" >> "$GITHUB_OUTPUT"
57+ echo "version_code=$VC" >> "$GITHUB_OUTPUT"
58+ echo "version_tag=$VERSION_TAG" >> "$GITHUB_OUTPUT"
59+
60+ echo "Derived VERSION_NAME=$VERSION_NAME"
61+ echo "Derived VERSION_CODE=$VC"
62+ echo "Derived VERSION_TAG=$VERSION_TAG"
5263
5364 - name : Assemble Release Bundle
5465 env :
7283 keyPassword : ${{ secrets.KEY_PASSWORD }}
7384
7485 - name : Tag Release
86+ env :
87+ VERSION_TAG : ${{ steps.ver.outputs.version_tag }}
7588 run : |
76- version_name=${GITHUB_REF##*/}
89+ # Safety: don't recreate if already exists
90+ if git ls-remote --tags origin | grep -q "refs/tags/${VERSION_TAG}$"; then
91+ echo "Tag ${VERSION_TAG} already exists on remote. Skipping."
92+ exit 0
93+ fi
94+
95+ version_name=${VERSION_TAG}
7796 echo "Tagging release with tag $version_name"
7897 git tag $version_name release/$version_name
7998 git push origin --tags
0 commit comments