并发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
相关产品推荐
相关产品推荐

