如何解决Github Action使用BENCHMARK_TOKEN无法评论派生仓库PR的问题
问题修复方案
根因说明
GitHub默认对来自派生仓库的PR触发的pull_request事件工作流做了权限限制:工作流运行在派生仓库的上下文下,无法读取上游仓库的机密变量,也默认没有上游仓库的写入权限,就算配置了自定义Token也无法生效。
分步修复操作
1. 替换工作流触发事件
将你的基准测试工作流的触发事件从pull_request改为pull_request_target,该事件固定运行在上游仓库的上下文内,可以正常读取你配置的BENCHMARK_TOKEN,且默认拥有仓库写入权限。
注意:使用
pull_request_target时,不要直接检出派生PR的代码执行不可信逻辑,避免恶意PR窃取机密变量。如果需要运行PR内的基准测试代码,建议采用两级工作流方案:第一级用pull_request事件跑基准测试并将结果上传为制品,第二级用pull_request_target事件下载制品生成评论。
2. 修改Action代码适配自定义Token
你当前使用的Action代码默认读取的是内置GITHUB_TOKEN,需要修改两处代码:
- 在Action的
action.yml中新增输入参数接收自定义Token:
inputs: benchmark_token: description: 'Token for posting PR comments' required: true
- 初始化Octokit实例时传入该自定义Token,替换默认逻辑:
const octokit = github.getOctokit(core.getInput('benchmark_token'))
3. 工作流中传入自定义Token
在调用该Action的步骤中,传入你配置好的BENCHMARK_TOKEN:
- name: Run benchmark compare uses: your-forked-action-path@v1 with: benchmark_token: ${{ secrets.BENCHMARK_TOKEN }} # 其他原有参数保持不变
4. 检查仓库权限配置
进入仓库Settings > Actions > General页面,确认两项配置:
- 「Workflow permissions」选择「Read and write permissions」
- 「Fork pull request workflows」根据仓库开放程度选择合适的运行规则,若为公共仓库建议选择「Require approval for all outside collaborators」避免恶意PR滥用权限
5. 确认自定义Token权限
如果你使用的是细粒度个人访问Token(Fine-grained PAT),需要确认该Token已开启对应仓库的以下权限:
- Pull requests: Read and write
- Issues: Read and write
如果使用的是经典PAT,需要确认已勾选public_repo(公开仓库)或repo(私有仓库)权限。
内容的提问来源于stack exchange,提问作者eth_sign
相关产品推荐
相关产品推荐

