(Catatan: Saya tahu bahwa token akses pribadi akan berfungsi, tetapi alasan eksternal mengharuskan saya melakukan ini melalui Kunci Penerapan SSH. Baik repo sumber dan repo target bersifat pribadi.)

Saya perlu menggunakan CircleCI untuk mendorong setiap komit dari repo sumber ke repo target. Asumsikan repo diberi nama source dan target. Saya mengonfigurasi CircleCI untuk menjalankan skrip Push kustom saya tetapi dikatakan bahwa kuncinya hanya-baca.

Apa yang telah kulakukan:

  • Membuat pasangan kunci baru dengan ssh-keygen di PC saya dan mengompres kunci pribadi.
  • Mengunggah kunci publik id_rsa.pub ke repo target sebagai Kunci Penerapan, dengan "izinkan akses push dengan kunci ini" dicentang.
  • Letakkan kunci pribadi terkompresi di variabel Lingkungan repositori di CircleCI
  • Tulis skrip ini:
#!/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

Log keluaran menunjukkan bahwa kunci yang dipulihkan dari lingkungan valid, tetapi sepertinya tidak digunakan untuk mendorong ke GitHub.

Beberapa poin yang ingin saya tunjukkan:

  • Pada awalnya, saya menimpa ~/.ssh/id_rsa dan menggunakan langsung git@github.com:iBug/target.git sebagai URL jarak jauh untuk mirror, tetapi tidak berhasil, dengan mengatakan bahwa kuncinya hanya-baca
  • Kemudian, berpikir bahwa kunci default (oleh CircleCI) mungkin terletak di tempat lain, saya mengubah Host jarak jauh menjadi GHMirror dan menulis aturan ini ke ~/.ssh/config, seperti yang terlihat pada skrip shell. Masih mengeluh bahwa kuncinya hanya-baca
  • Saya mengubah kunci ke jalur lain ~/.ssh/m.id_rsa, tetapi tidak berhasil.

Saya telah memverifikasi semuanya dengan menjalankan skrip secara lokal, dan berhasil mendorong ke repositori target, jadi pasti ada sesuatu di CircleCI yang saya lewatkan.

Perbarui 1

Saya menambahkan variabel lingkungan GIT_SSH_COMMAND="ssh -vv" dan mendapatkan hasil ini:

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))

Namun, ls -l ~/.ssh/id_rsa menunjukkan bahwa file ada di sana, dengan izin 0600.

3
iBug 15 Maret 2019, 09:47

1 menjawab

Jawaban Terbaik

Saya yakin masalah yang Anda alami adalah karena ssh-agent menawarkan kunci CircleCI, yang hanya-baca. Saya pernah mengalami masalah ini juga di masa lalu. Untuk men-debug Anda dapat menggunakan yang berikut ini:

export GIT_SSH_COMMAND="ssh -vv"

Ini akan mencetak detail tentang kunci mana yang digunakan.

Saya dapat memperbaiki masalah dengan sesuatu seperti ini:

# 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"

Pastikan juga bahwa Anda chmod 0600 path/to/key. SSH tidak akan menggunakan kunci jika dapat dibaca oleh pengguna lain.

2
dnephin 16 Maret 2019, 18:49