1+ # Release workflow for myMCpp (on each push to master).
2+ # Inspired by PCSX2's release workflow.
3+
14name : 🌙 Nightly Builds
25
36on :
4- schedule :
5- - cron : ' 0 0 * * * '
6- workflow_dispatch :
7+ push :
8+ branches :
9+ - master
710
811permissions :
912 contents : write
1013
1114jobs :
15+ cut_release :
16+ if : github.repository == 'PCSX2/myMCpp'
17+ name : ' Create tag and draft release'
18+ runs-on : ubuntu-latest
19+ outputs :
20+ new_tag : ${{ steps.release_meta.outputs.new_tag }}
21+ release_name : ${{ steps.release_meta.outputs.release_name }}
22+ steps :
23+ - uses : actions/checkout@v6.0.2
24+ with :
25+ fetch-depth : 0
26+
27+ - name : Tag, notes, and draft release
28+ id : release_meta
29+ env :
30+ GH_TOKEN : ${{ github.token }}
31+ shell : bash
32+ run : |
33+ set -euo pipefail
34+ git fetch --tags --no-recurse-submodules
35+
36+ SHA="${{ github.sha }}"
37+
38+ bump_patch() {
39+ local t="${1#v}"
40+ local major minor patch
41+ IFS=. read -r major minor patch <<< "${t%%-*}"
42+ major=${major:-0}
43+ minor=${minor:-0}
44+ patch=${patch:-0}
45+ echo "v$((major)).$((minor)).$((patch + 1))"
46+ }
47+
48+ LATEST="$(git tag -l 'v[0-9]*' --sort=-version:refname | head -1 || true)"
49+ if [ -z "$LATEST" ]; then LATEST="v0.0.0"; fi
50+ TAG="$(bump_patch "$LATEST")"
51+ NAME="myMCpp ${TAG}"
52+ PRERELEASE=true
53+
54+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
55+ git config user.name "github-actions[bot]"
56+
57+ git tag -fa "$TAG" -m "$NAME" "$SHA"
58+ git push -f origin "refs/tags/$TAG"
59+
60+ gh api "repos/${{ github.repository }}/releases/generate-notes" \
61+ -f tag_name="$TAG" \
62+ -f target_commitish="$SHA" \
63+ --jq .body > "$GITHUB_WORKSPACE/release-notes.md"
64+
65+ gh release delete "$TAG" --yes 2>/dev/null || true
66+ EXTRA=""
67+ if [ "$PRERELEASE" = true ]; then EXTRA="--prerelease"; fi
68+ gh release create "$TAG" \
69+ --draft \
70+ $EXTRA \
71+ --title "$NAME" \
72+ --notes-file "$GITHUB_WORKSPACE/release-notes.md" \
73+ --target "$SHA"
74+
75+ echo "new_tag=${TAG}" >> "$GITHUB_OUTPUT"
76+ echo "release_name=${NAME}" >> "$GITHUB_OUTPUT"
77+
1278 build_linux_clang :
13- name : " 🐧 Linux (Clang, Nightly)"
79+ if : github.repository == 'PCSX2/myMCpp'
80+ name : ' 🐧 Linux (Clang, Nightly)'
81+ needs : cut_release
1482 uses : ./.github/workflows/linux_build.yml
1583 with :
16- jobName : " Linux Clang Nightly Build"
17- artifactPrefixName : " myMCpp-nightly-linux-x64-clang"
84+ jobName : ' Linux Clang Nightly Build'
85+ artifactPrefixName : ' myMCpp-nightly-linux-x64-clang'
1886 compiler : clang
1987 fetchTags : true
2088 secrets : inherit
2189
2290 build_linux_gcc :
23- name : " 🐧 Linux (GCC, Nightly)"
91+ if : github.repository == 'PCSX2/myMCpp'
92+ name : ' 🐧 Linux (GCC, Nightly)'
93+ needs : cut_release
2494 uses : ./.github/workflows/linux_build.yml
2595 with :
26- jobName : " Linux GCC Nightly Build"
27- artifactPrefixName : " myMCpp-nightly-linux-x64-gcc"
96+ jobName : ' Linux GCC Nightly Build'
97+ artifactPrefixName : ' myMCpp-nightly-linux-x64-gcc'
2898 compiler : gcc
2999 fetchTags : true
30100 secrets : inherit
31101
32102 build_macos :
33- name : " 🍎 macOS (Nightly)"
103+ if : github.repository == 'PCSX2/myMCpp'
104+ name : ' 🍎 macOS (Nightly)'
105+ needs : cut_release
34106 uses : ./.github/workflows/macos_build.yml
35107 with :
36- jobName : " macOS Nightly Build"
37- artifactPrefixName : " myMCpp-nightly-macos-universal"
108+ jobName : ' macOS Nightly Build'
109+ artifactPrefixName : ' myMCpp-nightly-macos-universal'
38110 fetchTags : true
39111 secrets : inherit
40112
41113 build_windows_x64_clang :
42- name : " 🪟 Windows x64 (Clang, Nightly)"
114+ if : github.repository == 'PCSX2/myMCpp'
115+ name : ' 🪟 Windows x64 (Clang, Nightly)'
116+ needs : cut_release
43117 uses : ./.github/workflows/windows_build.yml
44118 with :
45- jobName : " Windows x64 Clang Nightly Build"
46- artifactPrefixName : " myMCpp-nightly-windows-x64-clang"
119+ jobName : ' Windows x64 Clang Nightly Build'
120+ artifactPrefixName : ' myMCpp-nightly-windows-x64-clang'
47121 platform : x64
48122 compiler : clang
49123 fetchTags : true
50124 secrets : inherit
51125
52126 build_windows_x64_msvc :
53- name : " 🪟 Windows x64 (MSVC, Nightly)"
127+ if : github.repository == 'PCSX2/myMCpp'
128+ name : ' 🪟 Windows x64 (MSVC, Nightly)'
129+ needs : cut_release
54130 uses : ./.github/workflows/windows_build.yml
55131 with :
56- jobName : " Windows x64 MSVC Nightly Build"
57- artifactPrefixName : " myMCpp-nightly-windows-x64-msvc"
132+ jobName : ' Windows x64 MSVC Nightly Build'
133+ artifactPrefixName : ' myMCpp-nightly-windows-x64-msvc'
58134 platform : x64
59135 compiler : msvc
60136 fetchTags : true
61137 secrets : inherit
62138
63139 build_windows_arm64_clang :
64- name : " 🪟 Windows ARM64 (Clang, Nightly)"
140+ if : github.repository == 'PCSX2/myMCpp'
141+ name : ' 🪟 Windows ARM64 (Clang, Nightly)'
142+ needs : cut_release
65143 uses : ./.github/workflows/windows_build.yml
66144 with :
67- jobName : " Windows ARM64 Clang Nightly Build"
68- artifactPrefixName : " myMCpp-nightly-windows-arm64-clang"
145+ jobName : ' Windows ARM64 Clang Nightly Build'
146+ artifactPrefixName : ' myMCpp-nightly-windows-arm64-clang'
69147 os : windows-11-arm
70148 platform : ARM64
71149 compiler : clang
72150 fetchTags : true
73151 secrets : inherit
74152
75153 build_windows_arm64_msvc :
76- name : " 🪟 Windows ARM64 (MSVC, Nightly)"
154+ if : github.repository == 'PCSX2/myMCpp'
155+ name : ' 🪟 Windows ARM64 (MSVC, Nightly)'
156+ needs : cut_release
77157 uses : ./.github/workflows/windows_build.yml
78158 with :
79- jobName : " Windows ARM64 MSVC Nightly Build"
80- artifactPrefixName : " myMCpp-nightly-windows-arm64-msvc"
159+ jobName : ' Windows ARM64 MSVC Nightly Build'
160+ artifactPrefixName : ' myMCpp-nightly-windows-arm64-msvc'
81161 os : windows-11-arm
82162 platform : ARM64
83163 compiler : msvc
84164 fetchTags : true
85165 secrets : inherit
86166
87- nightly_release :
88- name : " 📦 Create Nightly Pre-Release"
167+ upload_and_publish :
168+ if : github.repository == 'PCSX2/myMCpp'
169+ name : ' 📦 Upload assets and publish release'
89170 runs-on : ubuntu-latest
90171 needs :
172+ - cut_release
91173 - build_linux_clang
92174 - build_linux_gcc
93175 - build_macos
94176 - build_windows_x64_clang
95177 - build_windows_x64_msvc
96178 - build_windows_arm64_clang
97179 - build_windows_arm64_msvc
98-
99180 steps :
100- - name : Checkout repository
101- uses : actions/checkout@v6.0.2
102-
103- - name : Determine nightly tag
104- id : nightly_tag
105- shell : bash
106- run : |
107- DATE="$(date +'%Y%m%d')"
108- TAG="nightly-${DATE}"
109- NAME="myMCpp Nightly ${DATE}"
110- echo "tag=${TAG}" >> "$GITHUB_OUTPUT"
111- echo "name=${NAME}" >> "$GITHUB_OUTPUT"
181+ - uses : actions/checkout@v6.0.2
112182
113183 - name : Download all artifacts
114184 uses : actions/download-artifact@v8.0.1
@@ -120,29 +190,25 @@ jobs:
120190
121191 - name : Prepare release assets
122192 shell : bash
193+ env :
194+ TAG : ${{ needs.cut_release.outputs.new_tag }}
123195 run : |
196+ set -euo pipefail
124197 mkdir -p release-assets
125- TAG="${{ steps.nightly_tag.outputs.tag }}"
126198
127199 for dir in artifacts/*/; do
128200 dirname="$(basename "$dir")"
129201
130- # Skip symbol artifacts
131202 if [[ "$dirname" == *"-symbols" ]]; then
132203 continue
133204 fi
134205
135206 echo "Processing: $dirname"
136207
137- # Windows artifacts: zip the directory contents
138208 if [[ "$dirname" == *"windows"* ]]; then
139209 asset_name="myMCpp-${TAG}-${dirname#myMCpp-nightly-}.zip"
140210 echo " -> Creating $asset_name"
141- cd "$dir"
142- zip -r "../../release-assets/$asset_name" ./*
143- cd ../..
144-
145- # macOS artifacts: move the .tar.xz as-is
211+ (cd "$dir" && zip -r "../../release-assets/$asset_name" ./*)
146212 elif [[ "$dirname" == *"macos"* ]]; then
147213 for f in "$dir"*.tar.xz; do
148214 if [ -f "$f" ]; then
@@ -151,8 +217,6 @@ jobs:
151217 cp "$f" "release-assets/$asset_name"
152218 fi
153219 done
154-
155- # Linux artifacts: move AppImage as-is
156220 elif [[ "$dirname" == *"linux"* ]]; then
157221 for f in "$dir"*.AppImage; do
158222 if [ -f "$f" ]; then
@@ -168,17 +232,23 @@ jobs:
168232 echo "=== Final release assets ==="
169233 ls -la release-assets/
170234
171- - name : Create GitHub pre-release with assets
172- uses : softprops/action-gh-release@v2.5.0
173- with :
174- tag_name : ${{ steps.nightly_tag.outputs.tag }}
175- name : ${{ steps.nightly_tag.outputs.name }}
176- target_commitish : ${{ github.sha }}
177- prerelease : true
178- draft : false
179- make_latest : false
180- generate_release_notes : true
181- files : |
182- release-assets/*
235+ - name : Upload release assets
236+ env :
237+ GH_TOKEN : ${{ github.token }}
238+ TAG : ${{ needs.cut_release.outputs.new_tag }}
239+ shell : bash
240+ run : |
241+ set -euo pipefail
242+ shopt -s nullglob
243+ files=(release-assets/*)
244+ if [ ${#files[@]} -eq 0 ]; then
245+ echo "No release assets to upload."
246+ exit 1
247+ fi
248+ gh release upload "$TAG" "${files[@]}" --clobber
249+
250+ - name : Publish release
183251 env :
184- GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
252+ GH_TOKEN : ${{ github.token }}
253+ TAG : ${{ needs.cut_release.outputs.new_tag }}
254+ run : gh release edit "$TAG" --draft=false
0 commit comments