已配置PAT仍出现github-actions[bot]权限拒绝问题排查
排查GitHub Actions推送403错误的方向
1. 验证PAT的权限与归属
- 确认
STUDENT_BOOK_TOKEN对应的账号是目标仓库geo-smart/curriculum-book-student的协作成员,仅拥有仓库权限不够,必须账号在仓库协作列表内,且拥有write或maintain级别权限。 - 检查PAT的scopes:必须勾选完整的
repo权限(包含repo:status、repo_deployment等子权限),如果目标是私有仓库,仅public_repo权限无效。 - 确认PAT未过期、未被撤销。
2. 修复复合Action中的Checkout步骤
复合Action里的actions/checkout@v3未指定token,默认使用GitHub内置的GITHUB_TOKEN,该token仅能操作当前仓库,无法访问目标仓库。修改该步骤:
- name: checkout repo content uses: actions/checkout@v3 with: token: ${{ inputs.token }}
3. 检查github-push-action的参数与版本
- 暂时移除
force: true参数,测试普通推送——如果目标仓库main分支开启了强制推送保护,即使有write权限也会触发403。 - 升级
ad-m/github-push-action到最新版本(如v0.8.0),旧版本存在token处理的已知bug。 - 确认
repository参数格式为owner/repo,且目标仓库确实存在、PAT账号可访问。
4. 检查目标仓库的分支保护与IP限制
- 目标仓库
main分支若开启分支保护(如要求PR合并、状态检查通过),会阻止直接推送,需临时关闭保护测试,或调整规则允许PAT账号直接推送。 - 确认目标仓库未设置IP白名单,GitHub Actions runner的IP为动态地址,若被白名单拦截会触发403。
5. 验证token的传递有效性
在push changes步骤前添加调试步骤,确认token正确传入复合Action:
- name: Debug token shell: bash run: echo "Token starts with: ${INPUT_TOKEN:0:4}" env: INPUT_TOKEN: ${{ inputs.token }}
若输出为空,说明主工作流向复合Action传递token的语法存在问题。
6. 用原生Git命令替代action测试
替换ad-m/github-push-action步骤,改用原生Git命令推送,排除action本身的问题:
- name: Add target remote shell: bash run: git remote add student https://${{ inputs.token }}@github.com/geo-smart/curriculum-book-student.git - name: Push to target repo shell: bash run: git push student main --force
内容的提问来源于stack exchange,提问作者Stefan Todoran
相关产品推荐
相关产品推荐

