如何让GitHub Actions安全访问Fork的PR Secrets并需运行审批
解决Fork PR的GitHub Actions Secrets访问与审批平衡问题
问题背景
我维护一个公开仓库(https://github.com/sol4k/sol4k),其中的端到端测试需要调用GitHub Secrets。当前工作流配置如下:
on: pull_request: ....
存在以下问题:
- 仓库所有者发起PR时,工作流可正常访问Secrets并运行
- 外部用户从Fork发起PR时,即便批准运行,工作流仍无法读取Secrets,导致测试失败
若改为pull_request_target触发:
pull_request_target: branches: - main
虽然能正常访问Secrets,但工作流会自动运行,无需审批,存在Secrets泄露风险。
需求
实现GitHub Actions处理Fork PR时,既能访问Secrets,又必须先获得运行审批。
解决方案:pull_request_target + 环境审批机制
通过结合pull_request_target触发事件和GitHub环境的审批规则,可同时满足Secrets访问和审批要求,步骤如下:
1. 创建需要审批的环境
- 进入仓库「Settings」→「Environments」→点击「New environment」
- 输入环境名称(例如
protected-e2e-tests) - 开启「Required reviewers」,添加需要审批的团队或个人(如仓库维护者)
- 可按需开启其他保护规则(如分支限制)
2. 修改工作流配置
更新工作流文件,使用pull_request_target触发,并指定运行环境为上述创建的审批环境,同时确保拉取PR分支的代码(pull_request_target默认会拉取基础分支代码):
on: pull_request_target: branches: - main jobs: e2e-tests: runs-on: ubuntu-latest environment: protected-e2e-tests # 指定需要审批的环境 steps: - name: 拉取PR分支代码 uses: actions/checkout@v4 with: ref: ${{ github.event.pull_request.head.sha }} repository: ${{ github.event.pull_request.head.repo.full_name }} - name: 运行端到端测试 run: npm run e2e # 替换为你的测试命令 env: TEST_SECRET: ${{ secrets.TEST_SECRET }} # 正常访问Secrets
关键注意事项
pull_request_target默认使用基础分支的代码,必须手动配置拉取PR分支的代码,否则测试会运行基础分支逻辑,无法验证PR内容- 审批前务必仔细审查PR代码:审批通过后工作流会执行PR中的代码,若代码存在恶意逻辑,可能导致Secrets泄露,需确保PR内容安全后再审批
内容的提问来源于stack exchange,提问作者Sasha Shpota
相关产品推荐
相关产品推荐

