如何在GHA工作流运行期间冻结分支,完成后解冻?
在GitHub Actions运行期间冻结/解冻分支的方法
当然可以实现,核心思路是通过GitHub API在工作流生命周期的起点修改分支保护规则来冻结分支,在工作流结束(无论成功或失败)时恢复原有规则解冻分支。
具体实现步骤
配置权限
在工作流文件开头设置permissions,确保GITHUB_TOKEN拥有修改分支保护的权限:permissions: admin:branch_protection: write contents: read冻结分支(工作流启动时)
先备份当前分支的保护规则,再更新规则禁止所有用户/团队推送:- name: 备份并冻结分支 run: | # 备份现有分支保护规则 curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ "https://api.github.com/repos/${{ github.repository }}/branches/${{ github.ref_name }}/protection" > branch_protection_backup.json # 应用冻结规则:禁止所有推送、强制管理员遵守规则、禁用删除和强制推送 curl -X PUT -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ -H "Content-Type: application/json" \ "https://api.github.com/repos/${{ github.repository }}/branches/${{ github.ref_name }}/protection" \ -d '{ "restrictions": { "users": [], "teams": [] }, "enforce_admins": true, "allow_deletions": false, "allow_force_pushes": false }'解冻分支(工作流结束时)
使用if: always()确保无论工作流结果如何都执行解冻,从备份文件恢复原有规则:- name: 解冻分支 if: always() run: | # 检查备份文件是否为空(原分支无保护规则的情况) if [ -s branch_protection_backup.json ]; then # 恢复原有保护规则 curl -X PUT -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ -H "Content-Type: application/json" \ "https://api.github.com/repos/${{ github.repository }}/branches/${{ github.ref_name }}/protection" \ -d @branch_protection_backup.json else # 原分支无保护规则,删除临时添加的规则 curl -X DELETE -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ "https://api.github.com/repos/${{ github.repository }}/branches/${{ github.ref_name }}/protection" fi
注意事项
- 如果你的分支原本就有复杂的保护规则(比如必填PR审查、状态检查),备份和恢复步骤会完整保留这些规则,不会破坏原有配置。
- 确保运行工作流的账号(或GITHUB_TOKEN对应的身份)拥有仓库的管理员权限,否则无法修改分支保护规则。
- 避免在并行运行的工作流中操作同一个分支的保护规则,可能导致规则冲突或备份覆盖。
内容的提问来源于stack exchange,提问作者Aseem
相关产品推荐
相关产品推荐

