【问题标题】:Jenkins hangs when trying to fetch from StashJenkins 在尝试从 Stash 获取时挂起
【发布时间】:2018-02-02 10:26:42
【问题描述】:

我正在尝试配置 Jenkins 以使用 Atlassian Stash。我已经(显然)让 Git 插件成功 ping Stash,因为 Git 插件页面不再有任何错误消息。我正在使用带有 SSH 的 Git,并且我已经使用正确的 SSH 密钥配置了我的 Stash 帐户。我还应该提到我的办公室位于防火墙后面,因此是 Stash 的代理服务器。下面是 Jenkins Git 配置的截图:

默认 10 分钟超时后,控制台输出指示失败。以下是控制台输出的内容:

 > C:\Program Files (x86)\Git\bin\git.exe fetch --tags --progress ssh://git@stash.someproxy.com:7999/project/myrepo.git 
+refs/heads/*:refs/remotes/origin/*
ERROR: Timeout after 10 minutes
ERROR: Error cloning remote repo 'origin'
hudson.plugins.git.GitException: Command "C:\Program Files (x86)\Git\bin\git.exe fetch --tags --progress ssh://git@stash.someproxy.com:7999/project/myrepo.git +refs/heads/*:refs/remotes/origin/*" returned status code -1:
stdout: 
stderr: 
    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn
    ...

当我直接从 Windows bash 运行以下 Git 命令时,它很快完成,尽管没有输出:

$ time git fetch --tags --progress 
ssh://git@stash.someproxy.com:7999/pcb_imst/
wigbotsimulator.git +refs/heads/*:refs/remotes/origin/*

real    0m5.530s
user    0m0.093s
sys     0m0.062s

此外,当我从 Jenkins 中删除凭据并尝试构建时,我几乎立即收到身份验证错误 (Permission denied (publickey))。因此,Jenkins 似乎可以命中 Stash,尽管它似乎无法完成一次提取。

我不知道如何解决这个问题。奇怪的是,Git 在本地工作,但在 Jenkins 使用时却不起作用。

【问题讨论】:

  • ssh -T git@stash.someproxy.com -p 7999 是否对您进行身份验证(意味着您会收到一些说明您的帐户的欢迎消息?)
  • @VonC 它只是挂在我能看到的地方。
  • 您可以尝试使用该服务器的 IP,而无需任何代理参考吗?
  • @VonC 我无法使用ssh -T git@xxx。当我尝试做ssh -T git@stash.someproxy.com -p 7999 时,我得到了回复no address associated with name。但是你能解释一下为什么我可以从同一个控制台通过 SSH 与 Stash 通信吗?我刚刚验证了 git fetch 使用 SSH 证书工作。
  • 它是否也适用于 git clone (在命令行中)。顺便说一句,你需要凭证吗?如果您的公钥已注册,并且您的私钥没有任何密码,则您不需要额外的凭据。

标签: git jenkins ssh bitbucket-server


【解决方案1】:

在与@VonC 进行了广泛的交谈并且没有出现明显的错误之后,我尝试让 Jenkins 通过 HTTPS 进行连接。最初我放弃了 HTTPS,因为它也不起作用。令我惊讶的是,HTTPS 构建工作没有错误。

我正准备放弃 SSH,作为最后的手段,我决定使用以下私钥选项:

换句话说,我将我的私钥 (~/id_rsa) 直接剪切并粘贴到 Jenkins 中。令我惊讶的是,这行得通!我正在使用虚拟机,我的用户文件夹位于 F: 驱动器上,显然 Jenkins 无法读取。

所以我的问题的根本原因实际上是 SSH 私钥文件的问题。但确切的错误是 Jenkins 无法读取此私钥。一个教训是确保 Jenkins 能够读取它需要运行的每个文件。仅仅因为您的 Git 设置在本地工作并不意味着它也适用于 Jenkins。 p>

【讨论】:

    【解决方案2】:

    如上所述,使用Jenkins SSH credential plugins 是正确的解决方案。
    直接复制私有 SSH 密钥比依靠 Jenkins master 知道在哪里可以找到 ~/.ssh/id_rsa(在 Windows 上,%USERPROFILE%\.ssh\id_rda)更容易,特别是考虑到 Jenkins 经常与系统帐户一起使用,而不是本地帐户。

    Stash 有公钥。如果Jenkins有私钥,就可以完成认证。

    HTTPS 也可以工作,考虑到凭据管理器是隐藏的,它已经缓存了用户名/密码。

    【讨论】:

    • 我奖励你是因为我可以争辩说我们的思路引导我偶然发现了正确的答案。您使用 HTTPS 作为 SSH 的替代方案的建议是有效的,并且对我也有效。
    • @TimBiegeleisen 谢谢。我当时错过了你自己的答案。 +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 2022-10-02
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    相关资源
    最近更新 更多