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