Нажмите на GitHub из CircleCI с ключом развертывания (R / W), но GitHub говорит, что ключ доступен только для чтения - PullRequest
3 голосов
/ 15 марта 2019

(Примечание: я знаю, что личный токен доступа будет работать, но внешние причины требуют, чтобы я делал это через ключ развертывания 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.

1 Ответ

1 голос
/ 16 марта 2019

Я полагаю, что проблема, с которой вы столкнулись, связана с тем, что 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 не будет использовать ключи, если они доступны для чтения другим пользователям.

...