如何在Azure Databricks notebook中访问GitHub仓库文件且不使用PAT
完全可以用 deploy keys 替代个人 PAT 实现访问,这种方案和个人账号解绑,仅对单个仓库生效,还可以设置为只读权限,更适合服务类的固定访问场景,也可以根据你的使用需求选 GitHub App 方案,具体实现步骤如下:
方案一:使用 Deploy Keys(单仓库访问首选)
1. 生成 SSH 密钥对
你可以直接在 Databricks 集群的终端操作,或者本地生成后再上传密钥,执行命令:ssh-keygen -t ed25519 -C "databricks-repo-access"
全程回车不要设置密码,生成后公钥默认路径为 ~/.ssh/id_ed25519.pub,私钥路径为 ~/.ssh/id_ed25519。
2. 配置公钥到 GitHub 仓库
进入目标私有仓库的 Settings 页面,找到 Deploy keys 选项,点击 Add deploy key,把刚才生成的公钥内容完整粘贴进去,如果只需要读取文件,不要勾选 Allow write access,保存即可。
3. 在 Databricks 中配置私钥
不要把私钥硬编码在 notebook 里,建议存到 Databricks Secret 中,在 notebook 里读取后完成 SSH 配置:
import os from databricks.sdk import WorkspaceClient w = WorkspaceClient() # 读取存放在Secret中的私钥 private_key = w.secrets.get(scope="你的secret scope名称", key="github-deploy-key") # 初始化.ssh目录 ssh_dir = os.path.expanduser("~/.ssh") os.makedirs(ssh_dir, exist_ok=True) # 写入私钥并设置正确权限 private_key_path = os.path.join(ssh_dir, "id_ed25519") with open(private_key_path, "w") as f: f.write(private_key) os.chmod(private_key_path, 0o600) # 把GitHub加入known_hosts,避免SSH连接时的交互确认 os.system("ssh-keyscan github.com >> ~/.ssh/known_hosts")
如果集群所有用户都需要用到这个访问权限,可以把上述逻辑写成集群的 init 脚本,集群启动时自动完成配置,不用每个 notebook 单独执行。
4. 拉取仓库文件
不需要用原来的 HTTP 接口拉取,用 git 命令操作更稳定,如果只需要拉取单个文件,用 git archive 比克隆整个仓库更高效:
git archive --remote=git@github.com:<仓库所有者>/<仓库名>.git HEAD:<文件所在目录> <文件名> | tar -x
需要拉取整个仓库的话直接克隆即可:
git clone git@github.com:<仓库所有者>/<仓库名>.git
方案二:使用 GitHub App(多仓库访问首选)
如果你需要同时访问多个私有仓库,每个仓库单独配置 deploy keys 比较麻烦,可以选 GitHub App 方案:
- 创建一个 GitHub App,仅配置仓库内容的只读权限,把 App 安装到所有需要访问的私有仓库上
- 将 App 的私钥、App ID 等敏感信息存到 Databricks Secret 中
- 在 notebook 中调用 GitHub 接口生成短期访问令牌,有效期最长1小时,用完即失效,安全性比固定的 PAT 高很多
- 用生成的短期令牌替换你原来 curl 命令中的 PAT 即可,原有请求逻辑基本不需要修改。
注意事项
- 所有密钥、令牌类敏感信息都不要硬编码在 notebook 或脚本中,必须存在 Databricks Secret 中,避免泄露
- 测试连通性可以执行
ssh -T git@github.com,正常会返回你配置的 deploy key 对应的仓库提示
内容的提问来源于stack exchange,提问作者boom_clap

