【发布时间】:2019-03-15 06:47:02
【问题描述】:
(注意:我知道个人访问令牌可以使用,但外部原因需要我通过 SSH 部署密钥来执行此操作。源 repo 和目标 repo 都是私有的。)
我需要使用 CircleCI 将每个提交从源代码库推送到目标代码库。假设存储库被命名为 source 和 target。我正在配置 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 回答:)