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

GitHub Actions避免无限循环:拉取子模块测试通过的最新提交

仓库子模块测试通过提交同步方案解答

一、提交commit_info.txt到main分支的问题

  • 绝对不能提交到main分支:你仓库B的Actions触发条件包含push: branches: ["main"],提交文件到main会再次触发工作流,形成无限循环。
  • 如果改用其他分支:仓库A拉取子模块时,需要先切换到该分支读取通过测试的提交哈希,再切回B的main分支检出对应提交。这种方式需要维护额外分支,操作繁琐,不推荐作为首选方案。

二、打标签方案的可行性分析

你的打标签方案完全可行,且不会触发无限循环,核心原因如下:

  1. 你已经在仓库B的Actions触发条件里排除了标签推送:tags: ["!**"],推送标签的操作不会触发B的工作流,彻底避免了循环问题。
  2. 标签的生成逻辑(包含日期和提交短哈希)能清晰标识每个通过测试的提交,方便追踪溯源。

优化后的打标签步骤建议

可以给标签命名更直观,同时避免重复打标:

- name: Create validated tag
  if: ${{ success() }}
  env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  run: |
    TAG_NAME="validated-$(date +'%Y%m%d')-${GITHUB_SHA::7}"
    # 检查是否已存在该标签,避免重复推送
    if ! git tag -l "$TAG_NAME" | grep -q "$TAG_NAME"; then
      git tag "$TAG_NAME"
      git push origin "$TAG_NAME"
      echo "Created validated tag: $TAG_NAME"
    else
      echo "Tag $TAG_NAME already exists, skipping."
    fi

三、仓库A的配套操作

为了让仓库A自动拉取仓库B的测试通过提交,可以做以下配置:

  • 在仓库B的工作流中,打标签成功后触发仓库A的repository_dispatch事件,通知A更新子模块:
    - name: Trigger Repo A update
      if: ${{ success() }}
      uses: peter-evans/repository-dispatch@v2
      with:
        token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} # 需要拥有A仓库权限的个人访问令牌
        repository: your-username/repo-A
        event-type: validated-tag-created
    
  • 在仓库A的Actions中,监听该事件,自动更新子模块到B的最新有效标签,并提交更新:
    name: Update submodule to validated commit
    on:
      repository_dispatch:
        types: [validated-tag-created]
    
    jobs:
      update-submodule:
        runs-on: ubuntu-latest
        steps:
          - name: Checkout Repo A
            uses: actions/checkout@v3
            with:
              submodules: true
              fetch-depth: 0
    
          - name: Get latest validated tag from Repo B
            run: |
              cd path/to/repo-B-submodule
              git fetch --tags
              # 按时间排序取最新的validated标签
              LATEST_TAG=$(git tag -l "validated-*" | sort -r | head -n1)
              git checkout "$LATEST_TAG"
              echo "Updated submodule to tag: $LATEST_TAG"
    
          - name: Commit submodule update
            run: |
              git config --local user.name "github-actions[bot]"
              git config --local user.email "github-actions[bot]@users.noreply.github.com"
              git add path/to/repo-B-submodule
              git commit -m "Update submodule to latest validated tag: $LATEST_TAG"
              git push
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 17:44:53