Jenkins 在 10 分钟内从 Github 获取时超时。

Posted

技术标签:

【中文标题】Jenkins 在 10 分钟内从 Github 获取时超时。【英文标题】:Jenkins time-out while fetching from Github in 10 mins. 【发布时间】:2013-11-26 02:38:36 【问题描述】:

我在为 Nightly 构建配置 Jenkins 时遇到了这个问题。请注意,存储库项目“project1”很大,大约 900MB。请让我知道我应该如何解决这个问题。

Started by user anonymous
Building in workspace C:\Users\user1\.jenkins\jobs\Nightly Build\workspace
Fetching changes from the remote Git repository
Fetching upstream changes from git@github.com:MyOrg/projectgroup/project1
ERROR: Timeout after 10 minutes
FATAL: Failed to fetch from git@github.com:MyOrg/projectgroup/project1
hudson.plugins.git.GitException: Failed to fetch from git@github.com:MyOrg/projectgroup/project1
    at hudson.plugins.git.GitSCM.fetchFrom(GitSCM.java:612)
    at hudson.plugins.git.GitSCM.retrieveChanges(GitSCM.java:836)
    at hudson.plugins.git.GitSCM.checkout(GitSCM.java:861)
    at hudson.model.AbstractProject.checkout(AbstractProject.java:1412)
    at hudson.model.AbstractBuild$AbstractBuildExecution.defaultCheckout(AbstractBuild.java:652)
    at jenkins.scm.SCMCheckoutStrategy.checkout(SCMCheckoutStrategy.java:88)
    at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:557)
    at hudson.model.Run.execute(Run.java:1679)
    at hudson.maven.MavenModuleSetBuild.run(MavenModuleSetBuild.java:509)
    at hudson.model.ResourceController.execute(ResourceController.java:88)
    at hudson.model.Executor.run(Executor.java:230)
Caused by: hudson.plugins.git.GitException: Command "fetch -t git@github.com:MyOrg/projectgroup/project1 +refs/heads/*:refs/remotes/origin/*" returned status code -1:
stdout: 
stderr: 
    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:981)
    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandWithCredentials(CliGitAPIImpl.java:920)
    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.fetch(CliGitAPIImpl.java:187)
    at hudson.plugins.git.GitAPI.fetch(GitAPI.java:229)
    at hudson.plugins.git.GitSCM.fetchFrom(GitSCM.java:610)
    ... 10 more

【问题讨论】:

【参考方案1】:

我正要使用解决方法 #2,但似乎从 git 插件 2.0.3 开始,现在可以在 UI 中进行配置,尽管它有点隐藏并且是每个项目的。

转到项目的配置屏幕、源代码管理部分、Git、附加行为、添加、高级克隆行为、克隆和获取操作的超时(以分钟为单位)。

如果您需要全局设置,我会使用 DevHopeful_2012 建议的解决方法 #2。

【讨论】:

是的,很好。看来 JENKINS-20387 已解决。我的意思是回来更新我的答案。但是,你已经得到了它。 :) 我敢肯定,如果他们真的下定决心,他们会让这更难找到。 此解决方案仅适用于 git 插件。不是,github插件。但是如果你需要更长的超时时间,很容易退回到 git 插件。【参考方案2】:

看起来这是一个已知问题。请参阅JENKINS-20445、JENKINS-20387 和其他几个问题,这些问题似乎正在出现。

根据这些错误报告,这只发生在较新版本的 Git 插件中,因此您可以降级或尝试一些解决方法:


解决方法 #1 - 创建一个本地裸引用克隆以减少时间,如 here 所述。

如果您从 Jenkins 到 git 存储库的吞吐量只有 30 kb/秒,您可能应该考虑克隆 存储库到 Jenkins 服务器上的中心位置,然后执行 使用“高级克隆行为”进行克隆以使用参考 存储库。这将大大减少数据量 从 git 服务器转移到 Jenkins。

在我的 Debian Jenkins 机器上,我这样做:

$ sudo mkdir -p /var/cache/git/mwaite
$ sudo chown mwaite.mwaite /var/cache/git/mwaite
$ cd /var/cache/git/mwaite
$ git clone --bare https://github.com/jenkinsci/jenkins.git

在 Jenkins 机器上可以使用该裸克隆后,添加 工作的高级行为,它应该表现得更好。


解决方法 #2 - 使用 Git.timeOut 属性增加超时以允许长时间的初始克隆过程完成:

java -Dorg.jenkinsci.plugins.gitclient.Git.timeOut=60 -jar jenkins.war

This SO question 是如何为 Jenkins 服务设置属性的一个很好的例子。另请注意,此值以分钟为单位,而不是秒。此解决方法由 David 提供。


后一种解决方法对我有用。虽然,我必须承认我更喜欢使用参考存储库,但我不相信它适用于像我这样的多配置工作。而且,请注意,为每个从属节点设置一个属性,然后在内部记录我们必须在所有节点上设置这个属性,使用大型 Git 存储库,这是非常痛苦的。

【讨论】:

为什么 #1 不能用于多配置作业?使用参考存储库纯粹是一种内部 git 优化,因此如果克隆在没有参考存储库的情况下工作,它也应该使用。 如果你有多个slave节点,每个节点上都需要有一个引用仓库,并且每个节点上都需要在同一个地方,所以可以配置一个job不管什么都可以找到它在哪个节点上运行。 @Neil 我还没有使用 Git 插件配置的参考选项。那么,如果我在每个从站上都有一个裸克隆,在不同的路径中,我将如何在作业中指定这些?我可以看到如何在高级行为中向我托管的 git 存储库添加参考存储库。 看来我可以继续添加路径,如果它们在从站上不存在,它们将被忽略。如果节点能够以某种方式将托管存储库映射到本地参考存储库,那就太好了。但是,我想它会起作用的,对吧? 您实际上可以在参考字段中使用 $VARIABLES。所以我所做的是我在我的节点上定义了 GIT_MIRROR,然后在参考字段设置 $GIT_MIRROR/blah.git 并且它工作得很好。【参考方案3】:

仅限 WINDOWS

您的 ssh 连接可能配置不正确。如果未建立与您的 git 存储库的 ssh 连接,Jenkins 构建可能会显示为 hung 并最终超时。

默认情况下,Jenkins 安装程序将 Jenkins 设置为作为服务运行, 它作为“本地系统帐户”运行,而不是您的用户帐户。自从 “本地系统帐户”没有设置 SSH 密钥或 known_hosts up,“git clone”会失败。

您只需将 C:\Program Files (x86)\Git\.ssh 复制到 C:\Windows\SysWOW64\config\systemprofile\.ssh(“本地系统 帐户”主页)

还有,

重要提示:确保您的 ssh 密钥没有密码!詹金斯 克隆存储库时会出现挂起,但实际上是 ssh 后台拦截等你输入密码。

详细步骤在http://computercamp-cdwilson-us.tumblr.com/post/48589650930/jenkins-git-clone-via-ssh-on-windows-7-x64

【讨论】:

您提供的链接非常有用! @FacePalm 1.我安装了 git 2.8.4,在安装文件夹中没有找到 .ssh。 2. Jenkins 2.1 在我的 PC 上的本地系统帐户下运行,带有 GitHub 插件并且工作正常。 3. 仅在我们公司的 Jenkins 服务器上遇到此问题,仍在调查中。【参考方案4】:

我刚刚找到了 jenkins timout #10 min 错误的解决方案。出现此错误是因为 Internet 连接不足,或者可能是您在 github 中的项目大小很大,因此 jenkins 无法从 git 服务器加载该项目。为了解决该问题,我们必须在 jenkins 项目中编辑 Git 中的“其他行为”配置并将“克隆和获取操作的超时(以分钟为单位)”增加到“60”或“120”分钟。因此,现在每当 jenkins 从 git 服务器克隆 git 项目时,就有足够的时间从 git 服务器加载/克隆项目。

【讨论】:

【参考方案5】:

在 Ubuntu 14.04 中

使用 vi 或 gedit 转到 /etc/default/jenkins 编辑

像下面这样更新java orgs

更新前会这样 JAVA_ARGS="-Djava.awt.headless=true"

更新如下 JAVA_ARGS="-Djava.awt.headless=true -Dorg.jenkinsci.plugins.gitclient.Git.timeOut=30"

然后像这样重启jenkins

sudo /etc/init.d/jenkins start

【讨论】:

【参考方案6】:

解决方法 #2 对我有用,我不得不更改 jenkins.xml 文件。

在 Windows 上:

    转到C:\Program Files (x86)\Jenkins 打开jenkins.xml文件 在<arguments>标签内添加-Dorg.jenkinsci.plugins.gitclient.Git.timeOut=60

这就是我的配置的样子

之前:

<arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=8080 --webroot="%BASE%\war"</arguments>

之后:

<arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -Dorg.jenkinsci.plugins.gitclient.Git.timeOut=60 -jar "%BASE%\jenkins.war" --httpPort=8080 --webroot="%BASE%\war"</arguments>

【讨论】:

【参考方案7】:

在带有 Jenkins-2.138 的 CentOS/RedHat 7.4 Linux 上

编辑/etc/sysconfig/jenkins,将JENKINS_ARGS(最后一行)修改为其他人在回答中提到的超时设置:

# Pass arbitrary arguments to Jenkins.
# Full option list: java -jar jenkins.war --help
#
JENKINS_ARGS="-Dorg.jenkinsci.plugins.gitclient.Git.timeOut=25"

【讨论】:

JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dorg.jenkinsci.plugins.gitclient.Git.timeOut=60" 是正确的地方

以上是关于Jenkins 在 10 分钟内从 Github 获取时超时。的主要内容,如果未能解决你的问题,请参考以下文章

markdown 如何在15分钟内从Travis CI设置自动上传到Anaconda

60分钟内从零起步驾驭Hive实战

60分钟内从零起步驾驭Hive实战学习笔记

手把手教你用 Jenkins 构建 iOS 项目

10分钟搞定让你困惑的 Jenkins 环境变量

Jenkins定时构建时间设置