为 Github 私有存储库验证 Jenkins CI
Posted
技术标签:
【中文标题】为 Github 私有存储库验证 Jenkins CI【英文标题】:Authenticate Jenkins CI for Github private repository 【发布时间】:2011-07-09 21:32:38 【问题描述】:我想让 Jenkins 自动从我托管在 Github 上的私有存储库中获取数据。 但我不知道如何完成这项任务.. 尝试了文档,为 jenkins 用户生成 ssh-key,我所能看到的只是:“无法克隆 repo”。我检查了 URL - 它们是有效的。
任何线索,也许你知道一些描述这类东西的文档/博客/任何东西?
【问题讨论】:
我回答了一个类似的问题,你可以在下面的链接中看到答案:jenkins & GitHub 【参考方案1】:也许 GitHub 对 deploy keys 的支持正是您想要的?引用该页面:
我应该何时使用部署密钥?
很简单,当您的服务器需要对单个私有存储库进行拉取访问时。此密钥直接附加到存储库,而不是附加到个人用户帐户。
如果这是您已经在尝试的方法,但它不起作用,您可能希望使用正在使用的 URL、密钥文件的名称和位置等的更多详细信息来更新您的问题。
现在是技术部分:如何在 Jenkins 中使用 SSH 密钥?
如果您有一个jenkins
unix 用户,您可以将部署密钥存储在~/.ssh/id_rsa
中。当 Jenkins 尝试通过 ssh 克隆 repo 时,它会尝试使用该密钥。
在某些设置中,您无法将 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
因为您使用 git@github.com
对所有 Github 存储库进行身份验证,并且您不希望上述密钥用于您与 Github 的所有连接,所以我们创建了一个主机别名 github-deploy-myproject。您的克隆 URL 现在变为
git clone github-deploy-myproject:myuser/myproject
这也是您将 repository URL 放入 Jenkins 中的内容。
(请注意,您必须不将 ssh:// 放在前面才能使其正常工作。)
【讨论】:
Bur 如何为 jenkins 创建密钥? “部署密钥”就是任何旧的 SSH 密钥。我所做的是运行ssh-keygen
,因为用户 Jenkins 运行为(我的 Ubuntu 服务器上的“jenkins”)。然后我将 ~jenkins/.ssh/id_rsa.pub
添加到 github 上存储库的部署密钥部分。
在某些安装中,您需要将其输出到 ~
目录中。但是进入/var/lib/jenkins/.ssh/
,让默认的詹金斯用户使用这些密钥!
要跟进@garmoncheg 的评论,请注意/var/lib/jenkins
是 jenkins
用户的主目录(~
)。
有谁知道如何让部署挂钩与它一起工作?我在挂钩日志中看到类似于 Could not match github-deploy-myproject:myuser/myproject
的错误。我已将其作为我的 Repo URL 输入,并且构建工作正常,因此它可以访问 GitHub。只是来自 GitHub 的帖子未能触发构建。【参考方案2】:
这对我有用的一件事是确保github.com
在~jenkins/.ssh/known_hosts
中。
【讨论】:
这解决了我在设置密钥对后 git push 失败的问题 在我的情况下,最简单的方法是执行“sudo su jenkins”,因为无法以 jenkins 用户身份正确登录。拥有 jenkins 身份后,您可以手动 ssh 登录到 github/bitbucket 并代表 jenkins 用户接受远程主机密钥。 但是,如果您将 Jenkins 初始化作为开发环境“引导程序”的一部分会怎样。这个“手动”方面不起作用【参考方案3】:如果您需要 Jenkins 访问超过 1 个项目,您需要: 1.为一个github用户账户添加公钥 2. 将此用户添加为所有者(以访问所有项目)或作为每个项目中的协作者。
一个系统用户的许多公钥将不起作用,因为 GitHub 会找到第一个匹配的部署密钥,并会发回类似 "ERROR: Permission to user/repo2 denied to user/repo1"
http://help.github.com/ssh-issues/
【讨论】:
如果您只有一个存储库,那么使用部署密钥的答案非常有用。但是,当您希望 CI 服务器跨多个存储库构建项目时,您将立即处于管理多组密钥(每个存储库一对)的位置,并且采用此答案中列出的方法变得更加容易。 这个人的指南解释了如何使用 ~/.ssh/config 通过不同的部署密钥来设置它:gist.github.com/victorborda/2871029 @JorgeOrpinel,我相信链接中的方法可以防止 github webhooks 使用 Github 插件触发构建。当我还希望通过 webhook 触发构建时,我发现一个具有单个密钥的虚拟用户可以更好地访问所有存储库,因为我需要构建配置中的存储库 URL 以匹配 github 克隆 URL,请参阅我的 @ 987654323@【参考方案4】:sergey_mo 的答案的替代方法是在 jenkins 服务器上创建多个 ssh 密钥。
(尽管正如 sergey_mo 回答的第一位评论者所说,这最终可能比管理单个密钥对更痛苦。)
【讨论】:
现在我明白了为什么简单地发布 URL 是一种糟糕的答案策略。上面的链接失效了。【参考方案5】:我在 gitlab 上遇到了类似的问题。原来我已经限制了允许通过 ssh 登录的用户。这不会影响 github 用户,但如果人们最终因为 gitlab(或类似)问题而来到这里,请确保将 git
添加到 /etc/ssh/sshd_config
中的 AllowUsers
设置中:
# Authentication:
LoginGraceTime 120
PermitRootLogin no
StrictModes yes
AllowUsers batman git
【讨论】:
【参考方案6】:Jenkins 在系统上创建一个用户 Jenkins。必须为 Jenkins 用户生成 ssh 密钥。 步骤如下:
sudo su jenkins -s /bin/bash
cd ~
mkdir .ssh // may already exist
cd .ssh
ssh-keygen
现在您可以使用 SSH 密钥创建 Jenkins 凭据 在 Jenkins 仪表板上 添加凭据
选择此选项
私钥:来自 Jenkins master ~/.ssh
【讨论】:
【参考方案7】:另一种选择是使用GitHub personal access tokens:
转到https://github.com/settings/tokens/new 添加repo范围 在 Jenkins 中,添加 GitHub 源 使用存储库 HTTPS URL 添加 git repo 的 HTTPS URL(不是 SSH 一个,例如https://github.com/my-username/my-project.git
)
添加凭据
种类:用户名和密码
用户名:GitHub 用户名
密码:您在 GitHub 上创建的个人访问令牌
ID:类似于github-token-for-my-username
我在 Jenkins 版本上对此进行了测试。 2.222.1 和 Jenkins GitHub 插件 1.29.5 以及私有 GitHub 存储库。
【讨论】:
以上是关于为 Github 私有存储库验证 Jenkins CI的主要内容,如果未能解决你的问题,请参考以下文章
启用 2 因素身份验证时,如何通过 HTTPS 签出私有 github 存储库?
Github Actions 使用 maven 对另一个存储库的私有包注册表进行身份验证