Mengautentikasi Jenkins CI untuk repositori pribadi Github

137

Saya ingin Jenkins mengambil data secara otomatis dari repositori pribadi saya yang dihosting di Github. Tapi saya tidak tahu bagaimana menyelesaikan tugas itu .. Mencoba dokumentasi, menghasilkan kunci ssh untuk pengguna jenkins dan semua yang bisa saya lihat adalah: "tidak dapat mengkloning repo". Saya telah memeriksa URL - semuanya valid.

Ada petunjuk, mungkin Anda tahu beberapa dokumen / blog / apa pun yang menjelaskan tentang hal semacam ini?

bx2
sumber
Saya menjawab pertanyaan serupa ini, Anda dapat melihat jawabannya di tautan di bawah ini: jenkins & GitHub
user965062

Jawaban:

139

Mungkin dukungan GitHub untuk kunci penerapan adalah yang Anda cari? Mengutip halaman itu:

Kapan saya harus menggunakan kunci penerapan?

Sederhana, jika Anda memiliki server yang membutuhkan akses tarik ke satu repo pribadi. Kunci ini dilampirkan langsung ke repositori, bukan ke akun pengguna pribadi.

Jika itu yang sudah Anda coba dan itu tidak berhasil, Anda mungkin ingin memperbarui pertanyaan Anda dengan lebih detail tentang URL yang digunakan, nama dan lokasi file kunci, dll.


Sekarang untuk bagian teknis: Bagaimana cara menggunakan kunci SSH Anda dengan Jenkins?

Jika Anda memiliki, katakanlah, jenkinspengguna unix, Anda dapat menyimpan kunci penerapan Anda di ~/.ssh/id_rsa. Ketika Jenkins mencoba untuk mengkloning repo melalui ssh, ia akan mencoba menggunakan kunci itu.

Dalam beberapa penyiapan, Anda tidak dapat menjalankan Jenkins sebagai akun pengguna sendiri, dan mungkin juga tidak dapat menggunakan lokasi kunci ssh default ~/.ssh/id_rsa. Dalam kasus seperti itu, Anda dapat membuat kunci di lokasi berbeda, misalnya ~/.ssh/deploy_key, dan mengonfigurasi sshuntuk menggunakannya dengan entri di ~/.ssh/config:

Host github-deploy-myproject
    HostName       github.com
    User           git
    IdentityFile   ~/.ssh/deploy_key
    IdentitiesOnly yes

Karena semua yang Anda autentikasi ke semua repositori Github menggunakan [email protected]dan Anda tidak ingin kunci di atas digunakan untuk semua koneksi Anda ke Github, kami membuat alias host github-deploy-myproject . URL klon Anda sekarang menjadi

git clone github-deploy-myproject:myuser/myproject

dan itu juga yang Anda masukkan sebagai URL repositori ke Jenkins.

(Perhatikan bahwa Anda tidak boleh meletakkan ssh: // di depan agar ini berfungsi.)

Mark Longair
sumber
4
Tapi bagaimana Anda membuat kunci untuk jenkins?
Thiago Diniz
5
"Deploy key" adalah sembarang kunci SSH lama. Apa yang saya lakukan adalah dijalankan ssh-keygensebagai pengguna Jenkins berjalan sebagai ("jenkins" di server Ubuntu saya). Saya kemudian menambahkan ~jenkins/.ssh/id_rsa.pubke bagian kunci penerapan dari repositori di github.
Adam Monsen
10
pada beberapa penginstalan, Anda harus memasukkan ini bukan ke ~direktori. Tetapi /var/lib/jenkins/.ssh/bagi pengguna jenkins default untuk menggunakan kunci itu!
garmoncheg
7
Untuk menindaklanjuti komentar oleh @garmoncheg, perhatikan bahwa /var/lib/jenkins ini adalah direktori home ( ~) untuk jenkinspengguna.
David Harkness
1
Apakah ada yang tahu cara memasang kait yang bekerja dengan ini? Saya melihat kesalahan yang mirip dengan Could not match github-deploy-myproject:myuser/myprojectlog kail. Saya telah memasukkannya karena URL dan build Repo saya berfungsi sehingga dapat mengakses GitHub. Hanya pos dari GitHub yang gagal memicu pembuatan.
pogo
36

Satu hal yang membuat ini berhasil bagi saya adalah memastikannya github.commasuk ~jenkins/.ssh/known_hosts.

Edward Samson
sumber
Ini memperbaiki masalah yang saya alami di mana setelah menyiapkan pasangan kunci, git push gagal
chrisbunney
Dalam kasus saya, cara termudah untuk melakukan ini adalah dengan melakukan 'sudo su jenkins' karena tidak mungkin untuk masuk sebagai pengguna jenkins dengan benar. Setelah Anda memiliki identitas jenkins, Anda dapat melakukan login ssh manual ke github / bitbucket dan menerima kunci host jarak jauh atas nama pengguna jenkins.
LOAS
Tetapi bagaimana jika Anda menjadikan Inisialisasi Jenkins sebagai bagian dari 'bootstrap' lingkungan pengembangan Anda. Aspek 'manual' dari ini tidak berfungsi
TheJediCowboy
13

Jika Anda memerlukan Jenkins untuk mengakses lebih dari 1 proyek, Anda perlu:
1. menambahkan kunci publik ke satu akun pengguna github
2. menambahkan pengguna ini sebagai Pemilik (untuk mengakses semua proyek) atau sebagai Kolaborator di setiap proyek.

Banyak kunci publik untuk satu pengguna sistem tidak akan berfungsi karena GitHub akan menemukan kunci penerapan pertama yang cocok dan akan mengirim kembali kesalahan seperti "ERROR: Izin untuk pengguna / repo2 ditolak ke pengguna / repo1"

http://help.github.com/ssh-issues/

Sergii Mostovyi
sumber
2
Jawaban tentang penggunaan kunci penerapan berfungsi dengan baik jika Anda hanya memiliki satu repositori. Tetapi ketika Anda menginginkan server CI untuk membangun proyek di beberapa repo, Anda segera berada dalam posisi mengelola beberapa set kunci (satu pasang per repo) dan menjadi lebih mudah untuk mengambil pendekatan yang tercantum dalam jawaban ini.
cclark
Panduan orang ini menjelaskan cara menyetelnya melalui kunci penerapan yang
Jorge Orpinel
@JorgeOrpinel, saya yakin pendekatan pada tautan dapat mencegah webhook github memicu pembuatan menggunakan plugin Github. Saya menemukan pengguna dummy dengan satu kunci dan akses ke semua repo bekerja lebih baik ketika saya juga ingin build dipicu oleh webhook, karena saya memerlukan URL Repositori dalam konfigurasi build agar cocok dengan URL klon github, lihat URL saya yang lain komentar
chrisbunney
7

Jenkins membuat pengguna Jenkins di sistem. Kunci ssh harus dibuat untuk pengguna Jenkins. Berikut langkah-langkahnya:

sudo su jenkins -s /bin/bash
cd ~
mkdir .ssh // may already exist
cd .ssh
ssh-keygen

Sekarang Anda dapat membuat kredensial Jenkins menggunakan kunci SSH Di dasbor Jenkins Tambahkan Kredensial

pilih opsi ini

Kunci Pribadi: Dari master Jenkins ~ / .ssh

sinar
sumber
1

Saya memiliki masalah serupa dengan gitlab. Ternyata saya telah membatasi pengguna yang diizinkan untuk masuk melalui ssh. Ini tidak akan mempengaruhi pengguna github, tetapi dalam kasus orang berakhir di sini untuk gitlab (dan sejenisnya) masalah, pastikan Anda menambahkan gitke AllowUserspengaturan di /etc/ssh/sshd_config:

# Authentication:
LoginGraceTime 120
PermitRootLogin no
StrictModes yes
AllowUsers batman git
Jon
sumber
1

Opsi lainnya adalah menggunakan token akses pribadi GitHub :

  • Buka https://github.com/settings/tokens/new
  • Tambahkan cakupan repo
  • Di Jenkins, tambahkan sumber GitHub
  • Gunakan Repository HTTPS URL
  • Tambahkan URL HTTPS dari git repo (bukan yang SSH , mis. https://github.com/my-username/my-project.git)
  • Tambahkan kredensial
    • Jenis: Nama Pengguna dengan Kata Sandi
    • Nama pengguna: nama pengguna GitHub
    • Kata sandi: token akses pribadi yang Anda buat di GitHub
    • ID: sesuatu seperti github-token-for-my-username

Saya menguji ini pada Jenkins ver. 2.222.1 dan plugin Jenkins GitHub 1.29.5 dengan repo GitHub pribadi.

penyelamat
sumber
-1

Alternatif jawaban dari sergey_mo adalah membuat beberapa kunci ssh di server jenkins.

(Meskipun seperti yang dikatakan oleh pemberi komentar pertama pada jawaban sergey_mo, ini mungkin akan menjadi lebih menyakitkan daripada mengelola satu pasangan kunci.)

orlanthi
sumber
9
Sekarang saya mengerti mengapa hanya memposting URL adalah strategi jawaban yang buruk. Tautan di atas sudah mati.
Dejay Clayton