@@ -32,54 +32,19 @@ permissions:
3232 actions : write
3333
3434jobs :
35- release-please :
36- name : 📦 Release Please
37- runs-on : ubuntu-latest
38- outputs :
39- release_created : ${{ steps.release.outputs.release_created }}
40- releases_created : ${{ steps.release.outputs.releases_created }}
41- tag_name : ${{ steps.release.outputs.tag_name }}
42- version : ${{ steps.release.outputs.version }}
43- major : ${{ steps.release.outputs.major }}
44- minor : ${{ steps.release.outputs.minor }}
45- patch : ${{ steps.release.outputs.patch }}
46- sha : ${{ steps.release.outputs.sha }}
47- pr : ${{ steps.release.outputs.pr }}
48- prs_created : ${{ steps.release.outputs.prs_created }}
49- steps :
50- - name : 📥 Checkout source code
51- uses : actions/checkout@v4
52-
53- - name : 🤖 Run Release Please
54- id : release
55- uses : googleapis/release-please-action@v4
56- with :
57- token : ${{ secrets.GITHUB_TOKEN }}
58- config-file : release-please-config.json
59- manifest-file : .release-please-manifest.json
60- target-branch : ${{ github.ref_name }}
61-
62- - name : 📝 Log Release Info
63- if : ${{ steps.release.outputs.releases_created == 'true' }}
64- run : |
65- echo "🎉 Release created!"
66- echo "📦 Version: ${{ steps.release.outputs.version }}"
67- echo "🏷️ Tag: ${{ steps.release.outputs.tag_name }}"
68- echo "🔗 https://github.com/${{ github.repository }}/releases/tag/${{ steps.release.outputs.tag_name }}"
69-
7035 # =============================================================================
71- # Fallback: Handle Untagged Merged Release PRs
72- # =============================================================================
73- # If Release Please aborts due to "untagged merged release PRs", this job
74- # will find those PRs, create the missing tags, and create GitHub releases.
75- # This handles edge cases like when Claude changes the version in a Release PR.
36+ # Step 1: Handle Untagged Merged Release PRs FIRST
7637 # =============================================================================
38+ # This MUST run before release-please to prevent "untagged PRs outstanding" abort
39+ # Release Please aborts if it finds merged PRs with "autorelease: pending" label
40+ # By running this first, we ensure all untagged PRs are tagged before Release Please checks
7741 handle-untagged-releases :
78- name : 🔧 Handle Untagged Releases (Fallback)
79- needs : release-please
80- # Run if Release Please didn't create a release (might have aborted)
81- if : ${{ needs.release-please.outputs.releases_created != 'true' }}
42+ name : 🔧 Handle Untagged Releases (Pre-Check)
8243 runs-on : ubuntu-latest
44+ outputs :
45+ release_created : ${{ steps.process.outputs.release_created }}
46+ tag_name : ${{ steps.process.outputs.tag_name }}
47+ version : ${{ steps.process.outputs.version }}
8348 steps :
8449 - name : 📥 Checkout source code
8550 uses : actions/checkout@v4
12792 echo " SHA: $MERGE_SHA"
12893 echo " Tag: $TAG_NAME"
12994
130- # Check if tag already exists
13195 if gh api repos/${{ github.repository }}/git/refs/tags/$TAG_NAME 2>/dev/null; then
13296 echo "✅ Tag $TAG_NAME already exists"
13397 else
@@ -138,13 +102,14 @@ jobs:
138102 -f sha="$MERGE_SHA"
139103 fi
140104
141- # Check if release already exists
142105 if gh release view $TAG_NAME --repo ${{ github.repository }} 2>/dev/null; then
143106 echo "✅ Release $TAG_NAME already exists"
144107 else
145108 echo "🎉 Creating GitHub Release $TAG_NAME"
109+ RELEASE_CREATED=true
110+ LATEST_TAG="$TAG_NAME"
111+ LATEST_VERSION="$VERSION"
146112
147- # Extract changelog for this version
148113 CHANGELOG=$(awk -v ver="$VERSION" '
149114 /^## \[/ {
150115 if (found) exit
@@ -157,7 +122,6 @@ jobs:
157122 CHANGELOG="Release v$VERSION - See [CHANGELOG.md](https://github.com/${{ github.repository }}/blob/${{ github.ref_name }}/CHANGELOG.md) for details."
158123 fi
159124
160- # Create release notes file using printf (heredocs break YAML indentation)
161125 {
162126 echo "## 📦 Installation"
163127 echo ""
@@ -185,36 +149,88 @@ jobs:
185149 echo "$CHANGELOG"
186150 } > /tmp/release_notes.md
187151
188- # Create the release
189152 gh release create $TAG_NAME \
190153 --repo ${{ github.repository }} \
191154 --title "v$VERSION" \
192155 --notes-file /tmp/release_notes.md
193156 fi
194157
195- # Update label to autorelease: tagged
196158 echo "🏷️ Updating PR #$PR_NUM label to autorelease: tagged"
197159 gh pr edit $PR_NUM \
198160 --repo ${{ github.repository }} \
199161 --remove-label "autorelease: pending" \
200162 --add-label "autorelease: tagged" || true
201163
202164 echo "✅ Processed PR #$PR_NUM"
203- done
165+ done < <(echo "$PENDING_PRS" | jq -c '.')
166+
167+ # Output the latest release info (if any was created)
168+ if [ "$RELEASE_CREATED" = "true" ]; then
169+ echo "release_created=true" >> $GITHUB_OUTPUT
170+ echo "tag_name=$LATEST_TAG" >> $GITHUB_OUTPUT
171+ echo "version=$LATEST_VERSION" >> $GITHUB_OUTPUT
172+ else
173+ echo "release_created=false" >> $GITHUB_OUTPUT
174+ fi
175+
176+ # =============================================================================
177+ # Step 2: Run Release Please (after untagged PRs are handled)
178+ # =============================================================================
179+ release-please :
180+ name : 📦 Release Please
181+ needs : handle-untagged-releases
182+ runs-on : ubuntu-latest
183+ outputs :
184+ release_created : ${{ steps.release.outputs.release_created }}
185+ releases_created : ${{ steps.release.outputs.releases_created }}
186+ tag_name : ${{ steps.release.outputs.tag_name }}
187+ version : ${{ steps.release.outputs.version }}
188+ major : ${{ steps.release.outputs.major }}
189+ minor : ${{ steps.release.outputs.minor }}
190+ patch : ${{ steps.release.outputs.patch }}
191+ sha : ${{ steps.release.outputs.sha }}
192+ pr : ${{ steps.release.outputs.pr }}
193+ prs_created : ${{ steps.release.outputs.prs_created }}
194+ steps :
195+ - name : 📥 Checkout source code
196+ uses : actions/checkout@v4
197+
198+ - name : 🤖 Run Release Please
199+ id : release
200+ uses : googleapis/release-please-action@v4
201+ with :
202+ token : ${{ secrets.GITHUB_TOKEN }}
203+ config-file : release-please-config.json
204+ manifest-file : .release-please-manifest.json
205+ target-branch : ${{ github.ref_name }}
206+
207+ - name : 📝 Log Release Info
208+ if : ${{ steps.release.outputs.releases_created == 'true' }}
209+ run : |
210+ echo "🎉 Release created!"
211+ echo "📦 Version: ${{ steps.release.outputs.version }}"
212+ echo "🏷️ Tag: ${{ steps.release.outputs.tag_name }}"
213+ echo "🔗 https://github.com/${{ github.repository }}/releases/tag/${{ steps.release.outputs.tag_name }}"
214+
215+ # =============================================================================
216+ # Step 3: Verify Release
217+ # =============================================================================
204218
205219 # =============================================================================
206220 # Verify Release
207221 # =============================================================================
208222 verify-release :
209223 name : ✅ Verify Release
210- needs : release-please
211- if : ${{ needs.release-please.outputs.releases_created == 'true' }}
224+ needs : [release-please, handle-untagged-releases]
225+ if : |
226+ needs.release-please.outputs.releases_created == 'true' ||
227+ (needs.handle-untagged-releases.outputs.release_created == 'true' && needs.handle-untagged-releases.result == 'success')
212228 runs-on : ubuntu-latest
213229 steps :
214230 - name : 📥 Checkout source code
215231 uses : actions/checkout@v4
216232 with :
217- ref : ${{ needs.release-please.outputs.tag_name }}
233+ ref : ${{ needs.release-please.outputs.releases_created == 'true' && needs.release-please.outputs.tag_name || needs.handle-untagged-releases.outputs. tag_name }}
218234
219235 - name : 🎯 Install Dart SDK
220236 uses : dart-lang/setup-dart@v1
@@ -228,7 +244,7 @@ jobs:
228244 run : |
229245 echo "📦 Verifying package version..."
230246 VERSION=$(grep '^version:' pubspec.yaml | awk '{print $2}')
231- EXPECTED="${{ needs.release-please.outputs.version }}"
247+ EXPECTED="${{ needs.release-please.outputs.releases_created == 'true' && needs.release-please.outputs.version || needs.handle-untagged-releases.outputs. version }}"
232248 if [ "$VERSION" != "$EXPECTED" ]; then
233249 echo "❌ Version mismatch: pubspec.yaml has $VERSION, expected $EXPECTED"
234250 exit 1
@@ -243,7 +259,8 @@ jobs:
243259
244260 - name : 📋 Release Summary
245261 run : |
246- echo "## 🎉 Release v${{ needs.release-please.outputs.version }} Verified!" >> $GITHUB_STEP_SUMMARY
262+ VERSION="${{ needs.release-please.outputs.releases_created == 'true' && needs.release-please.outputs.version || needs.handle-untagged-releases.outputs.version }}"
263+ echo "## 🎉 Release v$VERSION Verified!" >> $GITHUB_STEP_SUMMARY
247264 echo "" >> $GITHUB_STEP_SUMMARY
248265 echo "### 📦 Installation" >> $GITHUB_STEP_SUMMARY
249266 echo "" >> $GITHUB_STEP_SUMMARY
@@ -254,9 +271,9 @@ jobs:
254271 echo " git:" >> $GITHUB_STEP_SUMMARY
255272 echo " url: https://github.com/open-runtime/grpc-dart" >> $GITHUB_STEP_SUMMARY
256273 echo " tag_pattern: \"^v\"" >> $GITHUB_STEP_SUMMARY
257- echo " version: ^${{ needs.release-please.outputs.version }} " >> $GITHUB_STEP_SUMMARY
274+ echo " version: ^$VERSION " >> $GITHUB_STEP_SUMMARY
258275 echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
259276 echo "" >> $GITHUB_STEP_SUMMARY
260277 echo "### 🔗 Links" >> $GITHUB_STEP_SUMMARY
261- echo "- [GitHub Release](https://github.com/${{ github.repository }}/releases/tag/v${{ needs.release-please.outputs.version }} )" >> $GITHUB_STEP_SUMMARY
278+ echo "- [GitHub Release](https://github.com/${{ github.repository }}/releases/tag/v$VERSION )" >> $GITHUB_STEP_SUMMARY
262279 echo "- [Changelog](https://github.com/${{ github.repository }}/blob/${{ github.ref_name }}/CHANGELOG.md)" >> $GITHUB_STEP_SUMMARY
0 commit comments