prerelease.yml 5.2 KB

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