为 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 对另一个存储库的私有包注册表进行身份验证

Jenkins 支持 Github APP 身份验证了

尝试将 jenkins 与 github 连接的私有 ssh 密钥问题

Jenkins无法签出Git存储库 - 主机密钥验证失败

为多个 Git (GitHub) 存储库重用一个 Jenkins 作业