Xác thực Jenkins CI cho kho lưu trữ riêng của Github


136

Tôi muốn Jenkins tự động tìm nạp dữ liệu từ kho lưu trữ riêng của tôi được lưu trữ trên Github. Nhưng tôi không biết làm thế nào để hoàn thành nhiệm vụ đó .. Đã thử tài liệu, tạo ssh-key cho người dùng jenkins và tất cả những gì tôi có thể thấy là: "không thể sao chép repo". Tôi đã kiểm tra URL - chúng hợp lệ.

Bất kỳ manh mối nào, có thể bạn biết một số tài liệu / blog / bất cứ điều gì đang mô tả loại công cụ này?


Tôi trả lời đây là một câu hỏi tương tự, bạn có thể thấy câu trả lời trong liên kết dưới đây: jenkins & GitHub
user965062

Câu trả lời:


139

Có lẽ sự hỗ trợ của GitHub cho các khóa triển khai là những gì bạn đang tìm kiếm? Để trích dẫn trang đó:

Khi nào tôi nên sử dụng khóa triển khai?

Đơn giản, khi bạn có một máy chủ cần kéo quyền truy cập vào một repo riêng. Khóa này được đính kèm trực tiếp vào kho lưu trữ thay vì tài khoản người dùng cá nhân.

Nếu đó là những gì bạn đã thử và nó không hoạt động, bạn có thể muốn cập nhật câu hỏi của mình với nhiều chi tiết hơn về các URL đang được sử dụng, tên và vị trí của các tệp chính, v.v.


Bây giờ là phần kỹ thuật: Làm thế nào để sử dụng khóa SSH của bạn với Jenkins?

Nếu bạn có một jenkinsngười dùng unix, bạn có thể lưu khóa triển khai của mình vào ~/.ssh/id_rsa. Khi Jenkins cố gắng sao chép repo qua ssh, nó sẽ cố gắng sử dụng khóa đó.

Trong một số thiết lập, bạn không thể chạy Jenkins như một tài khoản người dùng riêng và cũng có thể không thể sử dụng vị trí khóa ssh mặc định ~/.ssh/id_rsa. Trong các trường hợp như vậy, bạn có thể tạo khóa ở một vị trí khác, ví dụ: ~/.ssh/deploy_keyvà định cấu hình sshđể sử dụng khóa đó với một mục trong ~/.ssh/config:

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

Vì tất cả những gì bạn xác thực cho tất cả các kho lưu trữ Github bằng cách sử dụng git@github.comvà bạn không muốn sử dụng khóa trên cho tất cả các kết nối của mình với Github, chúng tôi đã tạo một bí danh máy chủ github-triển khai-myproject . URL bản sao của bạn bây giờ trở thành

git clone github-deploy-myproject:myuser/myproject

và đó cũng là những gì bạn đặt làm URL kho lưu trữ vào Jenkins.

(Lưu ý rằng bạn không được đặt ssh: // ở phía trước để làm việc này.)


4
Bur làm thế nào để bạn tạo ra một chìa khóa cho jenkins?
Thiago Diniz

5
"Khóa triển khai" chỉ là bất kỳ khóa SSH cũ nào. Những gì tôi đã làm là chạy ssh-keygenkhi người dùng Jenkins chạy như ("jenkins" trên máy chủ Ubuntu của tôi). Sau đó tôi đã thêm vào ~jenkins/.ssh/id_rsa.pubphần khóa triển khai của kho lưu trữ trên github.
Adam Monsen

10
trên một số cài đặt, bạn sẽ cần phải ra khỏi ~thư mục này. Nhưng /var/lib/jenkins/.ssh/để người dùng jenkins mặc định sử dụng các phím đó!
garmoncheg

7
Để theo dõi bình luận của @garmoncheg, lưu ý rằng đó /var/lib/jenkins thư mục chính ( ~) cho jenkinsngười dùng.
David Harkness

1
Có ai biết làm thế nào để có được các móc triển khai làm việc với điều này? Tôi đang thấy lỗi giống như Could not match github-deploy-myproject:myuser/myprojecttrong nhật ký hook. Tôi đã nhập vào đó dưới dạng URL Repo của mình và các bản dựng hoạt động để nó có thể truy cập GitHub. Đây chỉ là bài đăng từ GitHub không kích hoạt bản dựng.
pogo

36

Một điều làm việc này đối với tôi là đảm bảo rằng nó github.comnằm trong ~jenkins/.ssh/known_hosts.


Điều này đã khắc phục vấn đề tôi gặp phải sau khi thiết lập một cặp chìa khóa, một cú đẩy git đã thất bại
chrisbunney

Trong trường hợp của tôi, cách dễ nhất để làm điều này là làm 'sudo su jenkins' vì không thể đăng nhập như người dùng jenkins đúng cách. Khi bạn có danh tính jenkins, bạn có thể thực hiện đăng nhập ssh thủ công vào github / bitbucket và chấp nhận khóa máy chủ từ xa thay mặt cho người dùng jenkins.
LOAS

Nhưng điều gì sẽ xảy ra nếu bạn biến Jenkins Khởi tạo thành một phần của môi trường phát triển 'bootstrap'. Khía cạnh 'thủ công' của việc này không hoạt động
TheJediCowboy 16/07/2015

13

Nếu bạn cần Jenkins truy cập nhiều hơn 1 dự án, bạn sẽ cần:
1. thêm khóa chung vào một tài khoản người dùng github
2. thêm người dùng này làm Chủ sở hữu (để truy cập tất cả các dự án) hoặc làm Cộng tác viên trong mọi dự án.

Nhiều khóa công khai cho một người dùng hệ thống sẽ không hoạt động vì GitHub sẽ tìm thấy khóa triển khai phù hợp đầu tiên và sẽ gửi lại lỗi như "ERROR: Quyền cho người dùng / repo2 bị từ chối cho người dùng / repo1"

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


2
Câu trả lời về việc sử dụng khóa triển khai hoạt động rất tốt nếu bạn chỉ có một kho lưu trữ duy nhất. Nhưng khi bạn muốn một máy chủ CI xây dựng các dự án trên nhiều repos, bạn ngay lập tức ở vị trí quản lý một số bộ khóa (một cặp cho mỗi repo) và việc tiếp cận được liệt kê trong câu trả lời này trở nên dễ dàng hơn nhiều.
cclark

Hướng dẫn của anh chàng này giải thích cách đặt nó thông qua các khóa triển khai khác nhau bằng cách sử dụng ~ / .ssh / config: gist.github.com/victorborda/2871029
Jorge Orpinel

@JorgeOrpinel, tôi tin rằng cách tiếp cận trong liên kết có thể ngăn các webhook của github kích hoạt các bản dựng bằng cách sử dụng plugin Github. Tôi đã tìm thấy một người dùng giả với một khóa duy nhất và truy cập vào tất cả các repos hoạt động tốt hơn khi tôi cũng muốn các bản dựng được kích hoạt bởi một webhook, vì tôi cần URL Kho lưu trữ trong cấu hình bản dựng để khớp với URL bản sao của github, hãy xem cái khác
chrisbunney

6

Jenkins tạo một người dùng Jenkins trên hệ thống. Khóa ssh phải được tạo cho người dùng Jenkins. Dưới đây là các bước:

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

Bây giờ bạn có thể tạo thông tin xác thực Jenkins bằng khóa SSH Trên bảng điều khiển Jenkins Thêm thông tin xác thực

chọn tùy chọn này

Khóa riêng: Từ chủ Jenkins ~ / .ssh


1

Tôi đã có một vấn đề tương tự với gitlab. Hóa ra tôi đã hạn chế người dùng được phép đăng nhập qua ssh. Điều này sẽ không ảnh hưởng đến người dùng github, nhưng trong trường hợp mọi người kết thúc ở đây vì các vấn đề của gitlab (và tương tự), hãy đảm bảo bạn thêm gitvào AllowUserscài đặt trong /etc/ssh/sshd_config:

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

0

Một tùy chọn khác là sử dụng mã thông báo truy cập cá nhân GitHub :

  • Tới https://github.com/settings/tokens/new
  • Thêm phạm vi repo
  • Trong Jenkins, thêm nguồn GitHub
  • Sử dụng URL HTTPS lưu trữ
  • Thêm URL HTTPS của repo git (không phải SSH , vd. https://github.com/my-username/my-project.git)
  • Thêm thông tin xác thực
    • Loại: Tên người dùng với Mật khẩu
    • Tên người dùng: tên người dùng GitHub
    • Mật khẩu: mã thông báo truy cập cá nhân bạn đã tạo trên GitHub
    • ID: đại loại như github-token-for-my-username

Tôi đã thử nghiệm điều này trên Jenkins ver. 2.222.1 và Jenkins GitHub plugin 1.29.5 với repo GitHub riêng.


-1

Một cách khác để trả lời từ sergey_mo là tạo nhiều khóa ssh trên máy chủ jenkins.

(Mặc dù là người bình luận đầu tiên cho câu trả lời của sergey_mo, điều này có thể sẽ gây đau đớn hơn là quản lý một cặp khóa duy nhất.)


9
Bây giờ tôi thấy tại sao chỉ cần đăng một URL là một chiến lược khủng khiếp cho câu trả lời. Các liên kết ở trên là chết.
Dejay Clayton 04/08/2015
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.