3

我在 Jenkins 中有一个项目(在 linux 上运行),它以定义的时间间隔轮询 SCM 并基于新的更改进行构建。我使用以下控制台输出间歇性地出现构建失败:

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)

我尝试创建一个具有类似配置的新作业,但第一次构建失败并出现此错误。

有人可以帮我指点一下吗?

4

3 回答 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)
...

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

于 2012-11-19T07:08:31.550 回答
1

这几乎肯定会发生,因为 Jenkins 正在尝试清理/删除另一个进程同时访问的文件。

看到此错误后立即尝试运行以下命令:

lsof /my/repo/dir

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

于 2012-11-26T16:21:02.593 回答
-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,或在另一个容器中运行。

另外,您是否在容器启动时摆弄类路径?它是否在同一台机器上使用构建器奴隶?我建议先调查这些问题。

于 2012-11-27T19:49:26.570 回答