Аутентифицировать 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.