You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于GitHub Actions的多语言SDK发布同步问题求助

GitHub Actions多语言SDK自动化发布版本同步问题

问题概述

我正尝试通过GitHub Actions实现Python、Java、Go、Node.js SDK的自动化发布,目标是针对main分支创建PR时,CI完成两个核心操作:

  1. 更新所有文件中的版本号;
  2. 将新版本发布到对应语言的公共注册表。

当前遇到的核心问题:发布(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 18:55:12