1
0

prerelease.yml 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. name: Windows Prerelease
  2. # 推送到 prerelease 分支时,只打 Windows x64 内测安装包(NSIS + 便携版),
  3. # 发布为 GitHub prerelease(tag: prerelease)。
  4. # 不上传 latest.json,正式版自动更新通道不受影响。
  5. #
  6. # 首次启用(workflow 合入 main 之后):
  7. # git fetch origin
  8. # git push origin origin/main:prerelease
  9. # 之后把要内测的提交推进 prerelease 即可。
  10. on:
  11. push:
  12. branches:
  13. - prerelease
  14. workflow_dispatch:
  15. concurrency:
  16. group: windows-prerelease
  17. cancel-in-progress: true
  18. permissions:
  19. contents: write
  20. jobs:
  21. build-windows-prerelease:
  22. name: Build Windows x64 内测包
  23. runs-on: windows-latest
  24. env:
  25. CARGO_PROFILE_RELEASE_LTO: "false"
  26. CARGO_PROFILE_RELEASE_CODEGEN_UNITS: "16"
  27. CARGO_PROFILE_RELEASE_OPT_LEVEL: "1"
  28. steps:
  29. - name: Checkout
  30. uses: actions/checkout@v5
  31. - name: Install Rust stable
  32. uses: dtolnay/rust-toolchain@stable
  33. - name: Rust cache
  34. uses: Swatinem/rust-cache@v2
  35. with:
  36. workspaces: src-tauri
  37. shared-key: qmai-release
  38. add-job-id-key: false
  39. cache-on-failure: true
  40. - name: Install protoc (Windows)
  41. uses: arduino/setup-protoc@v3
  42. with:
  43. repo-token: ${{ secrets.GITHUB_TOKEN }}
  44. - name: Setup Node.js
  45. uses: actions/setup-node@v5
  46. with:
  47. node-version: 24
  48. cache: npm
  49. - name: Install frontend dependencies
  50. run: npm ci
  51. - name: Prepare release notes
  52. shell: bash
  53. run: |
  54. set -euo pipefail
  55. version="$(node -p "require('./package.json').version")"
  56. mkdir -p release-assets
  57. node scripts/release-notes.mjs "$version" --out release-assets/changelog.txt
  58. sha="$(echo "${GITHUB_SHA}" | cut -c1-7)"
  59. {
  60. echo "QMAI ${version} Windows 内测包"
  61. echo
  62. echo "- 平台:Windows x64(不含 macOS / Linux)"
  63. echo "- 提交:${GITHUB_SHA}"
  64. echo "- 短哈希:${sha}"
  65. echo "- 来源:\`${GITHUB_REF_NAME}\`"
  66. echo
  67. echo "本发布为内测,不会标记为 Latest,也不会写入正式版自动更新通道(latest.json)。"
  68. echo
  69. echo "## 更新说明"
  70. echo
  71. cat release-assets/changelog.txt
  72. } > release-assets/prerelease-notes.txt
  73. - name: Build Tauri NSIS installer
  74. env:
  75. GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  76. TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
  77. TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
  78. run: npx tauri build --bundles nsis
  79. - name: Package Windows 内测 assets
  80. shell: pwsh
  81. run: |
  82. $ErrorActionPreference = "Stop"
  83. $version = node -p "require('./package.json').version"
  84. $sha = "${{ github.sha }}".Substring(0, 7)
  85. $assetDir = "release-assets"
  86. New-Item -ItemType Directory -Force -Path $assetDir | Out-Null
  87. $bundleDir = "src-tauri/target/release/bundle/nsis"
  88. $installer = Get-ChildItem $bundleDir -File -Filter "*.exe" |
  89. Sort-Object LastWriteTime -Descending |
  90. Select-Object -First 1
  91. if (-not $installer) {
  92. throw "未找到 Windows 安装包"
  93. }
  94. $installerName = "QMaiWrite_${version}_windows_X64_prerelease.exe"
  95. Copy-Item $installer.FullName (Join-Path $assetDir $installerName) -Force
  96. node scripts/build-portable.mjs
  97. $portableExe = "release-portable/QMaiWrite.exe"
  98. if (-not (Test-Path $portableExe)) {
  99. throw "便携版 EXE 未生成:$portableExe"
  100. }
  101. $portableName = "QMaiWrite_${version}_windows_X64_portable_prerelease.exe"
  102. Copy-Item $portableExe (Join-Path $assetDir $portableName) -Force
  103. Write-Host "sha=$sha"
  104. Get-ChildItem $assetDir | Format-Table Name, Length -AutoSize
  105. - name: Publish GitHub prerelease
  106. env:
  107. GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  108. shell: bash
  109. run: |
  110. set -euo pipefail
  111. tag="prerelease"
  112. notes="release-assets/prerelease-notes.txt"
  113. version="$(node -p "require('./package.json').version")"
  114. sha="$(echo "${GITHUB_SHA}" | cut -c1-7)"
  115. title="QMAI ${version} 内测 (Windows ${sha})"
  116. if gh release view "$tag" >/dev/null 2>&1; then
  117. gh release delete "$tag" --yes --cleanup-tag
  118. fi
  119. shopt -s nullglob
  120. assets=(release-assets/QMaiWrite_*_prerelease.exe)
  121. if [ "${#assets[@]}" -eq 0 ]; then
  122. echo "未找到 Windows 内测安装包" >&2
  123. exit 1
  124. fi
  125. gh release create "$tag" \
  126. --title "$title" \
  127. --notes-file "$notes" \
  128. --prerelease \
  129. --latest=false \
  130. --target "${GITHUB_SHA}" \
  131. "${assets[@]}"
  132. - name: Upload workflow artifacts
  133. uses: actions/upload-artifact@v6
  134. with:
  135. name: qmai-windows-x64-prerelease
  136. path: |
  137. release-assets/QMaiWrite_*_prerelease.exe
  138. release-assets/prerelease-notes.txt
  139. if-no-files-found: error
  140. retention-days: 14