@@ -13,276 +13,80 @@ concurrency:
1313 cancel-in-progress : false
1414
1515jobs :
16- release-desktop :
17- strategy :
18- fail-fast : false
19- matrix :
20- include :
21- - platform : macos-latest
22- args : ' --target aarch64-apple-darwin'
23- rust-target : aarch64-apple-darwin
24- - platform : macos-latest
25- args : ' --target x86_64-apple-darwin'
26- rust-target : x86_64-apple-darwin
27- - platform : ubuntu-22.04
28- args : ' '
29- rust-target : ' '
30- - platform : windows-latest
31- args : ' '
32- rust-target : ' '
33-
34- runs-on : ${{ matrix.platform }}
16+ check :
17+ runs-on : ubuntu-latest
18+ outputs :
19+ tag : ${{ steps.release.outputs.tag }}
20+ version : ${{ steps.release.outputs.version }}
21+ notes : ${{ steps.release.outputs.notes }}
3522 steps :
36- - uses : actions/checkout@v4
37-
38- - uses : pnpm/action-setup@v4
39- with :
40- version : 10.33.0
41-
42- - uses : actions/setup-node@v4
43- with :
44- node-version : 20
45- cache : pnpm
46-
47- - name : Install Rust
48- uses : dtolnay/rust-toolchain@stable
49- with :
50- targets : ${{ matrix.rust-target }}
51-
52- - name : Cache cargo registry
53- uses : actions/cache@v4
54- with :
55- path : |
56- ~/.cargo/registry
57- ~/.cargo/git
58- packages/app/src-tauri/target
59- key : ${{ matrix.platform }}-cargo-app-${{ hashFiles('packages/app/src-tauri/Cargo.lock') }}
60- restore-keys : |
61- ${{ matrix.platform }}-cargo-app-
62-
63- - name : Install Linux deps
64- if : matrix.platform == 'ubuntu-22.04'
65- run : |
66- sudo apt-get update
67- sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf
68-
69- - run : pnpm install --frozen-lockfile
70-
71- - name : Resolve release body
72- id : notes
73- shell : bash
74- run : |
75- if [[ "$GITHUB_REF_TYPE" == "tag" && "$GITHUB_REF_NAME" == v* ]]; then
76- VERSION="${GITHUB_REF_NAME#v}"
77- else
78- VERSION="$(node -p "require('./package.json').version")"
79- fi
80- {
81- echo "body<<RELEASE_NOTES_EOF"
82- echo "Release $VERSION"
83- echo "RELEASE_NOTES_EOF"
84- } >> "$GITHUB_OUTPUT"
23+ - uses : actions/checkout@v5
8524
86- - uses : tauri-apps/tauri-action@v0
25+ - id : release
26+ uses : while-coder/workflows/.github/actions/resolve-release-info@main
8727 with :
88- projectPath : packages/app
89- tagName : v__VERSION__
90- releaseName : ' nes-emulator v__VERSION__'
91- releaseBody : ${{ steps.notes.outputs.body }}
92- releaseDraft : true
93- prerelease : false
94- args : ${{ matrix.args }}
95- env :
96- GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
28+ tag-prefix : v
29+ package-json : package.json
30+ changelog : CHANGELOG.md
9731
98- release-android :
32+ prepare-release :
33+ needs : check
9934 runs-on : ubuntu-latest
10035 steps :
101- - uses : actions/checkout@v4
102-
103- - uses : pnpm/action-setup@v4
104- with :
105- version : 10.33.0
106-
107- - uses : actions/setup-node@v4
36+ - name : Delete existing GitHub Release
37+ uses : while-coder/workflows/.github/actions/recreate-github-release@main
10838 with :
109- node-version : 20
110- cache : pnpm
111-
112- - uses : actions/setup-java@v4
113- with :
114- distribution : temurin
115- java-version : 17
116-
117- - uses : android-actions/setup-android@v3
118- with :
119- packages : ' platform-tools platforms;android-36 build-tools;36.0.0 ndk;27.0.12077973'
120-
121- - name : Install Rust with Android targets
122- uses : dtolnay/rust-toolchain@stable
123- with :
124- targets : aarch64-linux-android,armv7-linux-androideabi,i686-linux-android,x86_64-linux-android
125-
126- - name : Cache cargo registry
127- uses : actions/cache@v4
128- with :
129- path : |
130- ~/.cargo/registry
131- ~/.cargo/git
132- packages/app/src-tauri/target
133- key : android-cargo-app-${{ hashFiles('packages/app/src-tauri/Cargo.lock') }}
134- restore-keys : |
135- android-cargo-app-
136-
137- - run : pnpm install --frozen-lockfile
39+ github-token : ${{ secrets.GITHUB_TOKEN }}
40+ tag : ${{ needs.check.outputs.tag }}
41+ create : ' false'
13842
139- - name : Decode Android keystore
140- env :
141- ANDROID_KEYSTORE_BASE64 : ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
142- run : |
143- if [ -z "$ANDROID_KEYSTORE_BASE64" ]; then
144- echo "::error::ANDROID_KEYSTORE_BASE64 secret is required"
145- exit 1
146- fi
147- echo "$ANDROID_KEYSTORE_BASE64" | base64 --decode > "$RUNNER_TEMP/release.jks"
148- echo "ANDROID_KEYSTORE_PATH=$RUNNER_TEMP/release.jks" >> "$GITHUB_ENV"
149-
150- - name : Build Android APK and AAB
151- working-directory : packages/app
152- env :
153- NDK_HOME : ${{ env.ANDROID_NDK_ROOT }}
154- ANDROID_KEY_ALIAS : ${{ secrets.ANDROID_KEY_ALIAS }}
155- ANDROID_KEY_PASSWORD : ${{ secrets.ANDROID_KEY_PASSWORD }}
156- ANDROID_KEYSTORE_PASSWORD : ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
157- run : |
158- if [ -z "$ANDROID_KEY_ALIAS" ] || [ -z "$ANDROID_KEY_PASSWORD" ] || [ -z "$ANDROID_KEYSTORE_PASSWORD" ]; then
159- echo "::error::ANDROID_KEY_ALIAS, ANDROID_KEY_PASSWORD, and ANDROID_KEYSTORE_PASSWORD secrets are required"
160- exit 1
161- fi
162- pnpm run android:build -- --apk --aab
163-
164- - name : Package Android artifacts
165- id : package
166- shell : bash
167- run : |
168- if [[ "$GITHUB_REF_TYPE" == "tag" && "$GITHUB_REF_NAME" == v* ]]; then
169- VERSION="${GITHUB_REF_NAME#v}"
170- else
171- VERSION="$(node -p "require('./package.json').version")"
172- fi
173- mkdir -p artifacts
174- cp packages/app/src-tauri/gen/android/app/build/outputs/apk/universal/release/*.apk \
175- "artifacts/nes-emulator_${VERSION}_universal.apk"
176- cp packages/app/src-tauri/gen/android/app/build/outputs/bundle/universalRelease/*.aab \
177- "artifacts/nes-emulator_${VERSION}_universal.aab"
178- echo "version=$VERSION" >> "$GITHUB_OUTPUT"
179-
180- - name : Upload Android artifacts to release
181- if : startsWith(github.ref, 'refs/tags/v')
182- uses : softprops/action-gh-release@v2
183- with :
184- tag_name : ${{ github.ref_name }}
185- name : nes-emulator v${{ steps.package.outputs.version }}
186- draft : true
187- files : artifacts/*
43+ release-desktop :
44+ needs : [check, prepare-release]
45+ uses : while-coder/workflows/.github/workflows/tauri-desktop-release.yml@main
46+ with :
47+ project-path : packages/app
48+ cargo-lock-path : packages/app/src-tauri/Cargo.lock
49+ cargo-target-path : packages/app/src-tauri/target
50+ cache-key-prefix : cargo-app
51+ tag-name : ${{ needs.check.outputs.tag }}
52+ release-name : nes-emulator v${{ needs.check.outputs.version }}
53+ release-body : ${{ needs.check.outputs.notes }}
54+ release-draft : true
55+ matrix-json : >-
56+ [{"platform":"macos-latest","args":"--target aarch64-apple-darwin","rust-target":"aarch64-apple-darwin"},{"platform":"macos-latest","args":"--target x86_64-apple-darwin","rust-target":"x86_64-apple-darwin"},{"platform":"ubuntu-22.04","args":"","rust-target":""},{"platform":"windows-latest","args":"","rust-target":""}]
57+ node-version : ' 20'
58+ secrets : inherit
18859
189- - name : Upload Android artifacts
190- if : github.event_name == 'workflow_dispatch'
191- uses : actions/upload-artifact@v4
192- with :
193- name : nes-emulator-android
194- path : artifacts/*
60+ release-android :
61+ needs : [check, release-desktop]
62+ if : ${{ !cancelled() && needs.release-desktop.result == 'success' }}
63+ uses : while-coder/workflows/.github/workflows/tauri-android-release.yml@main
64+ with :
65+ project-path : packages/app
66+ cargo-lock-path : packages/app/src-tauri/Cargo.lock
67+ cargo-target-path : packages/app/src-tauri/target
68+ cache-key-prefix : android-cargo-app
69+ tag-name : ${{ needs.check.outputs.tag }}
70+ version : ${{ needs.check.outputs.version }}
71+ asset-prefix : nes-emulator
72+ build-command : pnpm run android:build -- --apk --aab
73+ node-version : ' 20'
74+ android-ndk-version : 27.0.12077973
75+ secrets : inherit
19576
19677 release-ios :
197- runs-on : macos-latest
198- steps :
199- - uses : actions/checkout@v4
200-
201- - uses : pnpm/action-setup@v4
202- with :
203- version : 10.33.0
204-
205- - uses : actions/setup-node@v4
206- with :
207- node-version : 20
208- cache : pnpm
209-
210- - name : Install Rust with iOS targets
211- uses : dtolnay/rust-toolchain@stable
212- with :
213- targets : aarch64-apple-ios,aarch64-apple-ios-sim,x86_64-apple-ios
214-
215- - name : Cache cargo registry
216- uses : actions/cache@v4
217- with :
218- path : |
219- ~/.cargo/registry
220- ~/.cargo/git
221- packages/app/src-tauri/target
222- key : ios-cargo-app-${{ hashFiles('packages/app/src-tauri/Cargo.lock') }}
223- restore-keys : |
224- ios-cargo-app-
225-
226- - run : pnpm install --frozen-lockfile
227-
228- - name : Initialize iOS project
229- shell : bash
230- run : |
231- if [ ! -d packages/app/src-tauri/gen/apple ]; then
232- pnpm --filter @nes-emulator/app run tauri -- ios init --ci
233- fi
234-
235- - name : Build iOS app
236- working-directory : packages/app
237- run : pnpm run ios:build -- --ci --export-method release-testing
238-
239- - name : Package iOS artifacts
240- id : package
241- shell : bash
242- run : |
243- if [[ "$GITHUB_REF_TYPE" == "tag" && "$GITHUB_REF_NAME" == v* ]]; then
244- VERSION="${GITHUB_REF_NAME#v}"
245- else
246- VERSION="$(node -p "require('./package.json').version")"
247- fi
248- mkdir -p artifacts
249-
250- while IFS= read -r file; do
251- cp "$file" "artifacts/nes-emulator_${VERSION}_$(basename "$file")"
252- done < <(find packages/app/src-tauri/gen/apple -type f -name "*.ipa" 2>/dev/null)
253-
254- mapfile -t archives < <(find packages/app/src-tauri/gen/apple -type d -name "*.xcarchive" 2>/dev/null)
255- if [ "${#archives[@]}" -gt 0 ]; then
256- for archive in "${archives[@]}"; do
257- ditto -c -k --sequesterRsrc --keepParent "$archive" \
258- "artifacts/nes-emulator_${VERSION}_$(basename "$archive").zip"
259- done
260- else
261- while IFS= read -r app; do
262- ditto -c -k --sequesterRsrc --keepParent "$app" \
263- "artifacts/nes-emulator_${VERSION}_$(basename "$app").zip"
264- done < <(find packages/app/src-tauri/gen/apple -type d -name "*.app" 2>/dev/null)
265- fi
266-
267- if ! compgen -G "artifacts/*" > /dev/null; then
268- echo "::error::No iOS artifacts were found"
269- find packages/app/src-tauri/gen/apple -maxdepth 5 \( -type f -o -type d \)
270- exit 1
271- fi
272- echo "version=$VERSION" >> "$GITHUB_OUTPUT"
273-
274- - name : Upload iOS artifacts to release
275- if : startsWith(github.ref, 'refs/tags/v')
276- uses : softprops/action-gh-release@v2
277- with :
278- tag_name : ${{ github.ref_name }}
279- name : nes-emulator v${{ steps.package.outputs.version }}
280- draft : true
281- files : artifacts/*
282-
283- - name : Upload iOS artifacts
284- if : github.event_name == 'workflow_dispatch'
285- uses : actions/upload-artifact@v4
286- with :
287- name : nes-emulator-ios
288- path : artifacts/*
78+ needs : [check, release-desktop]
79+ if : ${{ !cancelled() && needs.release-desktop.result == 'success' }}
80+ uses : while-coder/workflows/.github/workflows/tauri-ios-unsigned.yml@main
81+ with :
82+ project-path : packages/app
83+ cargo-lock-path : packages/app/src-tauri/Cargo.lock
84+ cargo-target-path : packages/app/src-tauri/target
85+ cache-key-prefix : ios-cargo-app
86+ tag-name : ${{ needs.check.outputs.tag }}
87+ version : ${{ needs.check.outputs.version }}
88+ asset-prefix : nes-emulator
89+ init-command : if [ ! -d src-tauri/gen/apple ]; then pnpm tauri ios init --ci; fi
90+ build-command : pnpm run ios:build -- --target aarch64 --no-sign --ci
91+ node-version : ' 20'
92+ secrets : inherit
0 commit comments