为 Github 私有存储库验证 Jenkins CI

我希望 Jenkins 能够自动从我托管在 Github 上的私人存储库中获取数据。 但我不知道如何完成这项任务。.尝试了文档,为 Jenkins 用户生成 ssh-key,我看到的全部内容是: “无法克隆回购”。我已经检查了网址-他们是有效的。

任何线索,也许你知道一些文档/博客/无论是描述这种东西?

116215 次浏览

也许 GitHub 对 部署密钥的支持正是你想要的:

何时应该使用部署键?

很简单,当您有一个服务器,需要拉访问一个私人回购。此密钥直接附加到存储库,而不是附加到个人用户帐户。

如果你已经在尝试了,但是没有成功,你可能需要更新你的问题,包括正在使用的 URL 的更多细节,关键文件的名称和位置,等等。


接下来是技术部分: 如何对 Jenkins 使用 SSH 密钥?

如果您有一个 jenkins unix 用户,那么您可以将部署密钥存储在 ~/.ssh/id_rsa中。当 Jenkins 试图通过 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

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

git clone github-deploy-myproject:myuser/myproject

这也是你把 存储库 URL写到 Jenkins 身上的。

(注意,必须将 没有放在 Ssh://前面,这样才能正常工作。)

有一件事让这个为我工作是确保 github.com是在 ~jenkins/.ssh/known_hosts

如果你需要 Jenkins 访问超过1个项目,你需要:
1. 向一个 github 用户帐户添加公钥
2. 在每个项目中添加此用户作为所有者(访问所有项目)或作为协作者。

对于一个系统用户来说,许多公共密钥将无法工作,因为 GitHub 将找到第一个匹配的部署密钥,并将返回类似于 ”错误: 拒绝用户/repo1对 user/repo2的权限的错误

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

对于 sergey _ mo 提供的答案,另一种方法是在 Jenkins 服务器上创建多个 ssh 密钥。

(不过,正如第一个评论 Sergey _ mo 回答的人所说,这可能比管理一对钥匙更痛苦。)

我在 gitlab 上也遇到过类似的问题。原来我限制了允许通过 ssh 登录的用户。这不会影响 github 用户,但是如果人们最终在这里遇到 gitlab (和类似的)问题,请确保在 /etc/ssh/sshd_config中将 git添加到 AllowUsers设置中:

# Authentication:
LoginGraceTime 120
PermitRootLogin no
StrictModes yes
AllowUsers batman git

Jenkins 在系统上创建一个用户 Jenkins。 以下是步骤:

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

现在可以使用 SSH 密钥创建 Jenkins 凭据 在詹金斯的仪表盘上 添加证书

选择此选项

私钥: 来自 Jenkins master ~/. ssh

另一种选择是使用 GitHub 个人访问令牌:

  • 转到 https://github.com/settings/tokens/new
  • 添加 回购作用域
  • 在 Jenkins 中,添加一个 GitHub
  • 使用存储库 HTTPS URL
  • 添加 git 回购的 HTTPS URL (不是 SSH URL,例如 https://github.com/my-username/my-project.git)
  • 加上证件
    • Kind: 带密码的用户名
    • 用户名: GitHub 用户名
    • 密码: 您在 GitHub 上创建的个人访问令牌
    • 类似 github-token-for-my-username的东西

我在 Jenkins ver.2.222.1和 Jenkins GitHub 插件1.29.5上测试了这个,这个插件有一个私有的 GitHub 回购。