如何避免GitHub Actions中机器人触发工作流循环?
解决GitHub Actions子模块更新导致的工作流循环问题
问题本质
你使用的是GitHub App令牌而非仓库默认的GITHUB_TOKEN,官方文档中“GITHUB_TOKEN不会触发新工作流”的规则仅针对GitHub自动生成的仓库默认令牌。GitHub App令牌属于独立身份,没有这个豁免机制,因此推送主仓库分支时会触发新的工作流,形成循环。
解决方案
1. 提交信息添加跳过关键词
直接在主仓库的提交消息里加上[skip ci]或[ci skip],GitHub Actions会自动跳过本次提交的工作流触发。修改后的代码片段:
git commit -m "Updated submodule [skip ci]"
注意:原代码里的Udpated是拼写错误,建议修正为Updated
2. 限制工作流触发条件
在工作流的on配置块里添加过滤规则,排除由GitHub App机器人账号触发的推送。示例:
on: pull_request: push: branches: - main # 替换成你的GitHub App对应的bot用户名,格式一般是「App名称[bot]」 if: github.actor != 'your-github-app-name[bot]'
3. 改用仓库默认GITHUB_TOKEN(权限允许的话)
如果你的操作不需要GitHub App的特殊权限,直接用仓库自动生成的${{ secrets.GITHUB_TOKEN }}替换自定义的GitHub App令牌。默认令牌推送时不会触发新工作流,从根源避免循环。
修改后的工作流示例(以添加跳过关键词为例)
- name: Checkout submodule repo uses: actions/checkout@v4 with: repository: submodule_repository path: submodule token: ${{ env.GITHUB_TOKEN }} fetch-depth: 0 persist-credentials: true - name: Writes to submodule run: | python ./main.py - name: Push changes to submodule working-directory: submodule run: | git config user.name "name" git config user.email "email" git add . git commit -m "Created or excluded DAG" git push - name: Checkout caller repo uses: actions/checkout@v4 with: ref: ${{ github.event_name == 'pull_request' && github.head_ref || github.ref }} path: caller token: ${{ env.GITHUB_TOKEN }} submodules: true - name: Update caller repo to latest submodule working-directory: caller run: | git config user.name "name" git config user.email "email" git submodule update --recursive --remote git add . git commit -m "Updated submodule [skip ci]" git push
内容的提问来源于stack exchange,提问作者Luiz
相关产品推荐
相关产品推荐

