@@ -10,19 +10,39 @@ jobs:
1010 outputs :
1111 revision : ${{ steps.tag_info.outputs.revision }}
1212 version : ${{ steps.tag_info.outputs.version }}
13+ is_prerelease : ${{ steps.tag_info.outputs.is_prerelease }}
14+ asset_version : ${{ steps.tag_info.outputs.asset_version }}
15+ release_title : ${{ steps.tag_info.outputs.release_title }}
1316 steps :
1417 - name : Extract version and revision
1518 id : tag_info
1619 shell : bash
1720 run : |
21+ # Tags are shaped processing-<revision>-<version>[-rc<N>].
22+ # A trailing -rc<N> marks a release candidate (a public GitHub
23+ # prerelease); without it the tag is a final release.
1824 TAG_NAME="${GITHUB_REF#refs/tags/}"
1925 REVISION=$(echo "$TAG_NAME" | cut -d'-' -f2)
2026 VERSION=$(echo "$TAG_NAME" | cut -d'-' -f3)
27+ RC=$(echo "$TAG_NAME" | cut -d'-' -f4)
2128
2229 # Set outputs for use in later jobs or steps
2330 echo "revision=$REVISION" >> $GITHUB_OUTPUT
2431 echo "version=$VERSION" >> $GITHUB_OUTPUT
2532
33+ # The packaged version stays numeric (installer formats require it);
34+ # the RC marker only rides along in the release title and asset names.
35+ if [ -n "$RC" ]; then
36+ RC_UPPER=$(echo "$RC" | tr '[:lower:]' '[:upper:]')
37+ echo "is_prerelease=true" >> $GITHUB_OUTPUT
38+ echo "asset_version=${VERSION}-${RC}" >> $GITHUB_OUTPUT
39+ echo "release_title=Processing ${VERSION} ${RC_UPPER}" >> $GITHUB_OUTPUT
40+ else
41+ echo "is_prerelease=false" >> $GITHUB_OUTPUT
42+ echo "asset_version=${VERSION}" >> $GITHUB_OUTPUT
43+ echo "release_title=Processing ${VERSION}" >> $GITHUB_OUTPUT
44+ fi
45+
2646 create-draft :
2747 name : Create draft release
2848 runs-on : ubuntu-latest
3353 GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
3454 GH_REPO : ${{ github.repository }}
3555 TAG : ${{ github.ref_name }}
36- VERSION : ${{ needs.version.outputs.version }}
56+ TITLE : ${{ needs.version.outputs.release_title }}
3757 steps :
3858 - name : Create draft release
3959 run : |
4262 else
4363 gh release create "$TAG" \
4464 --draft \
45- --title "Processing $VERSION " \
65+ --title "$TITLE " \
4666 --generate-notes
4767 fi
4868
@@ -69,21 +89,23 @@ jobs:
6989 run : npm run zip
7090 - name : Stage reference asset
7191 env :
72- VERSION : ${{ needs.version.outputs.version }}
92+ ASSET_VERSION : ${{ needs.version.outputs.asset_version }}
7393 run : |
7494 mkdir -p release-assets
75- cp reference.zip "release-assets/processing-${VERSION }-reference.zip"
95+ cp reference.zip "release-assets/processing-${ASSET_VERSION }-reference.zip"
7696 - name : Upload reference to release
7797 uses : softprops/action-gh-release@v2
7898 with :
7999 draft : true
80100 tag_name : ${{ github.ref_name }}
81- files : release-assets/processing-${{ needs.version.outputs.version }}-reference.zip
101+ files : release-assets/processing-${{ needs.version.outputs.asset_version }}-reference.zip
82102
83103 publish-maven :
84104 name : Publish Processing Libraries to Maven Central
85105 runs-on : ubuntu-latest
86106 needs : [version, release-windows, release-macos, release-linux]
107+ # Release candidates must not notify Maven Central.
108+ if : ${{ needs.version.outputs.is_prerelease != 'true' }}
87109 steps :
88110 - name : Checkout Repository
89111 uses : actions/checkout@v4
@@ -110,6 +132,8 @@ jobs:
110132 name : Publish Processing Plugins to Gradle Plugin Portal
111133 runs-on : ubuntu-latest
112134 needs : [version, release-windows, release-macos, release-linux]
135+ # Release candidates must not notify the Gradle Plugin Portal.
136+ if : ${{ needs.version.outputs.is_prerelease != 'true' }}
113137 steps :
114138 - name : Checkout Repository
115139 uses : actions/checkout@v4
@@ -189,11 +213,12 @@ jobs:
189213 shell : bash
190214 env :
191215 VERSION : ${{ needs.version.outputs.version }}
216+ ASSET_VERSION : ${{ needs.version.outputs.asset_version }}
192217 ARCH : ${{ matrix.arch }}
193218 run : |
194219 mkdir -p release-assets
195- cp "app/build/compose/binaries/main/Processing-${VERSION}.zip" "release-assets/processing-${VERSION }-windows-${ARCH}-portable.zip"
196- cp "app/build/compose/binaries/main/msi/Processing-${VERSION}.msi" "release-assets/processing-${VERSION }-windows-${ARCH}.msi"
220+ cp "app/build/compose/binaries/main/Processing-${VERSION}.zip" "release-assets/processing-${ASSET_VERSION }-windows-${ARCH}-portable.zip"
221+ cp "app/build/compose/binaries/main/msi/Processing-${VERSION}.msi" "release-assets/processing-${ASSET_VERSION }-windows-${ARCH}.msi"
197222
198223 - name : Upload release assets
199224 uses : softprops/action-gh-release@v2
@@ -246,11 +271,12 @@ jobs:
246271 - name : Stage release assets
247272 env :
248273 VERSION : ${{ needs.version.outputs.version }}
274+ ASSET_VERSION : ${{ needs.version.outputs.asset_version }}
249275 ARCH : ${{ matrix.arch }}
250276 run : |
251277 mkdir -p release-assets
252- cp "app/build/compose/binaries/main/Processing-${VERSION}.zip" "release-assets/processing-${VERSION }-macos-${ARCH}-portable.zip"
253- cp "app/build/compose/binaries/main/dmg/Processing-${VERSION}.dmg" "release-assets/processing-${VERSION }-macos-${ARCH}.dmg"
278+ cp "app/build/compose/binaries/main/Processing-${VERSION}.zip" "release-assets/processing-${ASSET_VERSION }-macos-${ARCH}-portable.zip"
279+ cp "app/build/compose/binaries/main/dmg/Processing-${VERSION}.dmg" "release-assets/processing-${ASSET_VERSION }-macos-${ARCH}.dmg"
254280
255281 - name : Upload release assets
256282 uses : softprops/action-gh-release@v2
@@ -293,12 +319,13 @@ jobs:
293319 - name : Stage release assets
294320 env :
295321 VERSION : ${{ needs.version.outputs.version }}
322+ ASSET_VERSION : ${{ needs.version.outputs.asset_version }}
296323 ARCH : ${{ matrix.arch }}
297324 DEB : ${{ matrix.deb }}
298325 run : |
299326 mkdir -p release-assets
300- cp "app/build/compose/binaries/main/Processing-${VERSION}.zip" "release-assets/processing-${VERSION }-linux-${ARCH}-portable.zip"
301- cp "app/build/compose/binaries/main/deb/processing_${VERSION}-1_${DEB}.deb" "release-assets/processing-${VERSION }-linux-${ARCH}.deb"
327+ cp "app/build/compose/binaries/main/Processing-${VERSION}.zip" "release-assets/processing-${ASSET_VERSION }-linux-${ARCH}-portable.zip"
328+ cp "app/build/compose/binaries/main/deb/processing_${VERSION}-1_${DEB}.deb" "release-assets/processing-${ASSET_VERSION }-linux-${ARCH}.deb"
302329
303330 - name : Upload release assets
304331 uses : softprops/action-gh-release@v2
@@ -358,21 +385,24 @@ jobs:
358385 - name : Stage release assets
359386 env :
360387 VERSION : ${{ needs.version.outputs.version }}
388+ ASSET_VERSION : ${{ needs.version.outputs.asset_version }}
361389 ARCH : ${{ matrix.arch }}
362390 DEB : ${{ matrix.deb }}
363391 SNAP_NAME : ${{ vars.SNAP_NAME }}
364392 run : |
365393 mkdir -p release-assets
366- cp "app/build/compose/binaries/main/${SNAP_NAME}_${VERSION}_${DEB}.snap" "release-assets/processing-${VERSION }-linux-${ARCH}.snap"
394+ cp "app/build/compose/binaries/main/${SNAP_NAME}_${VERSION}_${DEB}.snap" "release-assets/processing-${ASSET_VERSION }-linux-${ARCH}.snap"
367395
368396 - name : Upload snap to release
369397 uses : softprops/action-gh-release@v2
370398 with :
371399 draft : true
372400 tag_name : ${{ github.ref_name }}
373- files : release-assets/processing-${{ needs.version.outputs.version }}-linux-${{ matrix.arch }}.snap
401+ files : release-assets/processing-${{ needs.version.outputs.asset_version }}-linux-${{ matrix.arch }}.snap
374402
375403 - name : Upload snap to Snap Store
404+ # Release candidates must not push to the Snap Store.
405+ if : ${{ needs.version.outputs.is_prerelease != 'true' }}
376406 run : snapcraft upload --release=beta app/build/compose/binaries/main/${{ vars.SNAP_NAME }}_${{ needs.version.outputs.version }}_${{ matrix.deb }}.snap
377407 env :
378408 SNAPCRAFT_STORE_CREDENTIALS : ${{ secrets.PROCESSING_SNAPCRAFT_TOKEN }}
@@ -426,18 +456,18 @@ jobs:
426456
427457 - name : Stage release assets
428458 env :
429- VERSION : ${{ needs.version.outputs.version }}
459+ ASSET_VERSION : ${{ needs.version.outputs.asset_version }}
430460 ARCH : ${{ matrix.arch }}
431461 run : |
432462 mkdir -p release-assets
433- cp processing.flatpak "release-assets/processing-${VERSION }-linux-${ARCH}.flatpak"
463+ cp processing.flatpak "release-assets/processing-${ASSET_VERSION }-linux-${ARCH}.flatpak"
434464
435465 - name : Upload Flatpak to release
436466 uses : softprops/action-gh-release@v2
437467 with :
438468 draft : true
439469 tag_name : ${{ github.ref_name }}
440- files : release-assets/processing-${{ needs.version.outputs.version }}-linux-${{ matrix.arch }}.flatpak
470+ files : release-assets/processing-${{ needs.version.outputs.asset_version }}-linux-${{ matrix.arch }}.flatpak
441471
442472 publish-release :
443473 name : Publish release
@@ -454,12 +484,24 @@ jobs:
454484 - release-linux
455485 - release-linux-snap
456486 - release-linux-flatpak
487+ # Run once nothing has failed. publish-maven/publish-gradle are skipped for
488+ # release candidates, and a skipped dependency would otherwise skip this job.
489+ if : ${{ !failure() && !cancelled() }}
457490 permissions :
458491 contents : write
459492 env :
460493 GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
461494 GH_REPO : ${{ github.repository }}
462495 TAG : ${{ github.ref_name }}
496+ IS_PRERELEASE : ${{ needs.version.outputs.is_prerelease }}
463497 steps :
464498 - name : Mark release as published
465- run : gh release edit "$TAG" --draft=false --latest
499+ run : |
500+ # Release candidates go out as a public prerelease (downloadable, but
501+ # not marked "latest" so package-manager watchers ignore them); final
502+ # releases are marked latest.
503+ if [ "$IS_PRERELEASE" = "true" ]; then
504+ gh release edit "$TAG" --draft=false --prerelease
505+ else
506+ gh release edit "$TAG" --draft=false --latest
507+ fi
0 commit comments