(注意:我知道个人访问令牌可以使用,但是出于外部原因,我需要通过SSH部署密钥来执行此操作。源存储库和目标存储库都是私有的。)
我需要使用CircleCI将每次提交从源存储库推送到目标存储库。假设存储库分别命名为source
和target
。我正在配置CircleCI来运行我的自定义推送脚本,但是它说密钥是只读的。
我所做的:
ssh-keygen
创建了一个新密钥对,并压缩了私钥。id_rsa.pub
作为部署密钥上载到目标存储库,并勾选“允许使用此密钥进行推送访问”。#!/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,但这没有用,它说密钥是只读的。GHMirror
,并将此规则写入~/.ssh/config
,如shell脚本所示。仍然它抱怨密钥是只读的~/.ssh/m.id_rsa
,但是没有运气。我已经通过在本地运行脚本验证了所有内容,并且脚本已成功推送到目标存储库,因此CircleCI上肯定缺少我想要的东西。
我添加了环境变量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。
答案 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将不会使用密钥。