Skip to content

Commit dc21199

Browse files
author
strausr
committed
fix: migrate v1.0.0-beta.1 tag for semantic-release (one-time)
1 parent 747f2ac commit dc21199

File tree

1 file changed

+27
-27
lines changed

1 file changed

+27
-27
lines changed

.github/workflows/release.yml

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -95,20 +95,39 @@ jobs:
9595
git notes --ref semantic-release-v1.0.0-beta.1 add -f -m '{"channels":["beta"]}' v1.0.0-beta.1
9696
echo "Added semantic-release note to v1.0.0-beta.1 (local only for dry run)."
9797
98-
- name: Create initial tag if needed
98+
# One-time migration: v1.0.0-beta.1 existed before semantic-release was configured
99+
# with channel notes. Semantic-release prepares all other versions itself (tags + notes).
100+
# This step only fixes that one tag so semantic-release can see it as "last release".
101+
- name: Migrate v1.0.0-beta.1 tag for semantic-release (one-time)
99102
if: github.event.inputs.dry_run != 'true'
100103
run: |
104+
set -e
105+
echo "=== Migrating v1.0.0-beta.1 so semantic-release sees it as last release ==="
106+
# semantic-release treats a tag as "last release" only if: 1) tag is in "git tag --merged main", 2) tag has note {"channels":["beta"]} in ref semantic-release-<tag>
101107
if ! git rev-parse --verify "v1.0.0-beta.1" >/dev/null 2>&1; then
102-
echo "Creating initial tag v1.0.0-beta.1"
103-
COMMIT=$(git rev-parse HEAD)
104-
git tag -a "v1.0.0-beta.1" "$COMMIT" -m "chore: initial beta release"
105-
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
108+
echo "Tag v1.0.0-beta.1 does not exist; creating at HEAD."
109+
git tag -a "v1.0.0-beta.1" HEAD -m "chore: initial beta release"
110+
git push origin "v1.0.0-beta.1"
107111
git notes --ref semantic-release-v1.0.0-beta.1 add -f -m '{"channels":["beta"]}' v1.0.0-beta.1
108112
git push origin refs/notes/semantic-release-v1.0.0-beta.1
113+
echo "Created v1.0.0-beta.1 and note."
109114
else
110-
echo "Tag v1.0.0-beta.1 already exists"
115+
echo "Tag v1.0.0-beta.1 exists."
116+
if ! git tag --merged main | grep -qx v1.0.0-beta.1; then
117+
RELEASE_COMMIT=$(git log main -1 --format=%H --grep="chore(release): 1.0.0-beta.1" 2>/dev/null || true)
118+
[ -z "$RELEASE_COMMIT" ] && RELEASE_COMMIT=$(git merge-base main origin/master 2>/dev/null || git rev-parse HEAD~1)
119+
echo "Moving tag into main history (was not merged into main) to $RELEASE_COMMIT"
120+
git tag -d v1.0.0-beta.1 2>/dev/null || true
121+
git tag -a v1.0.0-beta.1 "$RELEASE_COMMIT" -m "chore: 1.0.0-beta.1"
122+
git push origin v1.0.0-beta.1 --force
123+
fi
124+
git notes --ref semantic-release-v1.0.0-beta.1 add -f -m '{"channels":["beta"]}' v1.0.0-beta.1
125+
git push origin refs/notes/semantic-release-v1.0.0-beta.1
126+
git fetch origin '+refs/tags/*:refs/tags/*' '+refs/notes/*:refs/notes/*'
127+
echo "Tags merged into main: $(git tag --merged main | tr '\n' ' ')"
128+
git notes --ref semantic-release-v1.0.0-beta.1 show v1.0.0-beta.1 2>/dev/null && echo "Note present for v1.0.0-beta.1" || echo "WARN: no note for v1.0.0-beta.1"
111129
fi
130+
echo "=== Done; semantic-release will see v1.0.0-beta.1 as last release ==="
112131
113132
- name: Dry run mode notice
114133
if: github.event.inputs.dry_run == 'true'
@@ -150,26 +169,7 @@ jobs:
150169
npx semantic-release --dry-run 2>&1 | tee semantic-release.log || true
151170
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
152171
else
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"]}.
155-
if git rev-parse --verify v1.0.0-beta.1 >/dev/null 2>&1; 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
161-
git tag -d v1.0.0-beta.1 2>/dev/null || true
162-
git tag -a v1.0.0-beta.1 "$RELEASE_COMMIT" -m "chore: 1.0.0-beta.1"
163-
git push origin v1.0.0-beta.1 --force
164-
echo "Moved v1.0.0-beta.1 to $RELEASE_COMMIT (was not in main history)."
165-
fi
166-
git notes --ref semantic-release-v1.0.0-beta.1 add -f -m '{"channels":["beta"]}' v1.0.0-beta.1
167-
git push origin refs/notes/semantic-release-v1.0.0-beta.1
168-
git fetch origin '+refs/tags/*:refs/tags/*' '+refs/notes/*:refs/notes/*'
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)"
172-
fi
172+
# Tag + note are prepared in "Prepare v1.0.0-beta.1 for semantic-release" step
173173
npx semantic-release
174174
fi
175175

0 commit comments

Comments
 (0)