为 Github 私有仓库验证 Jenkins CI

142
我希望Jenkins能够自动从我在Github上托管的私有仓库中获取数据。 但是我不知道如何完成这个任务。尝试了文档,为Jenkins用户生成ssh密钥,但看到的只有 "无法克隆repo"。 我已经检查了URL,它们是有效的。
有什么线索吗?也许你知道一些描述这种情况的文档/博客/任何东西?

我回答了一个类似的问题,你可以在下面的链接中看到答案:jenkins & GitHub - user965062
7个回答

140
也许 GitHub 对部署密钥的支持是你正在寻找的?引用该页面上的内容:
“何时应使用部署密钥?简单来说,当您有一个需要对单个私有存储库进行拉取访问的服务器时。此密钥直接附加到存储库而不是个人用户帐户。”
如果您已经尝试过这个方法但它不起作用,您可能需要更新您的问题,并提供更多使用的 URL、密钥文件的名称和位置等详细信息。

现在进入技术部分:如何使用你的SSH密钥与Jenkins?

如果你有一个名为 jenkins 的Unix用户,你可以将你的部署密钥存储在 ~/.ssh/id_rsa 中。当Jenkins尝试通过ssh克隆仓库时,它将尝试使用该密钥。

在某些设置中,你无法将Jenkins作为自己的用户帐户运行,并且可能也不能使用默认的ssh密钥位置 ~/.ssh/id_rsa。在这种情况下,你可以在不同的位置创建一个密钥,例如 ~/.ssh/deploy_key,并在 ~/.ssh/config 中配置ssh以使用该密钥:

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

因为您需要使用git@github.com对所有Github存储库进行身份验证,而您不希望上述密钥用于与Github的所有连接,因此我们创建了一个主机别名github-deploy-myproject。现在您的克隆URL变成了:

git clone github-deploy-myproject:myuser/myproject

这也是你在 Jenkins 中输入的 仓库 URL

(注意,为了使其正常工作,你不应该在前面加上 ssh://。)


4
您想知道如何为Jenkins创建一个密钥? - Thiago Diniz
5
“Deploy Key” 只是一种普通的SSH密钥。我所做的是以Jenkins用户身份(在我的Ubuntu服务器上为“jenkins”)运行ssh-keygen命令。然后,我将~jenkins/.ssh/id_rsa.pub添加到GitHub存储库的“deploy keys”部分。 - Adam Monsen
10
在某些安装中,您需要将这个文件放置在~目录之外,而是放置在/var/lib/jenkins/.ssh/目录中,以便默认的Jenkins用户可以使用这些密钥! - garmoncheg
7
跟进 @garmoncheg 的评论,注意 /var/lib/jenkins 实际上是 jenkins 用户的主目录 (~)。 - David Harkness
1
有人知道如何让部署钩子与此配合工作吗?我在钩子日志中看到类似于“无法匹配github-deploy-myproject:myuser / myproject”的错误。我已将其输入为我的Repo URL,并且构建确实可以工作,因此它可以访问GitHub。只是来自GitHub的后续操作无法触发构建。 - pogo
显示剩余5条评论

37

我的一个解决方法是确保github.com~jenkins/.ssh/known_hosts文件中。


这解决了我的问题,我在设置密钥对后,使用git push失败的情况。 - chrisbunney
在我的情况下,最简单的方法是执行 'sudo su jenkins',因为无法正确地以jenkins用户登录。一旦你获得了jenkins的身份,就可以手动ssh登录到github/bitbucket,并代表jenkins用户接受远程主机密钥。 - LOAS
但是如果你将 Jenkins 初始化作为开发环境“引导程序”的一部分呢?这种“手动”的方式是不可行的。 - TheJediCowboy

13

如果你需要让Jenkins访问多个项目,你需要执行以下步骤:
1. 将公钥添加到一个GitHub用户账户中
2. 在每个项目中将该用户添加为Owner(可以访问所有项目)或Collaborator。

对于一个系统用户来说,添加多个公钥是行不通的,因为GitHub会找到第一个匹配的部署密钥,然后返回类似于"ERROR: Permission to user/repo2 denied to user/repo1"的错误信息。

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


2
如果您只有一个存储库,使用部署密钥的答案非常有效。但是,当您想要CI服务器在多个存储库中构建项目时,您立即处于管理多组密钥(每个存储库一对)的位置,并且采用本答案中列出的方法会变得更加容易。 - cclark
这位作者的指南解释了如何使用~/.ssh/config通过不同的部署密钥进行设置:https://gist.github.com/victorborda/2871029 - Jorge Orpinel Pérez
@JorgeOrpinel,我相信链接中的方法可以防止使用Github插件的github webhooks触发构建。 当我也想要通过webhook触发构建时,我发现一个带有单个密钥和访问所有存储库权限的虚拟用户运作更好,因为我需要在构建配置中匹配存储库URL和github克隆URL,请参见我的[其他评论] (https://dev59.com/W2435IYBdhLWcg3wyzQJ#g2oRoYgBc1ULPQZFvs-_) - chrisbunney

7

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

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添加到/etc/ssh/sshd_configAllowUsers设置中。
# Authentication:
LoginGraceTime 120
PermitRootLogin no
StrictModes yes
AllowUsers batman git

1
另一个选项是使用GitHub个人访问令牌
  • 前往https://github.com/settings/tokens/new
  • 添加repo范围
  • 在Jenkins中添加GitHub
  • 使用存储库HTTPS URL
  • 添加git存储库的HTTPS URL(不是SSH,例如https://github.com/my-username/my-project.git
  • 添加凭据
    • 类型:用户名和密码
    • 用户名:GitHub用户名
    • 密码:您在GitHub上创建的个人访问令牌
    • ID:类似于github-token-for-my-username的内容

我在Jenkins ver. 2.222.1和Jenkins GitHub插件1.29.5上测试了这个方法,使用了私有GitHub存储库。


-1

与sergey_mo的答案不同,另一种方法是在Jenkins服务器上创建多个SSH密钥。

(尽管作为sergey_mo答案的第一个评论者所说,这可能比管理单个密钥对更痛苦。)


9
现在我明白了,为什么仅仅发布一个URL作为答案是一个糟糕的策略。上面的链接已经失效了。 - Dejay Clayton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接