mirror of
https://github.com/vercel-labs/json-render.git
synced 2026-09-14 13:41:32 +08:00
95f3b94429
pnpm publish does not pass through OIDC credentials, causing E404 on npm. Switch to pnpm pack + npm publish per package, matching the pattern used in wterm.
162 lines
5.1 KiB
YAML
162 lines
5.1 KiB
YAML
name: Release
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- main
|
|
workflow_dispatch:
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: false
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
jobs:
|
|
check-release:
|
|
name: Check for new version
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 5
|
|
outputs:
|
|
should_release: ${{ steps.check.outputs.should_release }}
|
|
needs_github_release: ${{ steps.check.outputs.needs_github_release }}
|
|
version: ${{ steps.check.outputs.version }}
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Compare package.json version to npm and check GitHub release
|
|
id: check
|
|
run: |
|
|
LOCAL_VERSION=$(node -p "require('./packages/core/package.json').version")
|
|
echo "Local version: $LOCAL_VERSION"
|
|
|
|
NPM_VERSION=$(npm view @json-render/core version 2>/dev/null || echo "0.0.0")
|
|
echo "npm version: $NPM_VERSION"
|
|
|
|
if [ "$LOCAL_VERSION" != "$NPM_VERSION" ]; then
|
|
echo "Version changed: $NPM_VERSION -> $LOCAL_VERSION"
|
|
echo "should_release=true" >> "$GITHUB_OUTPUT"
|
|
echo "needs_github_release=true" >> "$GITHUB_OUTPUT"
|
|
else
|
|
echo "Version unchanged on npm, skipping build and publish"
|
|
echo "should_release=false" >> "$GITHUB_OUTPUT"
|
|
|
|
TAG="v$LOCAL_VERSION"
|
|
if gh release view "$TAG" &>/dev/null; then
|
|
echo "GitHub release $TAG exists"
|
|
echo "needs_github_release=false" >> "$GITHUB_OUTPUT"
|
|
else
|
|
echo "GitHub release $TAG is missing, will create it"
|
|
echo "needs_github_release=true" >> "$GITHUB_OUTPUT"
|
|
fi
|
|
fi
|
|
echo "version=$LOCAL_VERSION" >> "$GITHUB_OUTPUT"
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
publish:
|
|
name: Publish to npm
|
|
needs: check-release
|
|
if: needs.check-release.outputs.should_release == 'true'
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 15
|
|
environment: Release
|
|
permissions:
|
|
contents: read
|
|
id-token: write
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Install pnpm
|
|
uses: pnpm/action-setup@v4
|
|
|
|
- name: Setup Node.js
|
|
uses: actions/setup-node@v4
|
|
with:
|
|
node-version: 22
|
|
cache: pnpm
|
|
registry-url: "https://registry.npmjs.org"
|
|
|
|
- name: Install dependencies
|
|
run: pnpm install --frozen-lockfile
|
|
|
|
- name: Build packages
|
|
run: pnpm run build
|
|
|
|
- name: Publish all public packages
|
|
run: |
|
|
LOCAL_VERSION="${{ needs.check-release.outputs.version }}"
|
|
FAILED=""
|
|
|
|
publish_pkg() {
|
|
local dir="$1" name="$2"
|
|
REGISTRY_VERSION=$(npm view "$name" version 2>/dev/null || echo "0.0.0")
|
|
if [ "$LOCAL_VERSION" = "$REGISTRY_VERSION" ]; then
|
|
echo "$name@$LOCAL_VERSION already published, skipping"
|
|
return 0
|
|
fi
|
|
echo "Publishing $name@$LOCAL_VERSION..."
|
|
TARBALL=$(cd "$dir" && pnpm pack --pack-destination /tmp | tail -1)
|
|
if ! npm publish "$TARBALL" --provenance --access public; then
|
|
FAILED="$FAILED $name"
|
|
fi
|
|
}
|
|
|
|
for dir in packages/*/; do
|
|
PKG_NAME=$(node -p "try { const p = require('./$dir/package.json'); p.private ? '' : p.name } catch { '' }")
|
|
[ -z "$PKG_NAME" ] && continue
|
|
publish_pkg "$dir" "$PKG_NAME"
|
|
done
|
|
|
|
if [ -n "$FAILED" ]; then
|
|
echo "Failed to publish:$FAILED"
|
|
exit 1
|
|
fi
|
|
|
|
github-release:
|
|
name: Create GitHub Release
|
|
needs: [check-release, publish]
|
|
if: >-
|
|
always()
|
|
&& needs.check-release.outputs.needs_github_release == 'true'
|
|
&& (needs.publish.result == 'success' || needs.publish.result == 'skipped')
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 10
|
|
permissions:
|
|
contents: write
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Extract changelog entry
|
|
run: |
|
|
VERSION="${{ needs.check-release.outputs.version }}"
|
|
awk '/<!-- release:start -->/{found=1; next} /<!-- release:end -->/{found=0} found{print}' CHANGELOG.md > /tmp/release-notes.md
|
|
|
|
LINES=$(wc -l < /tmp/release-notes.md | tr -d ' ')
|
|
if [ "$LINES" -lt 2 ]; then
|
|
echo "Error: No release notes found between <!-- release:start --> and <!-- release:end --> markers in CHANGELOG.md"
|
|
exit 1
|
|
fi
|
|
echo "Extracted release notes for $VERSION ($LINES lines)"
|
|
|
|
- name: Create GitHub Release
|
|
run: |
|
|
VERSION="${{ needs.check-release.outputs.version }}"
|
|
TAG="v$VERSION"
|
|
|
|
if gh release view "$TAG" &>/dev/null; then
|
|
echo "Release $TAG already exists"
|
|
else
|
|
echo "Creating release $TAG..."
|
|
gh release create "$TAG" \
|
|
--title "$TAG" \
|
|
--target ${{ github.sha }} \
|
|
--notes-file /tmp/release-notes.md
|
|
fi
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|