| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- 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
|