Merge pull request #571 from RebornQ/fix/macos #241
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: app-build-action | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| tag_name: | |
| description: 'Tag name for the release' | |
| required: false | |
| default: 'v1.0.0' | |
| push: | |
| tags: | |
| - "v*" | |
| jobs: | |
| build-android: | |
| runs-on: macos-latest | |
| steps: | |
| - name: 签出代码 | |
| uses: actions/checkout@v4 | |
| with: | |
| ref: ${{ github.event.inputs.tag_name || github.ref }} | |
| - name: 下载Android keystore | |
| id: android_keystore | |
| uses: timheuer/base64-to-file@v1.2 | |
| with: | |
| fileName: key.jks | |
| encodedString: ${{ secrets.KEYSTORE_BASE64 }} | |
| - name: 创建key.properties | |
| run: | | |
| echo "storeFile=${{ steps.android_keystore.outputs.filePath }}" > android/key.properties | |
| echo "storePassword=${{ secrets.STORE_PASSWORD }}" >> android/key.properties | |
| echo "keyPassword=${{ secrets.KEY_PASSWORD }}" >> android/key.properties | |
| echo "keyAlias=${{ secrets.KEY_ALIAS }}" >> android/key.properties | |
| - name: 设置JAVA环境 | |
| uses: actions/setup-java@v4 | |
| with: | |
| distribution: 'zulu' | |
| java-version: "17" | |
| cache: 'gradle' | |
| - name: 设置Flutter环境 | |
| uses: subosito/flutter-action@v2 | |
| with: | |
| channel: stable | |
| cache: true | |
| - name: 更新Flutter的packages | |
| run: flutter pub get | |
| - name: 打包APK | |
| run: flutter build apk --release --split-per-abi | |
| - name: 上传APK至Artifacts | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: android-apks | |
| path: | | |
| build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk | |
| build/app/outputs/flutter-apk/app-arm64-v8a-release.apk | |
| build/app/outputs/flutter-apk/app-x86_64-release.apk | |
| retention-days: 1 | |
| build-windows: | |
| runs-on: windows-latest | |
| steps: | |
| - name: 签出代码 | |
| uses: actions/checkout@v4 | |
| with: | |
| ref: ${{ github.event.inputs.tag_name || github.ref }} | |
| - name: Decode MSIX Certificate | |
| shell: pwsh | |
| run: | | |
| $certBase64 = "${{ secrets.CERTIFICATE }}".Trim() -replace '\s+', '' | |
| if ([string]::IsNullOrEmpty($certBase64)) { Write-Error "Secret is empty!"; exit 1 } | |
| $certBytes = [System.Convert]::FromBase64String($certBase64) | |
| # 使用絕對路徑並確保路徑格式一致 | |
| $certPath = Join-Path -Path (Get-Location) -ChildPath "certificate.pfx" | |
| [IO.File]::WriteAllBytes($certPath, $certBytes) | |
| # 將路徑存入環境變數供下一步使用(選用) | |
| echo "FINAL_CERT_PATH=$certPath" >> $env:GITHUB_ENV | |
| - name: Update make_config.yaml with real cert path | |
| shell: pwsh | |
| run: | | |
| $configPath = "windows/packaging/msix/make_config.yaml" | |
| # 獲取上一步生成的絕對路徑,並將反斜槓轉為正斜槓以避免 YAML 轉義問題 | |
| $absolutePath = "${{ env.FINAL_CERT_PATH }}".Replace('\', '/') | |
| if (Test-Path $configPath) { | |
| $content = Get-Content $configPath -Raw | |
| # 正則替換:匹配 certificate_path: 後面跟隨的任何內容,替換為絕對路徑 | |
| $content = $content -replace 'certificate_path:\s*.*', "certificate_path: $absolutePath" | |
| # 如果密碼也需要從 Secret 填入,可以在這裡一併處理 | |
| # $content = $content -replace 'certificate_password:\s*.*', 'certificate_password: ${{ secrets.CERT_PASSWORD }}' | |
| Set-Content $configPath $content | |
| Write-Host "Success: certificate_path set to $absolutePath" | |
| } else { | |
| Write-Error "Config file not found!" | |
| exit 1 | |
| } | |
| - name: 设置Flutter环境 | |
| uses: subosito/flutter-action@v2 | |
| with: | |
| channel: stable | |
| cache: true | |
| - name: 启用Flutter桌面支持 | |
| run: flutter config --enable-windows-desktop | |
| - name: 更新Flutter的packages | |
| run: flutter pub get | |
| - name: Install Inno Setup 6 | |
| run: | | |
| $url = "https://jrsoftware.org/download.php/is.exe" | |
| $output = "${{ runner.temp }}\innosetup.exe" | |
| Invoke-WebRequest -Uri $url -OutFile $output | |
| Start-Process -FilePath $output -ArgumentList "/VERYSILENT", "/SUPPRESSMSGBOXES", "/NORESTART" -Wait | |
| echo "C:\Program Files (x86)\Inno Setup 6" >> $env:GITHUB_PATH | |
| - name: Copy Chinese language pack | |
| run: | | |
| $source = "windows\packaging\exe\ChineseSimplified.isl" | |
| $target = "C:\Program Files (x86)\Inno Setup 6\Languages\ChineseSimplified.isl" | |
| if (Test-Path $source) { Copy-Item $source $target -Force } | |
| - name: Install fastforge | |
| run: dart pub global activate fastforge | |
| - name: Get version from pubspec.yaml | |
| id: get_version | |
| shell: pwsh | |
| run: | | |
| $lines = Get-Content pubspec.yaml | |
| foreach ($line in $lines) { | |
| if ($line -match '^\s*version:\s*(\S+)') { | |
| $v = $matches[1] -replace '[`"''`]', '' | |
| "version=$v" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append | |
| exit 0 | |
| } | |
| } | |
| Write-Error "Version not found"; exit 1 | |
| # 👇 关键修改:同时打包 exe 和 msix | |
| - name: Package Windows (exe + msix) | |
| run: fastforge package --platform windows --targets exe,msix | |
| - name: Rename installers | |
| shell: pwsh | |
| env: | |
| MSIX_CERT_PATH: ${{ env.MSIX_CERT_PATH }} | |
| MSIX_CERT_PASSWORD: xxxx | |
| run: | | |
| $VERSION = "${{ steps.get_version.outputs.version }}" | |
| $DIST_DIR = "dist" | |
| # Find and rename .exe | |
| $EXE_FILE = Get-ChildItem $DIST_DIR -Recurse -Filter "*.exe" | Select-Object -First 1 | |
| if ($EXE_FILE) { | |
| Copy-Item $EXE_FILE.FullName "PureLive-$VERSION-windows-x64-setup.exe" | |
| } | |
| # Find and rename .msix | |
| $MSIX_FILE = Get-ChildItem $DIST_DIR -Recurse -Filter "*.msix" | Select-Object -First 1 | |
| if ($MSIX_FILE) { | |
| Copy-Item $MSIX_FILE.FullName "PureLive-$VERSION-windows-x64.msix" | |
| } | |
| - name: 上传Windows安装包(exe + msix) | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: windows-installer | |
| path: | | |
| PureLive-${{ steps.get_version.outputs.version }}-windows-x64-setup.exe | |
| PureLive-${{ steps.get_version.outputs.version }}-windows-x64.msix | |
| retention-days: 1 | |
| build-macos: | |
| runs-on: macos-latest | |
| steps: | |
| - name: 签出代码 | |
| uses: actions/checkout@v4 | |
| with: | |
| ref: ${{ github.event.inputs.tag_name || github.ref }} | |
| - name: 设置Flutter环境 | |
| uses: subosito/flutter-action@v2 | |
| with: | |
| channel: stable | |
| cache: true | |
| - name: 更新Flutter的packages | |
| run: flutter pub get | |
| - name: Build macOS | |
| run: flutter build macos --release -v | |
| - name: Get version from pubspec.yaml | |
| id: get_version | |
| run: | | |
| VERSION=$(grep '^version:' pubspec.yaml | sed 's/version: //; s/[`"'"'"']//g') | |
| echo "version=$VERSION" >> $GITHUB_OUTPUT | |
| - name: Install create-dmg | |
| run: brew install create-dmg | |
| - name: Create DMG | |
| run: | | |
| create-dmg \ | |
| --volname "PureLive" \ | |
| --window-pos 200 120 \ | |
| --window-size 800 400 \ | |
| --icon-size 100 \ | |
| --app-drop-link 600 185 \ | |
| "PureLive-${{ steps.get_version.outputs.version }}-macOS.dmg" \ | |
| "build/macos/Build/Products/Release/纯粹直播.app" | |
| - name: 上传DMG | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: macos-dmg | |
| path: PureLive-${{ steps.get_version.outputs.version }}-macOS.dmg | |
| retention-days: 1 | |
| publish-release: | |
| runs-on: ubuntu-latest | |
| needs: [build-android, build-windows, build-macos] | |
| permissions: | |
| contents: write | |
| steps: | |
| - name: 签出代码(用于读取 version.json) | |
| uses: actions/checkout@v4 | |
| with: | |
| ref: ${{ github.event.inputs.tag_name || github.ref }} | |
| - name: 下载所有构建产物 | |
| uses: actions/download-artifact@v4 | |
| with: | |
| path: artifacts | |
| - name: 读取版本描述 | |
| id: version | |
| uses: juliangruber/read-file-action@v1 | |
| with: | |
| path: assets/version.json | |
| - name: 构建 Release Body | |
| id: release_body | |
| run: | | |
| cat << 'EOF' > release_body.txt | |
| # 纯粹直播 ${{ github.ref_name }} | |
| 开源无广告、无病毒,杀毒软件误报可自行斟酌使用。 | |
| ### 📥 快速下载 | |
| |版本|下载地址| | |
| |---|---| | |
| |TV版|[pure_live_TV](https://github.com/liuchuancong/pure_live_TV/releases/latest)| | |
| |Windows/macOS/Android版|[pure_live](https://github.com/liuchuancong/pure_live/releases/latest)| | |
| ### 🖥️ Windows 版 | |
| - **EXE 安装包**:适合所有用户,自动创建快捷方式 | |
| - **MSIX 包**:现代应用格式,支持干净卸载(需 Windows 10/11) | |
| - 适配:Win10/11 (x64),自动创建桌面快捷方式 | |
| - 功能:多直播源、WebDAV、弹幕显示 | |
| - 快捷键:空格(播放/暂停) \| ESC(全屏切换) \| 上下键(音量) \| R(刷新) | |
| ### 🍎 macOS 版 | |
| 感谢 RebornQ 开发 | 适配:macOS 10.15+ (x64) | 同 Windows 核心功能 | |
| ### 📱 Android 版 | |
| 适配:Android 6.0+ | 功能:WebDAV、多播放器切换、弹幕、应用内更新 | |
| ### 📺 TV 版 | |
| 适配:Android TV 6.0+ | 功能:直播源同步、多播放器、弹幕、应用内更新 | |
| ### 📝 本次更新 | |
| ${{ fromJson(steps.version.outputs.content).version_desc }} | |
| EOF | |
| echo "body_path=$(pwd)/release_body.txt" >> $GITHUB_OUTPUT | |
| - name: 上传至 Release | |
| uses: softprops/action-gh-release@v2.2.1 | |
| with: | |
| name: ${{ github.event.inputs.tag_name || github.ref_name }} | |
| body_path: ${{ steps.release_body.outputs.body_path }} | |
| prerelease: false | |
| token: ${{ secrets.TOKEN }} | |
| files: | | |
| artifacts/android-apks/app-armeabi-v7a-release.apk | |
| artifacts/android-apks/app-arm64-v8a-release.apk | |
| artifacts/android-apks/app-x86_64-release.apk | |
| artifacts/windows-installer/*.exe | |
| artifacts/windows-installer/*.msix | |
| artifacts/macos-dmg/*.dmg | |
| - name: 输出状态 | |
| if: always() | |
| run: 'echo "✅ Release published with status: ${{ job.status }}"' |