如何为GitHub Actions配置SSH密钥访问私有pre-commit仓库?
问题根源:你使用的是SSH格式的私有仓库地址(git@github.com:username/precommit-hooks.git),而checkout的persist-credentials功能仅针对HTTPS地址生效——它会把GITHUB_TOKEN存入git凭证助手,用于HTTPS请求的认证,但SSH认证依赖密钥对,和HTTPS令牌不兼容,因此出现权限拒绝错误。
以下是三种可行的解决方法:
方法一:改用HTTPS格式的仓库地址(最简单)
直接修改.pre-commit-config.yaml中的仓库地址为HTTPS格式:
- repo: https://github.com/username/precommit-hooks.git rev: v0.0.1 hooks: - id: check-security
GitHub Actions默认的GITHUB_TOKEN对同组织/账户下的私有仓库有拉取权限,无需额外配置,pre-commit会自动使用已有的凭据完成认证。
方法二:配置SSH密钥对用于认证
如果必须保留SSH地址,可按以下步骤配置SSH凭据:
- 本地生成SSH密钥对:
ssh-keygen -t ed25519 -C "github-actions@your-project.com" -f github-actions-key
生成过程中不要设置密码,直接按回车跳过。
将公钥添加到私有仓库:
打开存放pre-commit钩子的私有仓库(precommit-hooks.git),进入Settings->Deploy keys,添加刚生成的公钥文件(github-actions-key.pub)内容,勾选「Allow write access」(仅需拉取的话选只读即可)。将私钥存入Actions Secrets:
回到你的GitHub Actions所在仓库,进入Settings->Secrets and variables->Actions,新建一个Secret(比如命名为SSH_PRIVATE_KEY),把私钥文件(github-actions-key)的完整内容粘贴进去。在Workflow中配置SSH:
修改你的Actions步骤,添加SSH环境配置:
- name: Set up SSH agent uses: webfactory/ssh-agent@v0.7.0 with: ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} - name: Add GitHub to known hosts run: ssh-keyscan github.com >> ~/.ssh/known_hosts - name: Run pre-commit on changed files run: | pip install pre-commit pre-commit run --from-ref origin/HEAD --to-ref HEAD
方法三:用GITHUB_TOKEN替换SSH地址的认证逻辑
通过git配置将SSH地址自动转换为带令牌的HTTPS地址,无需修改pre-commit配置:
- name: Run pre-commit on changed files run: | pip install pre-commit git config --global url."https://${{ secrets.GITHUB_TOKEN }}@github.com/".insteadOf "git@github.com:" pre-commit run --from-ref origin/HEAD --to-ref HEAD
这条git配置会让所有指向git@github.com:的请求,自动替换为用GITHUB_TOKEN认证的HTTPS请求,从而利用已有的凭证完成认证。
内容的提问来源于stack exchange,提问作者tgk

