name: Release Core Package on: workflow_dispatch: inputs: version_type: description: 'Version bump type' required: true type: choice options: - patch - minor - major default: 'patch' custom_version: description: 'Custom version (optional, overrides version_type)' required: false type: string jobs: release: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20.x' registry-url: 'https://registry.npmjs.org' cache: 'npm' - name: Configure Git run: | git config --global user.name 'github-actions[bot]' git config --global user.email 'github-actions[bot]@users.noreply.github.com' - name: Install dependencies run: npm ci - name: Run tests run: | cd packages/core npm run test:ci - name: Determine version id: version run: | cd packages/core CURRENT_VERSION=$(node -p "require('./package.json').version") echo "current_version=$CURRENT_VERSION" >> $GITHUB_OUTPUT if [ -n "${{ github.event.inputs.custom_version }}" ]; then NEW_VERSION="${{ github.event.inputs.custom_version }}" echo "Using custom version: $NEW_VERSION" else # 使用 npm version 命令计算新版本(但不实际提交) npm version ${{ github.event.inputs.version_type }} --no-git-tag-version NEW_VERSION=$(node -p "require('./package.json').version") echo "Bumping ${{ github.event.inputs.version_type }} version: $CURRENT_VERSION → $NEW_VERSION" # 恢复 package.json 以便后续步骤重新修改 git checkout package.json fi echo "new_version=$NEW_VERSION" >> $GITHUB_OUTPUT - name: Update package version run: | cd packages/core npm version ${{ steps.version.outputs.new_version }} --no-git-tag-version - name: Build package run: | cd packages/core npm run build:npm - name: Publish to npm run: | cd packages/core/dist npm publish env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Create Git tag run: | git tag -a "core-v${{ steps.version.outputs.new_version }}" -m "Release @esengine/ecs-framework v${{ steps.version.outputs.new_version }}" git push origin "core-v${{ steps.version.outputs.new_version }}" # 发布成功后,创建 PR 更新版本号 update-version-pr: needs: release if: success() runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20.x' cache: 'npm' - name: Configure Git run: | git config --global user.name 'github-actions[bot]' git config --global user.email 'github-actions[bot]@users.noreply.github.com' - name: Install dependencies run: npm ci - name: Generate changelog id: changelog run: | # 获取上一个core版本的tag PREVIOUS_TAG=$(git tag -l "core-v*" --sort=-v:refname | head -n 1) if [ -z "$PREVIOUS_TAG" ]; then echo "No previous tag found, using initial commit" PREVIOUS_TAG=$(git rev-list --max-parents=0 HEAD) fi echo "Generating changelog from $PREVIOUS_TAG to HEAD" # 生成变更日志(只包含core相关的提交) CHANGELOG=$(git log $PREVIOUS_TAG..HEAD --pretty=format:"- %s (%h)" --no-merges -- packages/core/) if [ -z "$CHANGELOG" ]; then CHANGELOG="No changes to core package since last release" fi # 保存到文件以便在PR中使用 echo "$CHANGELOG" > /tmp/changelog.txt # 输出用于调试 echo "Changelog:" cat /tmp/changelog.txt - name: Update version in package.json run: | cd packages/core if [ -n "${{ github.event.inputs.custom_version }}" ]; then NEW_VERSION="${{ github.event.inputs.custom_version }}" npm version $NEW_VERSION --no-git-tag-version --allow-same-version else npm version ${{ github.event.inputs.version_type }} --no-git-tag-version NEW_VERSION=$(node -p "require('./package.json').version") fi echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_ENV # 验证文件已修改 git diff --exit-code package.json && echo "::error::No version change detected" && exit 1 || true echo "Updated package.json to version: $NEW_VERSION" cat package.json | grep version - name: Prepare PR body id: pr_body run: | CHANGELOG_CONTENT=$(cat /tmp/changelog.txt) # 创建PR描述 cat > /tmp/pr_body.md < author: github-actions[bot] branch: release/core-v${{ env.NEW_VERSION }} delete-branch: true title: "chore(core): Release v${{ env.NEW_VERSION }}" body-path: /tmp/pr_body.md labels: | release core automated pr add-paths: | packages/core/package.json - name: Check PR creation run: | echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}" echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}"