【问题标题】:Permission denied (publickey) when setting up Jenkins设置 Jenkins 时权限被拒绝(公钥)
【发布时间】:2016-12-01 02:22:31
【问题描述】:

我在 Win 2008 服务器计算机上设置 Jenkins,但在配置 Jenkins 以连接到 GitHub 时遇到了一些问题。我收到以下错误:

Command "git.exe fetch -t git@github.com:USER/REPO.git +refs/heads/*:refs/remotes/origin/*" returned status code 128: Permission denied (publickey).
fatal: The remote end hung up unexpectedly

ERROR: Could not fetch from any repository
FATAL: Could not fetch from any repository
hudson.plugins.git.GitException: Could not fetch from any repository
    at hudson.plugins.git.GitSCM$2.invoke(GitSCM.java:950)
    at hudson.plugins.git.GitSCM$2.invoke(GitSCM.java:908)
    at hudson.FilePath.act(FilePath.java:758)
    at hudson.FilePath.act(FilePath.java:740)
    at hudson.plugins.git.GitSCM.checkout(GitSCM.java:908)
    at hudson.model.AbstractProject.checkout(AbstractProject.java:1184)
    at hudson.model.AbstractBuild$AbstractRunner.checkout(AbstractBuild.java:537)
    at hudson.model.AbstractBuild$AbstractRunner.run(AbstractBuild.java:425)
    at hudson.model.Run.run(Run.java:1376)
    at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46)
    at hudson.model.ResourceController.execute(ResourceController.java:88)
    at hudson.model.Executor.run(Executor.java:175)

我检查过的内容

  • Jenkins 服务正在我的用户名下运行。
  • 我更改了我的 SSH 密钥,因此它不再有密码。
  • 我已通过使用 msysgit 执行与 Jenkins 相同的命令来验证我的 SSH 密钥是否有效。
  • 验证我所有的路径都是正确的。

Jenkins 配置设置

  • 詹金斯 1.418
  • GitHub 插件 0.5
  • Git 插件 1.1.9

msysgit 有效,但 CMD 提示无效 当我导航到一个有效的 repo 并从 DOS 提示符执行命令时,它也失败了。

你知道我可能缺少什么吗?

感谢您的帮助。

【问题讨论】:

  • 这是私人仓库吗?如果没有,您可以改用 Git 协议 URL (git://github.com/USER/REPO.git) 进行克隆,完全不需要 SSH 密钥。
  • 你确定你已经定义了一个 HOME 环境变量吗?它在 Windows 上默认没有定义。
  • VonC,谢谢!你搞定了。请发布答案,以便我将其标记为已接受。感谢您的帮助。
  • @VonC 我已指定覆盖 Windows 从属节点上的 HOME 以将其指向 C:\jenkins。我已将正确的 id_rsa 放在 C:\jenkins\.ssh 下,但仍然存在此问题。我的从代理在 SYSTEM 帐户下作为服务运行。如何正确指定 HOME?
  • @Aaron: 抱歉回复晚了:没有@VonC,我从来没有收到任何通知。我已经为您和@VestniK 评论/问题发布了答案。

标签: windows git github jenkins


【解决方案1】:

正如我所评论的,在使用 ssh 协议时,指定 HOME 环境变量是关键。
由于 Windows 没有 HOME,因此您需要将其显式定义到您想要的任何目录。

不过,Vestnikcmets:

我已指定覆盖 Windows 从属节点上的 HOME 以将其指向 C:\jenkins
我在C:\jenkins\.ssh 下输入了正确的id_rsa,但仍然存在这个问题。
我的从代理在 SYSTEM 帐户下作为服务运行。

两个建议:

  • 您需要让您的从站显示“set”,以便检查在与 SYSTEM 帐户一起使用时是否定义了 HOME。
    如果不是,那可能意味着您需要将该变量添加到“系统环境变量”,而不是“用户环境变量”。

  • 不要忘记在%HOME%\.ssh 目录中同时拥有id_rsaid_rsa.pub:您需要公钥和私钥。 (如“git clone with ssh issue”中所述)

如果您有参数化构建,您还可以can define HOME that way 并检查您的从站是否为HOME 选择了正确的值:

【讨论】:

  • 感谢您的详细解答。当我将公钥放入远程 ${HOME}/.ssh/ 时,问题已解决
  • 要正确使用 HOME 变量,您需要确保在 Windows 和 Jenkins 中都指定了它。在命令提示符下在 Windows 中测试:echo %HOME% 如果输出只是 %HOME%,则需要在 Windows 中将 HOME 变量设置为 Control Panel>System>Advanced System Settings>Environment Variables。在上面的例子中,变量的值需要是C:\jenkins。通过重新启动命令提示符并运行echo %HOME% 来测试它是否已设置。输出现在应该是C:\jenkins
  • 非常感谢您的解释!我在从节点 windows 机器的配置中添加了 HOME 变量,它就像一个魅力!
【解决方案2】:

jenkins中有两个与ssh相关的插件可以使用:Publish Over SSHJenkins SSH plugin

第一个插件可以设置全局 ssh 密钥,第二个插件可以设置各种 ssh 密钥。

接下来需要再安装两个插件,将在项目配置GitHub PluginJenkins Git Plugin中使用。

GitHub 插件将用于设置 GitHub 项目。 Jenkins Git 插件将用于设置“存储库的 URL”以及分支等其他内容。

所有插件都可以从 Jenkins 插件管理器中的可用选项卡中获得。

复制自my blog post, on the topic:

Jenkins 配置:
Jenkins SSH 插件提供了为每个主机设置私钥的可用性,第二个插件为全局主机完成这项工作。
如果使用 Jenkins SSH 插件,则在 SSH 远程主机中写入主机、用户、密码和私钥的路径。
如果使用通过 SSH 发布,则在 SSH 设置中写入密码并粘贴私钥或写入其路径。
项目配置为:
GitHub 项目https://github.com/GitUser/iOS-project/
*源代码管理
-> 吉特
-> -> 存储库
-> -> -> 仓库地址:git@github.com:GitUser/iOS-project.git
-- 由你配置一个分支还是采用默认分支 --
*构建触发器
-> 轮询 SCM -- 已设置 --
-> 时间表:* * * * *
*构建
-> 执行的 Shell

-> -> Command:  xcodebuild -target iOS-project -configuration AdHoc -sdk iphoneos5.0 clean
-> -> Command:  agvtool new-version -all $BUILD_NUMBER 
-> -> Command:  xcodebuild -target iOS-project -configuration AdHoc -sdk iphoneos5.0
-> -> Command:  xcrun -sdk iphoneos5.0 PackageApplication -v $WORKSPACE/build/AdHoc-iphoneos/iOS-project.app -o  $WORKSPACE/build/AdHoc-iphoneos/iOS-project-$BUILD_NUMBER.ipa PROVISIONING_PROFILE="<provisioning profile>" 
-> -> Command:  curl http://testflightapp.com/api/builds.json -F file=@$WORKSPACE/build/AdHoc-iphoneos/iCushion-1.0-$BUILD_NUMBER.ipa -F api_token=<api_token> -F team_token=<team_token> -F notes="This is an autodeploy build from Jenkins!" -F notify=True -F distribution_lists="<distributedlist 1>, <distributedlist 2>"

【讨论】:

    【解决方案3】:

    看来 git 插件现在提供了一种将 Jenkins 指向主目录的方法。

    1. 单击凭据添加按钮。

    1. 将 Jenkins 指向您的私钥。

    1. 从列表中选择新添加的凭据。

    【讨论】:

      【解决方案4】:

      在我的环境中(Jenkins 64 位和 Java 32 位,在 Windows Server 2016 64 位中运行),解决方案将密钥放在 C:\Windows\SysWOW64\config\systemprofile\ .ssh 文件夹。根据Git Plugin documentation

      默认情况下,Jenkins Windows 安装程序将 Jenkins 设置为在 Windows 上作为服务运行,它作为“本地系统帐户”运行,而不是您的用户帐户。由于“本地系统帐户”没有设置 SSH 密钥或 known_hosts,“git clone”将在构建期间挂起。通过确保使用正确配置的 .ssh 目录(即 id_rsa、id_rsa.pub 和 known_hosts)设置“本地系统帐户”,可以让 Jenkins 作为“本地系统帐户”运行并通过 SSH 克隆存储库/p>

      【讨论】:

        猜你喜欢
        • 2017-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-11
        • 2019-11-24
        • 2014-11-08
        • 2012-01-18
        • 2012-04-25
        相关资源
        最近更新 更多