使用部署密钥(R / W)从CircleCI推送到GitHub,但是GitHub说密钥是只读的

时间:2019-03-15 06:47:03

标签: github ssh circleci

(注意:我知道个人访问令牌可以使用,但是出于外部原因,我需要通过SSH部署密钥来执行此操作。源存储库和目标存储库都是私有的。)

我需要使用CircleCI将每次提交从源存储库推送到目标存储库。假设存储库分别命名为sourcetarget。我正在配置CircleCI来运行我的自定义推送脚本,但是它说密钥是只读的。

我所做的:

  • 在我的PC上用ssh-keygen创建了一个新密钥对,并压缩了私钥。
  • 将公共密钥id_rsa.pub作为部署密钥上载到目标存储库,并勾选“允许使用此密钥进行推送访问”。
  • 将压缩的私钥放入CircleCI上的存储库环境变量中
  • 编写此脚本:
#!/bin/bash

set -e

if [ -z "$SSH_KEY_E" ]; then
  echo "No SSH key found in environment, set it as \$SSH_KEY_E" >&2
  exit 1
fi

echo "$SSH_KEY_E" |
  base64 -d |
  gunzip -c > ~/.ssh/m.id_rsa

set -x # debug

cat >> ~/.ssh/config << EOF
Host GHMirror
  HostName github.com
  User git
  Port 22
  IdentityFile ~/.ssh/m.id_rsa
EOF
git remote add mirror GHMirror:iBug/circleci-target.git
git push mirror +master

输出日志表明从环境中还原的密钥是有效的,但似乎并没有用于推送到GitHub。

我想指出一些要点:

  • 在一开始,我改写了~/.ssh/id_rsa并直接将git@github.com:iBug/target.git用作mirror的远程URL,但这没有用,它说密钥是只读的。
  • 然后,考虑到默认密钥(由CircleCI)可能位于其他地方,我将远程主机更改为GHMirror,并将此规则写入~/.ssh/config,如shell脚本所示。仍然它抱怨密钥是只读的
  • 我将密钥更改为另一个路径~/.ssh/m.id_rsa,但是没有运气。

我已经通过在本地运行脚本验证了所有内容,并且脚本已成功推送到目标存储库,因此CircleCI上肯定缺少我想要的东西。

更新1

我添加了环境变量GIT_SSH_COMMAND="ssh -vv",并得到了以下结果:

debug1: key_load_public: No such file or directory
debug1: identity file /home/circleci/.ssh/id_rsa type -1
...
debug2: key:  (0xREDACTED), agent
debug2: key: /home/circleci/.ssh/id_rsa ((nil))
debug2: key: /home/circleci/.ssh/id_dsa ((nil))
debug2: key: /home/circleci/.ssh/id_ecdsa ((nil))
debug2: key: /home/circleci/.ssh/id_ed25519 ((nil))

但是,ls -l ~/.ssh/id_rsa显示文件位于,权限为0600。

1 个答案:

答案 0 :(得分:1)

我相信您遇到的问题是由于ssh-agent提供了CircleCI密钥(只读)。我过去也遇到过这个问题。要调试,您可以使用以下命令:

export GIT_SSH_COMMAND="ssh -vv"

这将打印出有关正在使用哪个密钥的详细信息。

我能够通过以下方式解决问题:

# Disable the ssh-agent
export SSH_AUTH_SOCK=none
# Tell ssh to use the specific SSH key 
export GIT_SSH_COMMAND="ssh -i path/to/key"

还要确保您chmod 0600 path/to/key。如果其他用户可读,则SSH将不会使用密钥。