|
53 | 53 | with: |
54 | 54 | ref: main |
55 | 55 | fetch-depth: 0 |
| 56 | + fetch-tags: true |
56 | 57 | token: ${{ secrets.RELEASE_TOKEN }} |
57 | 58 |
|
58 | 59 | - name: Setup git branch |
@@ -99,8 +100,12 @@ jobs: |
99 | 100 | run: | |
100 | 101 | if ! git rev-parse --verify "v1.0.0-beta.1" >/dev/null 2>&1; then |
101 | 102 | 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" |
103 | 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 |
| 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 |
104 | 109 | else |
105 | 110 | echo "Tag v1.0.0-beta.1 already exists" |
106 | 111 | fi |
@@ -145,24 +150,25 @@ jobs: |
145 | 150 | npx semantic-release --dry-run 2>&1 | tee semantic-release.log || true |
146 | 151 | 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 |
147 | 152 | 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"]}. |
150 | 155 | 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 |
157 | 161 | git tag -d v1.0.0-beta.1 2>/dev/null || true |
158 | 162 | git tag -a v1.0.0-beta.1 "$RELEASE_COMMIT" -m "chore: 1.0.0-beta.1" |
159 | 163 | 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)." |
161 | 165 | fi |
162 | 166 | git notes --ref semantic-release-v1.0.0-beta.1 add -f -m '{"channels":["beta"]}' v1.0.0-beta.1 |
163 | 167 | git push origin refs/notes/semantic-release-v1.0.0-beta.1 |
164 | 168 | 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)" |
166 | 172 | fi |
167 | 173 | npx semantic-release |
168 | 174 | fi |
|
0 commit comments