name: Windows Prerelease # 推送到 prerelease 分支时,只打 Windows x64 内测安装包(NSIS + 便携版), # 发布为 GitHub prerelease(tag: prerelease)。 # 不上传 latest.json,正式版自动更新通道不受影响。 # # 首次启用(workflow 合入 main 之后): # git fetch origin # git push origin origin/main:prerelease # 之后把要内测的提交推进 prerelease 即可。 on: push: branches: - prerelease workflow_dispatch: concurrency: group: windows-prerelease cancel-in-progress: true permissions: contents: write jobs: build-windows-prerelease: name: Build Windows x64 内测包 runs-on: windows-latest env: CARGO_PROFILE_RELEASE_LTO: "false" CARGO_PROFILE_RELEASE_CODEGEN_UNITS: "16" CARGO_PROFILE_RELEASE_OPT_LEVEL: "1" steps: - name: Checkout uses: actions/checkout@v5 - name: Install Rust stable uses: dtolnay/rust-toolchain@stable - name: Rust cache uses: Swatinem/rust-cache@v2 with: workspaces: src-tauri shared-key: qmai-release add-job-id-key: false cache-on-failure: true - name: Install protoc (Windows) uses: arduino/setup-protoc@v3 with: repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Setup Node.js uses: actions/setup-node@v5 with: node-version: 24 cache: npm - name: Install frontend dependencies run: npm ci - name: Prepare release notes shell: bash run: | set -euo pipefail version="$(node -p "require('./package.json').version")" mkdir -p release-assets node scripts/release-notes.mjs "$version" --out release-assets/changelog.txt sha="$(echo "${GITHUB_SHA}" | cut -c1-7)" { echo "QMAI ${version} Windows 内测包" echo echo "- 平台:Windows x64(不含 macOS / Linux)" echo "- 提交:${GITHUB_SHA}" echo "- 短哈希:${sha}" echo "- 来源:\`${GITHUB_REF_NAME}\`" echo echo "本发布为内测,不会标记为 Latest,也不会写入正式版自动更新通道(latest.json)。" echo echo "## 更新说明" echo cat release-assets/changelog.txt } > release-assets/prerelease-notes.txt - name: Build Tauri NSIS installer env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }} run: npx tauri build --bundles nsis - name: Package Windows 内测 assets shell: pwsh run: | $ErrorActionPreference = "Stop" $version = node -p "require('./package.json').version" $sha = "${{ github.sha }}".Substring(0, 7) $assetDir = "release-assets" New-Item -ItemType Directory -Force -Path $assetDir | Out-Null $bundleDir = "src-tauri/target/release/bundle/nsis" $installer = Get-ChildItem $bundleDir -File -Filter "*.exe" | Sort-Object LastWriteTime -Descending | Select-Object -First 1 if (-not $installer) { throw "未找到 Windows 安装包" } $installerName = "QMaiWrite_${version}_windows_X64_prerelease.exe" Copy-Item $installer.FullName (Join-Path $assetDir $installerName) -Force node scripts/build-portable.mjs $portableExe = "release-portable/QMaiWrite.exe" if (-not (Test-Path $portableExe)) { throw "便携版 EXE 未生成:$portableExe" } $portableName = "QMaiWrite_${version}_windows_X64_portable_prerelease.exe" Copy-Item $portableExe (Join-Path $assetDir $portableName) -Force Write-Host "sha=$sha" Get-ChildItem $assetDir | Format-Table Name, Length -AutoSize - name: Publish GitHub prerelease env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} shell: bash run: | set -euo pipefail tag="prerelease" notes="release-assets/prerelease-notes.txt" version="$(node -p "require('./package.json').version")" sha="$(echo "${GITHUB_SHA}" | cut -c1-7)" title="QMAI ${version} 内测 (Windows ${sha})" if gh release view "$tag" >/dev/null 2>&1; then gh release delete "$tag" --yes --cleanup-tag fi shopt -s nullglob assets=(release-assets/QMaiWrite_*_prerelease.exe) if [ "${#assets[@]}" -eq 0 ]; then echo "未找到 Windows 内测安装包" >&2 exit 1 fi gh release create "$tag" \ --title "$title" \ --notes-file "$notes" \ --prerelease \ --latest=false \ --target "${GITHUB_SHA}" \ "${assets[@]}" - name: Upload workflow artifacts uses: actions/upload-artifact@v6 with: name: qmai-windows-x64-prerelease path: | release-assets/QMaiWrite_*_prerelease.exe release-assets/prerelease-notes.txt if-no-files-found: error retention-days: 14