GitHub Workflow突然因缺失workflows权限失败,求原因及修复方案
问题背景
我在仓库配置了一个Workflow,每隔一天自动检查上游仓库更新;若上游有新提交,会拉取更新并将本地仓库的变更变基到上游版本之上。该Workflow此前运行完全正常,但昨日起突然无法更新仓库,报错提示缺少workflows权限。
错误信息
![remote rejected] main -> main (refusing to allow a GitHub App to create or update workflow
.github/workflows/diffuse.ymlwithoutworkflowspermission)
相关Workflow代码片段
- name: Setup Git run: git config --global user.email ${{ secrets.EMAIL }} && git config --global user.name username - name: Fetch from Upstream run: | git remote add upstream https://github.com/upstream-repo/repo.git git fetch upstream --tags # Some extra code here if [ $has_new_commits == "true" ]; then git checkout main git rebase upstream/main || git diff git push -f origin main echo "Rebase successful!" else echo "ERROR: No commits to be synced!" exit 1 fi build_app: needs: update_fork uses: ./.github/workflows/build.yml secrets: inherit
疑问与需求
我从未创建过GitHub App或PAT,此前无需权限即可运行,为何突然出现该报错?我检查过仓库设置,确认未创建相关授权App,仓库设置和代码均未改动。想知道是否是GitHub后端变更导致问题,以及如何恢复Workflow运行。
解答
原因分析
这是GitHub对Actions默认权限的后端变更导致的:
- 此前GitHub Actions默认的
GITHUB_TOKEN拥有全仓库操作权限,包括修改Workflow文件 - 近期GitHub收紧了权限策略,默认
GITHUB_TOKEN不再包含workflows权限。你的变基操作若同步了上游仓库的Workflow文件(上游有Workflow更新),推送时就会触发权限校验,导致被拒绝。
恢复方案
有两种可行的解决方式:
为Workflow显式配置权限
在你的Workflow文件开头添加权限声明,给GITHUB_TOKEN授予修改内容和Workflow的权限:permissions: contents: write workflows: write配置后,Actions默认令牌将拥有推送Workflow文件的权限,满足变基后的推送需求。
修改变基逻辑,排除Workflow文件同步
如果你的仓库不需要同步上游的Workflow文件,可以在拉取或变基时排除.github/workflows目录:
修改拉取逻辑,例如在变基前执行:git checkout upstream/main -- . ':!.github/workflows'这样变基时不会同步上游的Workflow文件,也就不需要
workflows权限。
验证建议
修改完成后手动触发一次Workflow,确认推送操作能正常执行,无权限报错。
内容的提问来源于stack exchange,提问作者theycallmepix

