Jenkins上的间歇性构建失败

3

我有一个在Linux上运行的Jenkins项目,它会在指定的时间间隔内轮询代码管理工具并根据新的更改进行构建。但是,有时候会出现以下控制台输出导致的构建失败:

Started by user MyUser User
Building on master in workspace <http://ci.mybuild.com:8080/job/temp-project/ws/>
Checkout:workspace / <http://ci.mybuild.com:8080/job/temp-project/ws/> - hudson.remoting.LocalChannel@5f2c402a
Using strategy: Default
Cloning the remote Git repository
Cloning repository origin
FATAL: hudson/FilePath$11
java.lang.NoClassDefFoundError: hudson/FilePath$11
    at hudson.FilePath.deleteRecursive(FilePath.java:980)
    at hudson.plugins.git.GitAPI.clone(GitAPI.java:211)
    at hudson.plugins.git.GitSCM$2.invoke(GitSCM.java:1121)
    at hudson.plugins.git.GitSCM$2.invoke(GitSCM.java:1063)
    at hudson.FilePath.act(FilePath.java:851)
    at hudson.FilePath.act(FilePath.java:824)
    at hudson.plugins.git.GitSCM.checkout(GitSCM.java:1063)
    at hudson.model.AbstractProject.checkout(AbstractProject.java:1308)
    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:1516)
    at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46)
    at hudson.model.ResourceController.execute(ResourceController.java:88)
    at hudson.model.Executor.run(Executor.java:236)

我尝试创建一个具有相似配置的新任务,但第一次构建失败并出现了以下错误。
请问是否有人可以为我提供一些指针?
3个回答

1

在日志中查看 - deleteRecursive 失败:

...
java.lang.NoClassDefFoundError: hudson/FilePath$11
    at hudson.FilePath.deleteRecursive(FilePath.java:980)
    at hudson.plugins.git.GitAPI.clone(GitAPI.java:211)
...

这可能意味着您的文件系统防止删除该区域中的文件 - 请检查那里的文件权限(以及文件夹权限)。


感谢您的指针,Gonen。我也怀疑权限问题,但正如我所提到的,这是间歇性的。有一段时间构建成功运行,但有时会出现此错误。 - Noman Amir
Jenkins 真的应该是唯一使用本地工作区的实体。您是否有任何开发人员或其他应用程序正在使用相同的本地工作区,并尝试在其中执行 SVN 操作? - Slav
事实上,没有任何开发人员可以访问该系统。我已经设置了每小时运行一次的定期备份,但我怀疑这可能是故障的原因。 - Noman Amir
可能有些东西在动态锁定您的文件系统 - 可能是备份系统或其他类似进程。 - Gonen
为什么当你说你只是想轮询时,它会执行git clone操作? - Todd Murray

1
这几乎可以确定是因为Jenkins正在尝试清理/删除一个正在被另一个进程并发访问的文件。
在看到此错误后,请尝试立即运行以下命令:
lsof /my/repo/dir

这将告诉您哪些文件被锁定在您的仓库目录中,以及是什么锁定了它们。


-1
问题

异常的本质是类加载。根据实际异常:

java.lang.NoClassDefFoundError: hudson/FilePath$11

意味着JVM无法找到类定义(显然)。在“FilePath”后面的美元符号和数字($11)表示它无法找到在FilePath类中定义的匿名内部类,可以在以下位置看到:

https://github.com/jenkinsci/jenkins/blob/master/core/src/main/java/hudson/FilePath.java

这支持了这个理论,因为存在“FileCallable”的匿名实现。

解决方案

现在是困难的部分,该怎么办。

我怀疑您正在某种形式的Web容器中运行Jenkins(在问题的当前形式中未知)。 Web容器以其类加载怪癖而闻名。 如果可以,请尝试独立运行Jenkins或在另一个容器中运行。

此外,您是否在容器启动时进行任何类路径调整? 它是否在同一台机器上使用构建器从属? 我建议首先调查这些问题。


非常感谢您提供如此详细的答案。是的,您说得对,Jenkins运行在Apache Tomcat内部。根据其他回答,我认为它可能会与我每小时计划的定期备份冲突。我将禁用它并查看是否仍然会出现此错误。 - Noman Amir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接