(Примечание: я знаю, что личный токен доступа будет работать, но внешние причины требуют, чтобы я делал это через ключ развертывания SSH. И исходное, и целевое хранилища являются личными.)
Мне нужно использовать CircleCI для передачи каждого коммита из исходного репо в целевой репо. Предположим, что репозитории имеют имена source
и target
. Я настраиваю CircleCI для запуска своего собственного скрипта push, но он говорит, что ключ доступен только для чтения.
Что я сделал:
- Создал новую пару ключей с
ssh-keygen
на моем ПК и сжал закрытый ключ.
- Загружен открытый ключ
id_rsa.pub
в целевое хранилище в качестве ключа развертывания, с отметкой «разрешить push-доступ с этим ключом».
- Поместите сжатый закрытый ключ в переменные среды репозитория на 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
в качестве удаленного URL для mirror
, но он не работал, говоря, что ключ доступен только для чтения
- Затем, подумав, что ключ по умолчанию (от CircleCI) может быть расположен где-то еще, я изменил удаленный хост на
GHMirror
и записал это правило в ~/.ssh/config
, как видно из сценария оболочки. Тем не менее он жалуется, что ключ только для чтения
- Я сменил ключ на другой путь
~/.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.