基于GitHub Actions的多语言SDK发布同步问题求助
GitHub Actions多语言SDK自动化发布版本同步问题
问题概述
我正尝试通过GitHub Actions实现Python、Java、Go、Node.js SDK的自动化发布,目标是针对main分支创建PR时,CI完成两个核心操作:
- 更新所有文件中的版本号;
- 将新版本发布到对应语言的公共注册表。
当前遇到的核心问题:发布(publish)步骤未使用release步骤生成的新版本代码,而是沿用旧版本,版本同步失效。
矛盾诱因
- 移除
if语句时,release和publish步骤能同步执行,但semantic-release生成的chore(release)提交会触发工作流重复运行,导致重复发布; - 保留当前
if语句时,publish步骤会拉取PR的原始提交(未包含release步骤的版本更新),例如release生成1.0.40版本,但publish发布的是1.0.39。
背景信息
- 使用
semantic-release包及配套插件完成版本管理; ADMIN_TOKEN为具备仓库写入权限的个人令牌;- 各语言的发布逻辑在简化工作流前可正常运行。
当前配置
Java工作流配置
release: runs-on: ubuntu-latest if: "!startsWith(github.event.head_commit.message, 'chore')" steps: - name: Checkout code uses: actions/checkout@v3 with: fetch-depth: 0 token: ${{ secrets.ADMIN_TOKEN }} - name: setup nodejs uses: actions/setup-node@v3 with: node-version: '16' - name: release using semantic-release env: GITHUB_TOKEN: ${{ secrets.ADMIN_TOKEN }} GIT_AUTHOR_NAME: **** GIT_AUTHOR_EMAIL: **** GIT_COMMITTER_NAME: **** GIT_COMMITTER_EMAIL: **** run: | sudo apt-get update sudo apt-get install python pip install --user bumpversion npm install @semantic-release/changelog npm install @semantic-release/exec npm install @semantic-release/git npm install @semantic-release/github npx semantic-release publish: runs-on: ubuntu-latest needs: [release] if: "!startsWith(github.event.head_commit.message, 'chore')" steps: - name: Checkout code uses: actions/checkout@v3 with: token: ${{ secrets.ADMIN_TOKEN }} - name: Configure GPG Key run: | cat <(echo -e "${{ secrets.GPG_SIGNING_KEY }}") | gpg --batch --import gpg --list-secret-keys --keyid-format LONG - name: Set up Maven Central Repository uses: actions/setup-java@v3 with: java-version: 8 distribution: zulu server-id: ossrh server-username: ${{ secrets.MAVEN_USERNAME }} server-password: ${{ secrets.MAVEN_PASSWORD }} gpg-passphrase: ${{ secrets.GPG_PASSPHRASE }} - name: Publish package run: mvn clean deploy $MVN_ARGS -P central --no-transfer-progress --batch-mode -Dgpg.passphrase=${{ secrets.GPG_PASSPHRASE }} env: MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }} MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} MVN_ARGS: "--settings build-settings.xml" <more ENVS>
.releaserc配置
{ "debug": true, "branches": [ "main" ], "plugins": [ ["@semantic-release/commit-analyzer", { "preset": "angular", "releaseRules": [ {"type": "release","release": "patch"} ]}], "@semantic-release/release-notes-generator", "@semantic-release/changelog", [ "@semantic-release/exec", { "prepareCmd": "bump2version --allow-dirty --current-version ${lastRelease.version} --new-version ${nextRelease.version} patch" } ], [ "@semantic-release/git", { "message": "chore(release): ${nextRelease.version} release notes\n\n${nextRelease.notes}" } ], "@semantic-release/github" ] }
解决方案建议
方案1:合并release与publish为单个Job(推荐)
将版本更新与发布逻辑合并到同一个Job中,避免跨Job的代码不同步问题,同时保留if语句防止重复触发:
release-and-publish: runs-on: ubuntu-latest if: "!startsWith(github.event.head_commit.message, 'chore')" steps: - name: Checkout code uses: actions/checkout@v3 with: fetch-depth: 0 token: ${{ secrets.ADMIN_TOKEN }} - name: setup nodejs uses: actions/setup-node@v3 with: node-version: '16' - name: release using semantic-release env: GITHUB_TOKEN: ${{ secrets.ADMIN_TOKEN }} GIT_AUTHOR_NAME: **** GIT_AUTHOR_EMAIL: **** GIT_COMMITTER_NAME: **** GIT_COMMITTER_EMAIL: **** run: | sudo apt-get update sudo apt-get install python pip install --user bumpversion npm install @semantic-release/changelog npm install @semantic-release/exec npm install @semantic-release/git npm install @semantic-release/github npx semantic-release - name: Configure GPG Key run: | cat <(echo -e "${{ secrets.GPG_SIGNING_KEY }}") | gpg --batch --import gpg --list-secret-keys --keyid-format LONG - name: Set up Maven Central Repository uses: actions/setup-java@v3 with: java-version: 8 distribution: zulu server-id: ossrh server-username: ${{ secrets.MAVEN_USERNAME }} server-password: ${{ secrets.MAVEN_PASSWORD }} gpg-passphrase: ${{ secrets.GPG_PASSPHRASE }} - name: Publish package run: mvn clean deploy $MVN_ARGS -P central --no-transfer-progress --batch-mode -Dgpg.passphrase=${{ secrets.GPG_PASSPHRASE }} env: MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }} MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} MVN_ARGS: "--settings build-settings.xml" <more ENVS>
优势:
- 版本更新完成后直接使用当前环境的代码发布,完全避免版本不同步;
if语句会过滤semantic-release生成的chore(release)提交,不会触发重复运行。
方案2:优化publish Job的代码拉取逻辑
如果必须保留两个独立Job,修改publish Job的Checkout步骤,确保拉取包含release步骤提交的最新PR分支代码:
- name: Checkout code uses: actions/checkout@v3 with: fetch-depth: 0 token: ${{ secrets.ADMIN_TOKEN }} ref: ${{ github.head_ref }}
说明:
ref: ${{ github.head_ref }}指定拉取PR的源分支最新代码,包含release步骤推送的版本更新提交;fetch-depth: 0确保拉取完整历史,避免semantic-release依赖历史提交分析版本失败。
内容的提问来源于stack exchange,提问作者Killerz0ne
相关产品推荐
相关产品推荐

