【问题标题】:Push to GitHub from CircleCI with Deploy Key (R/W), but GitHub says the key is read-only使用部署密钥(R/W)从 CircleCI 推送到 GitHub,但 GitHub 说密钥是只读的
【发布时间】:2019-03-15 06:47:02
【问题描述】:

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

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

我做了什么:

  • 在我的电脑上用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

输出日志表明从环境恢复的key是有效的,但是好像不是用来push到GitHub的。

我想指出几点:

  • 一开始我重写了~/.ssh/id_rsa,直接用git@github.com:iBug/target.git作为mirror的远程URL,但是没用,说key是只读的
  • 然后,考虑到默认密钥(由 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。

【问题讨论】:

  • 我可能错了,但是添加遥控器时不需要--push吗?
  • @Drazisil 在git push mirror +master 中指定这个新遥控器不起作用吗?注意这里mirror是新添加的遥控器的名字,不是选项--mirror
  • 对不起,我在想git remote set-url 我会让其他人更精通 git 回答:)

标签: github ssh circleci


【解决方案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 不会使用其他用户可以读取的密钥。

【讨论】:

  • 对我来说似乎不是这样。我会更新我的问题。但奇怪的是,您的解决方案是有效的,即使我无法弄清楚您的推理是否正确(日志显示 ssh 找不到密钥,而不是 ssh-agent 提供了错误的东西)。
猜你喜欢
  • 2014-05-14
  • 1970-01-01
  • 2019-05-21
  • 2018-08-20
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
  • 2021-04-29
  • 2019-12-07
相关资源
最近更新 更多