GitHub Actions避免无限循环:拉取子模块测试通过的最新提交
仓库子模块测试通过提交同步方案解答
一、提交commit_info.txt到main分支的问题
- 绝对不能提交到main分支:你仓库B的Actions触发条件包含
push: branches: ["main"],提交文件到main会再次触发工作流,形成无限循环。 - 如果改用其他分支:仓库A拉取子模块时,需要先切换到该分支读取通过测试的提交哈希,再切回B的main分支检出对应提交。这种方式需要维护额外分支,操作繁琐,不推荐作为首选方案。
二、打标签方案的可行性分析
你的打标签方案完全可行,且不会触发无限循环,核心原因如下:
- 你已经在仓库B的Actions触发条件里排除了标签推送:
tags: ["!**"],推送标签的操作不会触发B的工作流,彻底避免了循环问题。 - 标签的生成逻辑(包含日期和提交短哈希)能清晰标识每个通过测试的提交,方便追踪溯源。
优化后的打标签步骤建议
可以给标签命名更直观,同时避免重复打标:
- 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
相关产品推荐
相关产品推荐

