v8-release.yml 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. name: v8 Release
  2. on:
  3. push:
  4. tags: ['scriptor-v*']
  5. permissions:
  6. contents: read
  7. concurrency:
  8. group: v8-release-${{ github.ref }}
  9. cancel-in-progress: false
  10. jobs:
  11. release:
  12. runs-on: windows-latest
  13. timeout-minutes: 50
  14. permissions:
  15. contents: write
  16. env:
  17. RELEASE_TAG: ${{ github.ref_name }}
  18. steps:
  19. - name: Check out with repository line endings only
  20. run: git config --global core.autocrlf false
  21. - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
  22. with:
  23. fetch-depth: 0
  24. persist-credentials: false
  25. - name: Tag belongs to accepted public v8
  26. shell: bash
  27. run: git merge-base --is-ancestor HEAD origin/v8
  28. - uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4
  29. with:
  30. version: 11.27.1
  31. - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
  32. with:
  33. node-version: '24.15.0'
  34. cache: pnpm
  35. - run: pnpm install --frozen-lockfile
  36. - run: pnpm check:version
  37. - run: pnpm audit --audit-level=high
  38. - run: pnpm lint
  39. - run: pnpm test:release
  40. - run: pnpm test
  41. - run: pnpm -r --workspace-concurrency=1 test
  42. - run: pnpm release:build -- --out .tmp/release
  43. - name: Install the exact release assets into a clean host
  44. run: |
  45. # 以构建清单为准定位主包与可选包;glob 会把 *-full-*.tgz 误并入主包位置。
  46. $manifest = Get-Content .tmp/release/release-manifest.json -Raw | ConvertFrom-Json
  47. $mainPackage = Join-Path .tmp/release $manifest.filename
  48. $embeddingTarball = ($manifest.optionalPackages | Where-Object { $_.name -eq 'webnovel-embedding-provider' }).tarball
  49. if (-not $embeddingTarball) { throw 'Embedding package missing from release manifest' }
  50. $embeddingPackage = Join-Path .tmp/release $embeddingTarball
  51. $metaTarball = ($manifest.optionalPackages | Where-Object { $_.name -eq '@linfengqaqtat/dsh-scriptor-full' }).tarball
  52. if (-not $metaTarball) { throw 'Full package missing from release manifest' }
  53. $metaPackage = Join-Path .tmp/release $metaTarball
  54. pnpm release:smoke -- $mainPackage $embeddingPackage $metaPackage
  55. if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
  56. - name: Validate npm publish inputs without publishing
  57. run: node scripts/release/publish-npm.mjs --assets .tmp/release
  58. - name: Create a draft; never replace an existing release
  59. env:
  60. GH_TOKEN: ${{ github.token }}
  61. run: |
  62. gh release view $env:RELEASE_TAG *> $null
  63. if ($LASTEXITCODE -eq 0) { throw 'Release already exists; inspect it without overwriting its assets.' }
  64. $manifest = Get-Content .tmp/release/release-manifest.json -Raw | ConvertFrom-Json
  65. $releaseArgs = @('release', 'create', $env:RELEASE_TAG, '--verify-tag', '--draft', '--latest=false', '--title', "DSH Scriptor · v8 · $($manifest.version)", '--notes-file', '.tmp/release/release-notes.md')
  66. if ($manifest.prerelease) { $releaseArgs += '--prerelease' }
  67. $releaseArgs += Get-ChildItem .tmp/release -File | Where-Object Name -ne 'release-notes.md' | Select-Object -ExpandProperty FullName
  68. & gh @releaseArgs
  69. if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }