Аутентифицировать Jenkins CI для частного хранилища Github


136

Я бы хотел, чтобы Дженкинс автоматически получил данные из моего частного репозитория, размещенного на Github. Но я понятия не имею, как выполнить эту задачу. Попробовал документацию, генерирующую ssh-ключ для пользователя jenkins, и все, что я вижу, это: «невозможно клонировать репо». Я проверил URL - они действительны.

Есть какие-нибудь подсказки, может быть, вы знаете какие-нибудь документы / блоги / что-нибудь, что описывает подобные вещи?


Я отвечаю на этот похожий вопрос, вы можете увидеть ответ по ссылке ниже: jenkins & GitHub
user965062

Ответы:


139

Возможно, вы ищете поддержку GitHub для ключей развертывания ? Чтобы процитировать эту страницу:

Когда я должен использовать ключ развертывания?

Все просто, когда у вас есть сервер, которому нужен доступ по запросу для одного частного репо. Этот ключ прикрепляется непосредственно к хранилищу, а не к личной учетной записи пользователя.

Если это то, что вы уже пытаетесь, и это не работает, вы можете обновить свой вопрос с более подробной информацией об используемых URL, именах и расположении файлов ключей и т. Д.


Теперь о технической части: как использовать ваш SSH-ключ с Дженкинсом?

Если у вас есть, скажем, jenkinsпользователь Unix, вы можете сохранить свой ключ развертывания ~/.ssh/id_rsa. Когда Дженкинс попытается клонировать репо через ssh, он попытается использовать этот ключ.

В некоторых случаях вы не можете запустить Jenkins как собственную учетную запись пользователя и, возможно, также не можете использовать расположение ключа ssh по умолчанию ~/.ssh/id_rsa. В таких случаях вы можете создать ключ в другом месте, например ~/.ssh/deploy_key, и настроить его sshдля использования с записью в ~/.ssh/config:

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

Поскольку все, что вы аутентифицируете во всех репозиториях Github, git@github.comи не хотите, чтобы вышеуказанный ключ использовался для всех ваших соединений с Github, мы создали псевдоним хоста github-deploy-myproject . URL вашего клона теперь становится

git clone github-deploy-myproject:myuser/myproject

и это также то, что вы указали в качестве URL-адреса хранилища в Jenkins.

(Обратите внимание, что вы не должны помещать ssh: // вперед, чтобы это работало.)


4
Но как ты создал ключ для Дженкинса?
Тьяго Диниз

5
«Ключ развертывания» - это просто любой старый ключ SSH. Что я сделал, так это запустился ssh-keygenот имени пользователя Jenkins («jenkins» на моем сервере Ubuntu). Затем я добавил ~jenkins/.ssh/id_rsa.pubв раздел ключей развертывания репозитория на github.
Адам Монсен

10
на некоторых установках вам нужно будет вывести это не в ~каталог. Но /var/lib/jenkins/.ssh/для пользователя jenkins по умолчанию использовать эти ключи!
Гармончег

7
Чтобы прокомментировать комментарий @garmoncheg, обратите внимание, что /var/lib/jenkins это домашний каталог ( ~) для jenkinsпользователя.
Дэвид Харкнесс

1
Кто-нибудь знает, как заставить работать ловушки с этим? Я вижу ошибки, похожие Could not match github-deploy-myproject:myuser/myprojectна журнал логов. Я ввел это как мой Repo URL, и сборки работают так, чтобы он мог получить доступ к GitHub. Это просто сообщение от GitHub, которое не запускает сборку.
пая

36

Одна вещь, которая заставила это работать для меня, должна удостовериться, что github.comэто в ~jenkins/.ssh/known_hosts.



В моем случае самый простой способ сделать это - сделать sudo su jenkins, так как невозможно войти в систему как пользователь jenkins. Получив идентификацию jenkins, вы можете выполнить ssh-вход вручную в github / bitbucket и принять ключ удаленного хоста от имени пользователя jenkins.
LOAS

Но что, если вы сделаете инициализацию Jenkins частью своей среды разработки «начальной загрузки». «Ручной» аспект этого не работает
TheJediCowboy

13

Если вам нужен Jenkins для доступа к более чем
одному проекту, вам необходимо: 1. добавить открытый ключ к одной учетной записи пользователя github
2. добавить этого пользователя в качестве владельца (для доступа ко всем проектам) или в качестве коллаборатора в каждом проекте.

Многие открытые ключи для одного пользователя системы не будут работать, потому что GitHub найдет первый соответствующий ключ развертывания и отправит сообщение об ошибке типа «ОШИБКА: разрешение пользователю / repo2 отказано пользователю / repo1»

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


2
Ответ об использовании ключа развертывания отлично работает, если у вас есть только один репозиторий. Но когда вы хотите, чтобы CI-сервер создавал проекты для нескольких репо, вы сразу же можете управлять несколькими наборами ключей (по одной паре на репо), и становится намного проще использовать подход, указанный в этом ответе.
cclark

Руководство этого парня объясняет, как установить его с помощью различных ключей развертывания, используя ~ / .ssh / config: gist.github.com/victorborda/2871029
Хорхе Орпинел,

@JorgeOrpinel, я полагаю, что подход в ссылке может помешать github webhooks запускать сборки с помощью плагина Github. Я нашел фиктивного пользователя с одним ключом, и доступ ко всем репозиториям работал лучше, когда я также хотел, чтобы сборки запускались через веб-крючок, потому что мне нужно было, чтобы URL-адрес хранилища в конфигурации сборки совпадал с URL-адресом клона github, см. Мой другой комментарий
chrisbunney

6

Jenkins создает пользователя Jenkins в системе. Ключ ssh должен быть сгенерирован для пользователя Jenkins. Вот шаги:

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

Теперь вы можете создать учетные данные Jenkins с помощью ключа SSH На панели управления Jenkins Добавить учетные данные

выберите эту опцию

Закрытый ключ: от мастера Дженкинса ~ / .ssh


1

У меня была похожая проблема с gitlab. Оказывается, я ограничил пользователей, которым разрешено входить через ssh. Это не повлияет на GitHub пользователей, но в случае , если люди в конечном итоге здесь gitlab (и т.п.) вопросов, чтобы вы добавить gitв AllowUsersнастройки в /etc/ssh/sshd_config:

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

0

Другой вариант - использовать токены личного доступа GitHub :

  • Перейдите на https://github.com/settings/tokens/new.
  • Добавить репо область
  • В Jenkins добавьте GitHub источник
  • Использовать репозиторий HTTPS URL
  • Добавьте URL HTTPS для git-репо (не SSH , например.https://github.com/my-username/my-project.git )
  • Добавить учетные данные
    • Вид: Имя пользователя с паролем
    • Имя пользователя: имя пользователя GitHub
    • Пароль: личный токен доступа, который вы создали на GitHub
    • ID: что-то вроде github-token-for-my-username

Я проверил это на Дженкинс вер. 2.222.1 и плагин Jenkins GitHub 1.29.5 с частным репозиторием GitHub.


-1

Альтернативой ответу от sergey_mo является создание нескольких ключей ssh ​​на сервере jenkins.

(Хотя, как сказал первый комментатор к ответу sergey_mo, это может оказаться более болезненным, чем управление одной парой ключей.)


9
Теперь я понимаю, почему просто разместить URL-адрес - ужасная стратегия для ответов. Ссылка выше не работает.
Деджей Клейтон,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.