验证Github私有存储库的Jenkins CI


136

我希望Jenkins从托管在Github上的私有存储库自动获取数据。但是我不知道如何完成该任务。尝试了文档,为jenkins用户生成了ssh-key,我所看到的就是:“无法克隆存储库”。我已经检查过网址-它们是有效的。

任何线索,也许您知道一些描述此类内容的文档/博客/内容?


我回答了一个类似的问题,您可以在下面的链接中看到答案:jenkins和GitHub
user965062 2011年

Answers:


139

也许GitHub 对您正在寻找的部署密钥提供支持?引用该页面:

什么时候应该使用部署密钥?

很简单,当您的服务器需要对单个私有存储库的访问权限。该密钥直接附加到存储库,而不是个人用户帐户。

如果这是您已经尝试过的方法,但是它不起作用,则可能需要使用所用URL,密钥文件的名称和位置等更多详细信息来更新您的问题。


现在是技术部分:如何在Jenkins中使用SSH密钥?

例如,如果您有一个jenkinsUnix用户,则可以将您的部署密钥存储在中~/.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
Bur,您如何为詹金斯创建密钥?
Thiago Diniz

5
“部署密钥”就是任何旧的SSH密钥。我所做的是ssh-keygen在用户Jenkins运行时(在我的Ubuntu服务器上为“ jenkins”)运行。然后~jenkins/.ssh/id_rsa.pub,我将其添加到github上存储库的部署密钥部分。
亚当·蒙森,

10
在某些安装中,您需要将其移出~目录。但是/var/lib/jenkins/.ssh/,对于默认的詹金斯用户来说,这些键就可以使用!
garmoncheg

7
要跟踪@garmoncheg的评论,请注意这/var/lib/jenkins 是用户的主目录(~jenkins
David Harkness

1
有谁知道如何使用部署挂钩?我Could not match github-deploy-myproject:myuser/myproject在挂钩日志中看到类似的错误。我已经输入了它作为我的Repo URL,并且构建工作正常,因此可以访问GitHub。只是来自GitHub的帖子无法触发构建。
pogo

36

对我来说起作用的一件事是确保它github.com在其中~jenkins/.ssh/known_hosts


这解决了我在设置密钥对后在哪里进行git push失败的问题
chrisbunney

在我的情况下,最简单的方法是执行“ sudo su jenkins”,因为无法以jenkins用户身份正确登录。拥有jenkins身份后,您可以手动ssh登录github / bitbucket并代表jenkins用户接受远程主机密钥。
LOAS

但是,如果将Jenkins Initialization纳入开发环境的“ bootstrap”,该怎么办?这种“手动”方式不起作用
TheJediCowboy

13

如果您需要詹金斯访问1个以上的项目,则需要:
1.将一个公钥添加到一个github用户帐户中
。2.将该用户添加为所有者(以访问所有项目)或在每个项目中作为协作者。

一个系统用户的许多公共密钥将无法使用,因为GitHub将找到第一个匹配的部署密钥,并会发回错误,例如“错误:用户/ repo2的权限被拒绝给用户/ repo1”

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


2
如果您只有一个存储库,那么使用部署密钥的答案非常有用。但是,当您希望CI服务器跨多个存储库构建项目时,您将立即处于管理几组密钥(每个存储库一对)的位置,采用此答案中列出的方法变得容易得多。
cclark

这家伙的指南解释了如何使用〜/ .ssh / config通过不同的部署密钥进行设置:gist.github.com/victorborda/2871029
Jorge Orpinel 2014年

@JorgeOrpinel,我相信链接中的方法可以防止github webhooks使用Github插件触发构建。我发现一个具有单个密钥的虚拟用户,并且当我还希望通过Webhook触发构建时,可以更好地访问所有存储库,因为我需要在构建配置中使用存储库URL来匹配github克隆URL,请参见我的其他文章。评论
chrisbunney 2015年

6

Jenkins在系统上创建一个用户Jenkins。ssh密钥必须为Jenkins用户生成。步骤如下:

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

现在,您可以使用SSH密钥在Jenkins仪表板上添加Jenkins凭据。

选择这个选项

私钥:来自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
  • 添加HTTPS的混帐回购协议的URL(而不是SSH之一,例如。https://github.com/my-username/my-project.git
  • 添加凭证
    • 类型:用户名和密码
    • 用户名:GitHub用户名
    • 密码:您在GitHub上创建的个人访问令牌
    • ID:类似 github-token-for-my-username

我在詹金斯ver。上进行了测试。2.222.1和带有私有GitHub存储库的Jenkins GitHub插件1.29.5。


-1

sergey_mo的答案的另一种选择是在jenkins服务器上创建多个ssh密钥。

(尽管正如sergey_mo回答的第一位评论者所说,这可能最终比管理单个密钥对更加痛苦。)


9
现在,我明白了为什么仅发布URL是获取答案的糟糕策略。上面的链接无效。
Dejay Clayton
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.