Release NPM Packages #17
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Release NPM Packages | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| package: | |
| description: '选择要发布的包' | |
| required: true | |
| type: choice | |
| options: | |
| - core | |
| - behavior-tree | |
| - editor-core | |
| version_type: | |
| description: '版本更新类型' | |
| required: true | |
| type: choice | |
| options: | |
| - patch | |
| - minor | |
| - major | |
| - custom | |
| custom_version: | |
| description: '自定义版本号 (仅当选择 custom 时使用,例如: 2.2.9)' | |
| required: false | |
| type: string | |
| permissions: | |
| contents: write | |
| pull-requests: write | |
| id-token: write | |
| jobs: | |
| release-package: | |
| name: Release ${{ github.event.inputs.package }} Package | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Install pnpm | |
| uses: pnpm/action-setup@v2 | |
| with: | |
| version: 8 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '20.x' | |
| registry-url: 'https://registry.npmjs.org' | |
| cache: 'pnpm' | |
| - name: Install dependencies | |
| run: pnpm install | |
| - name: Build core package (if needed) | |
| if: ${{ github.event.inputs.package == 'behavior-tree' || github.event.inputs.package == 'editor-core' }} | |
| run: | | |
| cd packages/core | |
| pnpm run build | |
| # - name: Run tests | |
| # run: | | |
| # cd packages/${{ github.event.inputs.package }} | |
| # npm run test:ci | |
| - name: Update version | |
| id: version | |
| run: | | |
| cd packages/${{ github.event.inputs.package }} | |
| if [ "${{ github.event.inputs.version_type }}" = "custom" ]; then | |
| npm version ${{ github.event.inputs.custom_version }} --no-git-tag-version --allow-same-version | |
| else | |
| npm version ${{ github.event.inputs.version_type }} --no-git-tag-version | |
| fi | |
| NEW_VERSION=$(node -p "require('./package.json').version") | |
| echo "new_version=$NEW_VERSION" >> $GITHUB_OUTPUT | |
| echo "发布版本: $NEW_VERSION" | |
| - name: Build package | |
| run: | | |
| cd packages/${{ github.event.inputs.package }} | |
| pnpm run build:npm | |
| - name: Resolve workspace dependencies | |
| run: | | |
| cd packages/${{ github.event.inputs.package }}/dist | |
| # Replace workspace:* with actual versions from monorepo | |
| node -e " | |
| const fs = require('fs'); | |
| const path = require('path'); | |
| const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8')); | |
| const resolveWorkspaceDeps = (deps) => { | |
| if (!deps) return deps; | |
| const resolved = {}; | |
| for (const [name, version] of Object.entries(deps)) { | |
| if (version.startsWith('workspace:')) { | |
| // Get version from the actual package | |
| const pkgName = name.replace('@esengine/', ''); | |
| const pkgPath = path.join('..', '..', pkgName, 'package.json'); | |
| if (fs.existsSync(pkgPath)) { | |
| const depPkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')); | |
| resolved[name] = '^' + depPkg.version; | |
| } else { | |
| resolved[name] = version.replace('workspace:', ''); | |
| } | |
| } else { | |
| resolved[name] = version; | |
| } | |
| } | |
| return resolved; | |
| }; | |
| pkg.dependencies = resolveWorkspaceDeps(pkg.dependencies); | |
| pkg.devDependencies = resolveWorkspaceDeps(pkg.devDependencies); | |
| pkg.peerDependencies = resolveWorkspaceDeps(pkg.peerDependencies); | |
| fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2) + '\n'); | |
| console.log('Resolved workspace dependencies'); | |
| " | |
| - name: Publish to npm | |
| env: | |
| NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} | |
| run: | | |
| cd packages/${{ github.event.inputs.package }}/dist | |
| npm publish --access public | |
| - name: Create Pull Request | |
| uses: peter-evans/create-pull-request@v6 | |
| with: | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| commit-message: "chore(${{ github.event.inputs.package }}): release v${{ steps.version.outputs.new_version }}" | |
| branch: release/${{ github.event.inputs.package }}-v${{ steps.version.outputs.new_version }} | |
| delete-branch: true | |
| title: "chore(${{ github.event.inputs.package }}): Release v${{ steps.version.outputs.new_version }}" | |
| body: | | |
| ## 🚀 Release v${{ steps.version.outputs.new_version }} | |
| 此 PR 更新 `@esengine/${{ github.event.inputs.package }}` 包的版本号 | |
| ### 变更 | |
| - ✅ 已发布到 npm: [@esengine/${{ github.event.inputs.package }}@${{ steps.version.outputs.new_version }}](https://www.npmjs.com/package/@esengine/${{ github.event.inputs.package }}/v/${{ steps.version.outputs.new_version }}) | |
| - ✅ 更新 `packages/${{ github.event.inputs.package }}/package.json` → `${{ steps.version.outputs.new_version }}` | |
| --- | |
| *此 PR 由发布工作流自动创建* | |
| labels: | | |
| release | |
| ${{ github.event.inputs.package }} | |
| automated pr |