我已经设置了一个Jenkins CI解决方案(在Windows上),该解决方案包含3个并行作业(使用Multijob插件),可以将git存储库(使用Git-plugin)签出到各自的工作区中。 95%的情况下,作业运行良好,但有时我会在一个或多个作业中收到以下错误消息:
Building on master in workspace C:\Program Files (x86)\Jenkins\jobs\PatchsetCPPCheck\workspace
Checkout:workspace / C:\Program Files (x86)\Jenkins\jobs\PatchsetCPPCheck\workspace - hudson.remoting.LocalChannel@1a046fe
Using strategy: Gerrit Trigger
Last Built Revision: Revision 2ff5e3449041916e21fe7a4833a2babcfef45225 (master)
Fetching changes from 1 remote Git repository
Fetching upstream changes from origin
Commencing build of Revision 1eec024d8a125a42b563011468bb19a87e1da2ea (master)
Checking out Revision 1eec024d8a125a42b563011468bb19a87e1da2ea (master)
Cleaning workspace
Resetting working tree
FATAL: Invalid id: Process leaked file descriptors. See http://wiki.jenkins-ci.org/display/JENKINS/Spawning+processes+from+build for more information
java.lang.IllegalArgumentException: Invalid id: Process leaked file descriptors. See http://wiki.jenkins-ci.org/display/JENKINS/Spawning+processes+from+build for more information
at org.eclipse.jgit.lib.ObjectId.fromString(ObjectId.java:232)
at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.doRevList(CliGitAPIImpl.java:1278)
at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.revList(CliGitAPIImpl.java:1264)
at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.isCommitInRepo(CliGitAPIImpl.java:1289)
at hudson.plugins.git.GitAPI.isCommitInRepo(GitAPI.java:189)
at hudson.plugins.git.GitSCM.computeChangeLog(GitSCM.java:1286)
at hudson.plugins.git.GitSCM.access$1300(GitSCM.java:57)
at hudson.plugins.git.GitSCM$4.invoke(GitSCM.java:1251)
at hudson.plugins.git.GitSCM$4.invoke(GitSCM.java:1205)
at hudson.FilePath.act(FilePath.java:905)
at hudson.FilePath.act(FilePath.java:878)
at hudson.plugins.git.GitSCM.checkout(GitSCM.java:1205)
at hudson.model.AbstractProject.checkout(AbstractProject.java:1369)
at hudson.model.AbstractBuild$AbstractBuildExecution.defaultCheckout(AbstractBuild.java:676)
at jenkins.scm.SCMCheckoutStrategy.checkout(SCMCheckoutStrategy.java:88)
at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:581)
at hudson.model.Run.execute(Run.java:1593)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46)
at hudson.model.ResourceController.execute(ResourceController.java:88)
at hudson.model.Executor.run(Executor.java:242)
有人可以帮我吗?
答案 0 :(得分:1)
如果您要检查link given in your error message,您会找到三个解决此问题的详细示例解决方法,
编辑:
描述了此问题的原因,
Jenkins和子进程通过三个管道连接 (stdin / stdout / stderr。)这允许Jenkins捕获输出 孩子的过程。由于子进程可能会写入大量数据 管道并在此之后立即退出,詹金斯需要确保 它在考虑构建结束之前排干了管道。 Jenkins通过等待EOF来做到这一点。
当继承那些文件描述符时会发生并发症 其他过程。让我们说子进程分叉另一个进程 的背景。后台进程(AKA守护进程)继承了所有 父文件的描述符,包括写的一面 用于连接子进程和Jenkins的stdout / stderr管道。如果 守护进程忘记关闭它们,詹金斯甚至没有获得管道的EOF 当子进程退出时,因为守护进程仍然有那些进程 描述符打开。这就是这个问题发生的原因。
一个好的守护程序关闭所有文件描述符以避免像这样的问题(因此jenkins可以读取EOF)
为防止守护程序具有打开的文件描述符,一个进程(这是您的解决方法,可以是在后台运行的shell / windows脚本)将在后台运行以确保守护进程存在时,它会关闭所有文件描述符。