Skip to content

Commit dea082f

Browse files
author
strausr
committed
fix: add semantic-release note when creating initial tag and when tag exists
- Create initial tag step: add git note {"channels":["beta"]} and push refs/notes/semantic-release-v1.0.0-beta.1 so semantic-release treats v1.0.0-beta.1 as last release - Release step prepare: only move tag when not in 'git tag --merged main'; always add and push the note when tag exists to avoid 'tag already exists' error
1 parent 4af9d7d commit dea082f

File tree

1 file changed

+17
-11
lines changed

1 file changed

+17
-11
lines changed

.github/workflows/release.yml

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ jobs:
5353
with:
5454
ref: main
5555
fetch-depth: 0
56+
fetch-tags: true
5657
token: ${{ secrets.RELEASE_TOKEN }}
5758

5859
- name: Setup git branch
@@ -99,8 +100,12 @@ jobs:
99100
run: |
100101
if ! git rev-parse --verify "v1.0.0-beta.1" >/dev/null 2>&1; then
101102
echo "Creating initial tag v1.0.0-beta.1"
102-
git tag -a "v1.0.0-beta.1" -m "chore: initial beta release"
103+
COMMIT=$(git rev-parse HEAD)
104+
git tag -a "v1.0.0-beta.1" "$COMMIT" -m "chore: initial beta release"
103105
git push origin "v1.0.0-beta.1" || echo "Tag push failed (may not have permission or tag exists)"
106+
# semantic-release treats a tag as "last release" for main (beta) only if it has this note
107+
git notes --ref semantic-release-v1.0.0-beta.1 add -f -m '{"channels":["beta"]}' v1.0.0-beta.1
108+
git push origin refs/notes/semantic-release-v1.0.0-beta.1
104109
else
105110
echo "Tag v1.0.0-beta.1 already exists"
106111
fi
@@ -145,24 +150,25 @@ jobs:
145150
npx semantic-release --dry-run 2>&1 | tee semantic-release.log || true
146151
grep -oE "The next release version is [^[:space:]]+" semantic-release.log 2>/dev/null | sed 's/The next release version is //' > next-version.txt || echo "" > next-version.txt
147152
else
148-
# Prepare v1.0.0-beta.1 IN THIS SAME STEP so semantic-release sees it as last release (avoids "tag already exists").
149-
# semantic-release uses "git tag --merged main" and git notes; tag must be in main history and have note.
153+
# Prepare v1.0.0-beta.1 so semantic-release sees it as last release (avoids "tag already exists").
154+
# semantic-release uses "git tag --merged main" and git notes ref semantic-release-<tag>; tag must be in main and have {"channels":["beta"]}.
150155
if git rev-parse --verify v1.0.0-beta.1 >/dev/null 2>&1; then
151-
RELEASE_COMMIT=$(git log main -1 --format=%H --grep="chore(release): 1.0.0-beta.1" 2>/dev/null || true)
152-
if [ -z "$RELEASE_COMMIT" ]; then
153-
RELEASE_COMMIT=$(git merge-base main origin/master 2>/dev/null || git rev-parse HEAD~1)
154-
fi
155-
CURRENT=$(git rev-parse v1.0.0-beta.1)
156-
if [ "$CURRENT" != "$RELEASE_COMMIT" ]; then
156+
if ! git tag --merged main | grep -qx v1.0.0-beta.1; then
157+
RELEASE_COMMIT=$(git log main -1 --format=%H --grep="chore(release): 1.0.0-beta.1" 2>/dev/null || true)
158+
if [ -z "$RELEASE_COMMIT" ]; then
159+
RELEASE_COMMIT=$(git merge-base main origin/master 2>/dev/null || git rev-parse HEAD~1)
160+
fi
157161
git tag -d v1.0.0-beta.1 2>/dev/null || true
158162
git tag -a v1.0.0-beta.1 "$RELEASE_COMMIT" -m "chore: 1.0.0-beta.1"
159163
git push origin v1.0.0-beta.1 --force
160-
echo "Moved v1.0.0-beta.1 from $CURRENT to $RELEASE_COMMIT."
164+
echo "Moved v1.0.0-beta.1 to $RELEASE_COMMIT (was not in main history)."
161165
fi
162166
git notes --ref semantic-release-v1.0.0-beta.1 add -f -m '{"channels":["beta"]}' v1.0.0-beta.1
163167
git push origin refs/notes/semantic-release-v1.0.0-beta.1
164168
git fetch origin '+refs/tags/*:refs/tags/*' '+refs/notes/*:refs/notes/*'
165-
echo "Prepared v1.0.0-beta.1; running semantic-release..."
169+
echo "Prepared v1.0.0-beta.1; state before semantic-release:"
170+
echo " Tags merged into main: $(git tag --merged main | tr '\n' ' ')"
171+
git notes --ref semantic-release-v1.0.0-beta.1 show v1.0.0-beta.1 2>/dev/null && echo " Note OK" || echo " (no note for v1.0.0-beta.1)"
166172
fi
167173
npx semantic-release
168174
fi

0 commit comments

Comments
 (0)