Jenkins 在尝试从 Stash 获取数据时挂起
Jenkins hangs when trying to fetch from Stash
我正在尝试配置 Jenkins 以使用 Atlassian Stash。我已经(显然)让 Git 插件成功 ping Stash,因为 Git 插件页面不再有任何错误消息。我正在使用 Git 和 SSH,并且我已经使用正确的 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 可以 hit Stash,尽管它似乎无法完成提取。
我不知道如何解决这个问题。奇怪的是 Git 在本地有效,但在 Jenkins 使用它时却不起作用。
在与@VonC 广泛交谈并且没有出现明显错误后,我尝试让 Jenkins 通过 HTTPS 连接。最初我放弃了 HTTPS,因为它也不起作用。令我惊讶的是,HTTPS 构建没有错误。
我正准备放弃 SSH,作为最后的手段,我决定使用以下私钥选项:
换句话说,我将私钥 (~/id_rsa
) 直接剪切并粘贴到 Jenkins 中。令我惊讶的是,这有效!我在虚拟机上工作,我的用户文件夹在 F:
驱动器上,显然 Jenkins 无法读取。
所以我的问题的根本原因实际上是 SSH 私钥文件的问题。但确切的错误是 Jenkins 无法读取此私钥。吸取的教训是 确保 Jenkins 能够读取它需要运行的每个文件。 仅仅因为您的 Git 设置在本地工作并不意味着它也会为 Jenkins 工作。
如前所述,使用 Jenkins SSH credential plugins 是正确的解决方案。
直接复制 SSH 私钥比依赖 Jenkins master 知道在哪里可以找到 ~/.ssh/id_rsa
(在 Windows、%USERPROFILE%\.ssh\id_rda
上)更容易,特别是考虑到 Jenkins 经常与系统帐户一起使用,而不是本地的。
Stash 有 public 键。如果Jenkins有私钥,就可以完成认证。
HTTPS 也可以,考虑到凭据管理器是隐藏的,它已经缓存了 username/password。
我正在尝试配置 Jenkins 以使用 Atlassian Stash。我已经(显然)让 Git 插件成功 ping Stash,因为 Git 插件页面不再有任何错误消息。我正在使用 Git 和 SSH,并且我已经使用正确的 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 可以 hit Stash,尽管它似乎无法完成提取。
我不知道如何解决这个问题。奇怪的是 Git 在本地有效,但在 Jenkins 使用它时却不起作用。
在与@VonC 广泛交谈并且没有出现明显错误后,我尝试让 Jenkins 通过 HTTPS 连接。最初我放弃了 HTTPS,因为它也不起作用。令我惊讶的是,HTTPS 构建没有错误。
我正准备放弃 SSH,作为最后的手段,我决定使用以下私钥选项:
换句话说,我将私钥 (~/id_rsa
) 直接剪切并粘贴到 Jenkins 中。令我惊讶的是,这有效!我在虚拟机上工作,我的用户文件夹在 F:
驱动器上,显然 Jenkins 无法读取。
所以我的问题的根本原因实际上是 SSH 私钥文件的问题。但确切的错误是 Jenkins 无法读取此私钥。吸取的教训是 确保 Jenkins 能够读取它需要运行的每个文件。 仅仅因为您的 Git 设置在本地工作并不意味着它也会为 Jenkins 工作。
如前所述,使用 Jenkins SSH credential plugins 是正确的解决方案。
直接复制 SSH 私钥比依赖 Jenkins master 知道在哪里可以找到 ~/.ssh/id_rsa
(在 Windows、%USERPROFILE%\.ssh\id_rda
上)更容易,特别是考虑到 Jenkins 经常与系统帐户一起使用,而不是本地的。
Stash 有 public 键。如果Jenkins有私钥,就可以完成认证。
HTTPS 也可以,考虑到凭据管理器是隐藏的,它已经缓存了 username/password。