tv 模式 #1
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Release App | |
| on: | |
| push: | |
| tags: ['v*'] | |
| workflow_dispatch: | |
| permissions: | |
| contents: write | |
| concurrency: | |
| group: release-app-${{ github.ref }} | |
| cancel-in-progress: false | |
| jobs: | |
| release-desktop: | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - 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: '' | |
| runs-on: ${{ matrix.platform }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: pnpm/action-setup@v4 | |
| with: | |
| version: 10.33.0 | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version: 20 | |
| cache: pnpm | |
| - name: Install Rust | |
| uses: dtolnay/rust-toolchain@stable | |
| with: | |
| targets: ${{ matrix.rust-target }} | |
| - name: Cache cargo registry | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.cargo/registry | |
| ~/.cargo/git | |
| packages/app/src-tauri/target | |
| key: ${{ matrix.platform }}-cargo-app-${{ hashFiles('packages/app/src-tauri/Cargo.lock') }} | |
| restore-keys: | | |
| ${{ matrix.platform }}-cargo-app- | |
| - name: Install Linux deps | |
| if: matrix.platform == 'ubuntu-22.04' | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf | |
| - run: pnpm install --frozen-lockfile | |
| - name: Resolve release body | |
| id: notes | |
| shell: bash | |
| run: | | |
| if [[ "$GITHUB_REF_TYPE" == "tag" && "$GITHUB_REF_NAME" == v* ]]; then | |
| VERSION="${GITHUB_REF_NAME#v}" | |
| else | |
| VERSION="$(node -p "require('./packages/app/package.json').version")" | |
| fi | |
| { | |
| echo "body<<RELEASE_NOTES_EOF" | |
| echo "Release $VERSION" | |
| echo "RELEASE_NOTES_EOF" | |
| } >> "$GITHUB_OUTPUT" | |
| - uses: tauri-apps/tauri-action@v0 | |
| with: | |
| projectPath: packages/app | |
| tagName: v__VERSION__ | |
| releaseName: 'nes-emulator v__VERSION__' | |
| releaseBody: ${{ steps.notes.outputs.body }} | |
| releaseDraft: true | |
| prerelease: false | |
| args: ${{ matrix.args }} | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| release-android: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: pnpm/action-setup@v4 | |
| with: | |
| version: 10.33.0 | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version: 20 | |
| cache: pnpm | |
| - uses: actions/setup-java@v4 | |
| with: | |
| distribution: temurin | |
| java-version: 17 | |
| - uses: android-actions/setup-android@v3 | |
| with: | |
| packages: 'platform-tools platforms;android-36 build-tools;36.0.0 ndk;27.0.12077973' | |
| - name: Install Rust with Android targets | |
| uses: dtolnay/rust-toolchain@stable | |
| with: | |
| targets: aarch64-linux-android,armv7-linux-androideabi,i686-linux-android,x86_64-linux-android | |
| - name: Cache cargo registry | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.cargo/registry | |
| ~/.cargo/git | |
| packages/app/src-tauri/target | |
| key: android-cargo-app-${{ hashFiles('packages/app/src-tauri/Cargo.lock') }} | |
| restore-keys: | | |
| android-cargo-app- | |
| - run: pnpm install --frozen-lockfile | |
| - name: Decode Android keystore | |
| env: | |
| ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }} | |
| run: | | |
| if [ -z "$ANDROID_KEYSTORE_BASE64" ]; then | |
| echo "::error::ANDROID_KEYSTORE_BASE64 secret is required" | |
| exit 1 | |
| fi | |
| echo "$ANDROID_KEYSTORE_BASE64" | base64 --decode > "$RUNNER_TEMP/release.jks" | |
| echo "ANDROID_KEYSTORE_PATH=$RUNNER_TEMP/release.jks" >> "$GITHUB_ENV" | |
| - name: Build Android APK and AAB | |
| working-directory: packages/app | |
| env: | |
| NDK_HOME: ${{ env.ANDROID_NDK_ROOT }} | |
| ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }} | |
| ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }} | |
| ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }} | |
| run: | | |
| if [ -z "$ANDROID_KEY_ALIAS" ] || [ -z "$ANDROID_KEY_PASSWORD" ] || [ -z "$ANDROID_KEYSTORE_PASSWORD" ]; then | |
| echo "::error::ANDROID_KEY_ALIAS, ANDROID_KEY_PASSWORD, and ANDROID_KEYSTORE_PASSWORD secrets are required" | |
| exit 1 | |
| fi | |
| pnpm run android:build -- --apk --aab | |
| - name: Package Android artifacts | |
| id: package | |
| shell: bash | |
| run: | | |
| if [[ "$GITHUB_REF_TYPE" == "tag" && "$GITHUB_REF_NAME" == v* ]]; then | |
| VERSION="${GITHUB_REF_NAME#v}" | |
| else | |
| VERSION="$(node -p "require('./packages/app/package.json').version")" | |
| fi | |
| mkdir -p artifacts | |
| cp packages/app/src-tauri/gen/android/app/build/outputs/apk/universal/release/*.apk \ | |
| "artifacts/nes-emulator_${VERSION}_universal.apk" | |
| cp packages/app/src-tauri/gen/android/app/build/outputs/bundle/universalRelease/*.aab \ | |
| "artifacts/nes-emulator_${VERSION}_universal.aab" | |
| echo "version=$VERSION" >> "$GITHUB_OUTPUT" | |
| - name: Upload Android artifacts to release | |
| if: startsWith(github.ref, 'refs/tags/v') | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| tag_name: ${{ github.ref_name }} | |
| name: nes-emulator v${{ steps.package.outputs.version }} | |
| draft: true | |
| files: artifacts/* | |
| - name: Upload Android artifacts | |
| if: github.event_name == 'workflow_dispatch' | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: nes-emulator-android | |
| path: artifacts/* | |
| release-ios: | |
| runs-on: macos-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: pnpm/action-setup@v4 | |
| with: | |
| version: 10.33.0 | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version: 20 | |
| cache: pnpm | |
| - name: Install Rust with iOS targets | |
| uses: dtolnay/rust-toolchain@stable | |
| with: | |
| targets: aarch64-apple-ios,aarch64-apple-ios-sim,x86_64-apple-ios | |
| - name: Cache cargo registry | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.cargo/registry | |
| ~/.cargo/git | |
| packages/app/src-tauri/target | |
| key: ios-cargo-app-${{ hashFiles('packages/app/src-tauri/Cargo.lock') }} | |
| restore-keys: | | |
| ios-cargo-app- | |
| - run: pnpm install --frozen-lockfile | |
| - name: Initialize iOS project | |
| shell: bash | |
| run: | | |
| if [ ! -d packages/app/src-tauri/gen/apple ]; then | |
| pnpm --filter @nes-emulator/app run tauri -- ios init --ci | |
| fi | |
| - name: Build iOS app | |
| working-directory: packages/app | |
| run: pnpm run ios:build -- --ci --export-method release-testing | |
| - name: Package iOS artifacts | |
| id: package | |
| shell: bash | |
| run: | | |
| if [[ "$GITHUB_REF_TYPE" == "tag" && "$GITHUB_REF_NAME" == v* ]]; then | |
| VERSION="${GITHUB_REF_NAME#v}" | |
| else | |
| VERSION="$(node -p "require('./packages/app/package.json').version")" | |
| fi | |
| mkdir -p artifacts | |
| while IFS= read -r file; do | |
| cp "$file" "artifacts/nes-emulator_${VERSION}_$(basename "$file")" | |
| done < <(find packages/app/src-tauri/gen/apple -type f -name "*.ipa" 2>/dev/null) | |
| mapfile -t archives < <(find packages/app/src-tauri/gen/apple -type d -name "*.xcarchive" 2>/dev/null) | |
| if [ "${#archives[@]}" -gt 0 ]; then | |
| for archive in "${archives[@]}"; do | |
| ditto -c -k --sequesterRsrc --keepParent "$archive" \ | |
| "artifacts/nes-emulator_${VERSION}_$(basename "$archive").zip" | |
| done | |
| else | |
| while IFS= read -r app; do | |
| ditto -c -k --sequesterRsrc --keepParent "$app" \ | |
| "artifacts/nes-emulator_${VERSION}_$(basename "$app").zip" | |
| done < <(find packages/app/src-tauri/gen/apple -type d -name "*.app" 2>/dev/null) | |
| fi | |
| if ! compgen -G "artifacts/*" > /dev/null; then | |
| echo "::error::No iOS artifacts were found" | |
| find packages/app/src-tauri/gen/apple -maxdepth 5 \( -type f -o -type d \) | |
| exit 1 | |
| fi | |
| echo "version=$VERSION" >> "$GITHUB_OUTPUT" | |
| - name: Upload iOS artifacts to release | |
| if: startsWith(github.ref, 'refs/tags/v') | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| tag_name: ${{ github.ref_name }} | |
| name: nes-emulator v${{ steps.package.outputs.version }} | |
| draft: true | |
| files: artifacts/* | |
| - name: Upload iOS artifacts | |
| if: github.event_name == 'workflow_dispatch' | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: nes-emulator-ios | |
| path: artifacts/* |