You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitHub Action拉取GitHub私有仓库pub包报公钥权限错误如何解决?

解决方案

方案1:配置SSH密钥(无需修改现有pubspec.yaml,推荐)

这个方案和你本地使用SSH拉取私有包的逻辑一致,不需要改项目原有配置,只需要给CI环境配置对应访问权限即可:

  • 本地生成专用的CI SSH密钥对,执行命令:
    ssh-keygen -t ed25519 -C "github-action-flutter-ci" -f ci-ssh-key
    执行过程中连续按回车跳过密码设置,生成后会得到ci-ssh-key(私钥文件)和ci-ssh-key.pub(公钥文件)。
  • 把公钥添加到私有依赖包仓库(也就是你my_package对应的仓库)的部署密钥中:
    进入my_package仓库页面 → 顶部Settings → 左侧菜单找到Deploy keys → 点击Add deploy key,自定义标题后把ci-ssh-key.pub里的所有内容粘贴进去,不需要勾选写权限,直接保存即可。
  • 把私钥添加到运行GitHub Action的主项目仓库的机密配置中:
    进入你的Flutter主项目仓库页面 → 顶部Settings → 左侧菜单找到Secrets and variables → 选择Actions → 点击New repository secret,名称填SSH_PRIVATE_KEY,值把ci-ssh-key文件里的所有内容原封不动粘贴进去,保存。
  • 修改你的GitHub Action配置文件,在安装依赖步骤前添加SSH配置步骤,修改后的完整脚本如下:
    name: Flutter
    
    on: [pull_request, push]
    
    jobs:
      build:
        runs-on: ubuntu-latest
    
        steps:
          - uses: actions/checkout@v2
          - uses: subosito/flutter-action@v1.5.0
          
          # 新增的SSH配置步骤
          - name: 配置SSH访问私有仓库权限
            run: |
              mkdir -p ~/.ssh
              echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_ed25519
              chmod 600 ~/.ssh/id_ed25519
              ssh-keyscan github.com >> ~/.ssh/known_hosts
    
          - name: Install Dependencies
            run: flutter packages get
    
          - name: Format
            run: flutter format --set-exit-if-changed lib test
    
          - name: Analyze
            run: flutter analyze lib test
    
          - name: Run tests
            run: flutter test --no-pub --coverage --test-randomize-ordering-seed random
    

*注意:不要泄露生成的私钥内容,也不要提交到代码仓库。

方案2:使用PAT个人访问令牌(需要修改pubspec.yaml)

如果你不想用SSH的方式,也可以通过GitHub个人访问令牌走HTTPS协议拉取私有包:

  • 生成一个PAT,权限仅勾选repo读权限即可,不要授予多余权限。
  • 把PAT添加到主项目的Action机密中,命名为GH_PAT。
  • 修改pubspec.yaml中私有包的地址,使用占位符预留PAT位置:
    my_package:
      git:
        url: https://GIT_PAT_PLACEHOLDER@github.com/username/my_package.git
        ref: main
    
  • 在Action脚本的安装依赖步骤前添加占位符替换步骤:
    - name: 替换私有包访问令牌
      run: sed -i "s/GIT_PAT_PLACEHOLDER/${{ secrets.GH_PAT }}/g" pubspec.yaml
    

这个方案需要处理本地开发时的pubspec适配,相对繁琐,更推荐使用方案1。

内容的提问来源于stack exchange,提问作者Boris Kayi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 19:57:03