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

并发GitHub Actions工作流提交推送仓库变更冲突问题排查

问题原因

你的问题根源在于两个作业独立运行,且第二次工作流触发时基于旧代码快照,加上作业间依赖值未同步远程最新状态:

  • 第一次工作流运行时,extracting-value-from-config-file作业拉取旧代码读取sequence_number,随后updating-config-file作业基于同一旧代码修改并推送新commit到远程。
  • 若第二次工作流在第一次推送完成前就被触发(即使因concurrency排队),它的所有作业仍会基于触发时的旧commit拉取代码。当第二次工作流的updating-config-file作业尝试基于旧代码修改并推送时,远程分支已有第一次工作流提交的新commit,导致本地分支落后,推送被拒绝。
  • 另外,你在第二个作业中直接使用第一个作业输出的旧值加1修改,未基于远程最新的config.json重新读取值,进一步加剧了版本不一致。
解决方案

方案1:合并两个作业为一个(推荐)

将读取和修改操作放在同一个作业中,从根本上避免两次checkout带来的版本不一致问题:

name: workflow

concurrency:
  group: ${{ github.workflow }}
  cancel-in-progress: true # 可选:取消正在运行的同组工作流,减少排队和冲突

jobs:
  update-sequence-number:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
      with:
        fetch-depth: 0

    - name: Update sequence number in config.json
      run: |
        # 直接读取最新值并自增
        new_content=$(jq '.sequence_number += 1' config.json)
        echo "$new_content" > config.json
        
        # 提交并推送变更
        git config user.name github-actions
        git config user.email github-actions@github.com
        git add config.json
        git commit -m "AUTO updated sequence number"
        git push

方案2:保留双作业结构并同步最新代码

如果必须保留两个作业的拆分,需要在第二个作业中先拉取远程最新代码,重新读取sequence_number后再修改:

name: workflow

concurrency:
  group: ${{ github.workflow }}

jobs:
  extracting-value-from-config-file:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
      with:
        fetch-depth: 0
  
    - name: Extract sequence number
      id: extracted-value
      run: |
        number=$(jq -r '.sequence_number' config.json)
        echo "SEQUENCE_NUMBER=$number" >> "$GITHUB_OUTPUT"

  updating-config-file:
    needs: extracting-value-from-config-file
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
          ref: ${{ github.head_ref || github.ref }} # 确保checkout目标分支

      - name: Pull latest remote changes
        run: git pull origin ${{ github.head_ref || github.ref_name }}

      - name: Update sequence number
        run: |
          # 基于最新代码重新读取并自增
          new_content=$(jq '.sequence_number += 1' config.json)
          echo "$new_content" > config.json
          
          git config user.name github-actions
          git config user.email github-actions@github.com
          git add config.json
          git commit -m "AUTO updated sequence number"
          git push

关键注意事项

  • 移除不必要的作业拆分:读取和修改属于强关联操作,合并为一个作业能彻底规避版本冲突。
  • 修复jq语法错误:原命令中多余的]会导致执行失败,正确的自增写法为jq '.sequence_number += 1' config.json。
  • 优化concurrency配置:添加cancel-in-progress: true可自动取消旧的同组工作流,避免无效排队。

内容的提问来源于stack exchange,提问作者mrhonest

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 12:34:57