1
0

release.yml 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. name: Release
  2. # Manually triggered ("Run workflow"). On trigger it:
  3. # 1. reads the version from package.json,
  4. # 2. builds a self-contained bundle for every platform (one runner — there's no
  5. # native compilation, so cross-packaging is fine),
  6. # 3. creates the GitHub Release (tag v<version>) with all archives, using the
  7. # release notes from CHANGELOG.md,
  8. # 4. publishes the npm thin-installer (shim + per-platform packages).
  9. #
  10. # Before triggering: bump package.json and make sure CHANGELOG.md has the matching
  11. # section (## [<version>], or ## [Unreleased]). Set the NPM_TOKEN repo secret.
  12. on:
  13. workflow_dispatch: {}
  14. permissions:
  15. contents: write # create the GitHub Release + tag
  16. jobs:
  17. release:
  18. runs-on: ubuntu-latest
  19. steps:
  20. - uses: actions/checkout@v6
  21. - uses: actions/setup-node@v6
  22. with:
  23. node-version: 22
  24. registry-url: https://registry.npmjs.org
  25. - run: npm ci
  26. - name: Ensure zip/unzip
  27. run: sudo apt-get update -qq && sudo apt-get install -y -qq zip unzip
  28. - name: Build all platform bundles
  29. run: |
  30. for t in darwin-arm64 darwin-x64 linux-x64 linux-arm64 win32-x64 win32-arm64; do
  31. bash scripts/build-bundle.sh "$t"
  32. done
  33. ls -lh release
  34. - name: Generate SHA256SUMS
  35. # Published as a release asset; the npm launcher verifies downloaded
  36. # bundles against it (basenames only, so its path.basename match works).
  37. run: |
  38. ( cd release && sha256sum codegraph-* > SHA256SUMS )
  39. cat release/SHA256SUMS
  40. - name: Resolve version
  41. id: ver
  42. run: echo "version=$(node -p "require('./package.json').version")" >> "$GITHUB_OUTPUT"
  43. - name: Release notes from CHANGELOG.md
  44. run: |
  45. V="${{ steps.ver.outputs.version }}"
  46. node scripts/extract-release-notes.mjs "$V" > notes.md 2>/dev/null \
  47. || node scripts/extract-release-notes.mjs Unreleased > notes.md 2>/dev/null || true
  48. if [ ! -s notes.md ]; then
  49. echo "::error::No release notes in CHANGELOG.md for [$V] or [Unreleased]."
  50. exit 1
  51. fi
  52. echo "----- release notes -----"; cat notes.md
  53. - name: Create GitHub Release
  54. env:
  55. GH_TOKEN: ${{ github.token }}
  56. run: |
  57. TAG="v${{ steps.ver.outputs.version }}"
  58. # Idempotent: create the release once, otherwise (re-run) refresh assets.
  59. if gh release view "$TAG" >/dev/null 2>&1; then
  60. gh release upload "$TAG" release/codegraph-* release/SHA256SUMS --clobber
  61. else
  62. gh release create "$TAG" release/codegraph-* release/SHA256SUMS --title "$TAG" --notes-file notes.md
  63. fi
  64. - name: Publish to npm
  65. env:
  66. NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
  67. run: |
  68. V="${{ steps.ver.outputs.version }}"
  69. bash scripts/pack-npm.sh "$V"
  70. # Platform packages first, then the main shim (which depends on them).
  71. # Skip any already on the registry so a re-run only fills in gaps.
  72. for dir in release/npm/codegraph-* release/npm/main; do
  73. name=$(node -p "require('./$dir/package.json').name")
  74. if npm view "$name@$V" version >/dev/null 2>&1; then
  75. echo "skip $name@$V (already published)"
  76. else
  77. echo "publishing $name@$V"
  78. ( cd "$dir" && npm publish --access public )
  79. fi
  80. done
  81. - name: Verify every package is actually on the registry
  82. run: |
  83. V="${{ steps.ver.outputs.version }}"
  84. # npm publish can print success without persisting; confirm against the
  85. # registry (with retries for propagation) so green means really shipped.
  86. for dir in release/npm/codegraph-* release/npm/main; do
  87. name=$(node -p "require('./$dir/package.json').name")
  88. ok=
  89. for i in 1 2 3 4 5 6; do
  90. if npm view "$name@$V" version >/dev/null 2>&1; then ok=1; break; fi
  91. echo "waiting for $name@$V to appear ($i)…"; sleep 10
  92. done
  93. [ -n "$ok" ] || { echo "::error::$name@$V never appeared on the registry"; exit 1; }
  94. echo "verified $name@$V"
  95. done
  96. - name: Sync packages to npmmirror
  97. # npmmirror/cnpm mirror lazily and frequently never pull the per-platform
  98. # optionalDependencies on their own, so `npm i` there fails with
  99. # "no prebuilt bundle" (issue #303). Nudge a sync now so mirror users get
  100. # the bundle without waiting. Best-effort — the launcher also self-heals
  101. # from GitHub Releases — so a mirror hiccup never fails the release.
  102. continue-on-error: true
  103. run: |
  104. for dir in release/npm/codegraph-* release/npm/main; do
  105. name=$(node -p "require('./$dir/package.json').name")
  106. enc=$(node -p "encodeURIComponent(require('./$dir/package.json').name)")
  107. echo "sync $name"
  108. curl -s -X PUT "https://registry.npmmirror.com/-/package/$enc/syncs" || true
  109. echo
  110. done