由于 com.thoughtworks.xstream.mapper.CannotResolveClassException,Jenkins 重启后无法启动

Jenkins fails to start after restart due to com.thoughtworks.xstream.mapper.CannotResolveClassException

詹金斯版本:詹金斯版本。 2.32.1 Google 登录插件版本:1.3

我重启 jenkins 后出现这个错误,谁能建议我如何解决它?

事情是:

-我已经确保在插件目录中启用了 google-登录插件

-我没有对插件做任何改动,直接重启

-好久没重启我的jenkins了

hudson.util.HudsonFailedToLoad: org.jvnet.hudson.reactor.ReactorException: java.io.IOException: Unable to read /var/lib/jenkins/config.xml
    at hudson.WebAppMain.run(WebAppMain.java:248)
Caused by: org.jvnet.hudson.reactor.ReactorException: java.io.IOException: Unable to read /var/lib/jenkins/config.xml
    at org.jvnet.hudson.reactor.Reactor.execute(Reactor.java:269)
    at jenkins.InitReactorRunner.run(InitReactorRunner.java:47)
    at jenkins.model.Jenkins.executeReactor(Jenkins.java:1110)
    at jenkins.model.Jenkins.<init>(Jenkins.java:926)
    at hudson.model.Hudson.<init>(Hudson.java:85)
    at hudson.model.Hudson.<init>(Hudson.java:81)
    at hudson.WebAppMain.run(WebAppMain.java:231)
Caused by: java.io.IOException: Unable to read /var/lib/jenkins/config.xml
    at hudson.XmlFile.unmarshal(XmlFile.java:161)
    at jenkins.model.Jenkins.loadConfig(Jenkins.java:3015)
    at jenkins.model.Jenkins.access00(Jenkins.java:326)
    at jenkins.model.Jenkins.run(Jenkins.java:3033)
    at org.jvnet.hudson.reactor.TaskGraphBuilder$TaskImpl.run(TaskGraphBuilder.java:169)
    at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:282)
    at jenkins.model.Jenkins.runTask(Jenkins.java:1086)
    at org.jvnet.hudson.reactor.Reactor.run(Reactor.java:210)
    at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:117)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1152)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:622)
    at java.lang.Thread.run(Thread.java:748)
Caused by: jenkins.util.xstream.CriticalXStreamException: org.jenkinsci.plugins.googlelogin.GoogleOAuth2SecurityRealm : org.jenkinsci.plugins.googlelogin.GoogleOAuth2SecurityRealm
---- Debugging information ----
message             : org.jenkinsci.plugins.googlelogin.GoogleOAuth2SecurityRealm
cause-exception     : com.thoughtworks.xstream.mapper.CannotResolveClassException
cause-message       : org.jenkinsci.plugins.googlelogin.GoogleOAuth2SecurityRealm
class               : hudson.model.Hudson
required-type       : hudson.model.Hudson
converter-type      : hudson.util.RobustReflectionConverter
path                : /hudson/securityRealm
line number         : 485
version             : not available
-------------------------------
    at hudson.util.RobustReflectionConverter.doUnmarshal(RobustReflectionConverter.java:356)
    at hudson.util.RobustReflectionConverter.unmarshal(RobustReflectionConverter.java:270)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72)
    at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:134)
    at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32)
    at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1189)
    at hudson.util.XStream2.unmarshal(XStream2.java:114)
    at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1173)
    at hudson.XmlFile.unmarshal(XmlFile.java:159)
    ... 11 more
Caused by: com.thoughtworks.xstream.mapper.CannotResolveClassException: org.jenkinsci.plugins.googlelogin.GoogleOAuth2SecurityRealm
    at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:79)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:55)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:79)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:74)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.SecurityMapper.realClass(SecurityMapper.java:71)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at hudson.util.XStream2$CompatibilityMapper.realClass(XStream2.java:282)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at hudson.util.xstream.MapperDelegate.realClass(MapperDelegate.java:43)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:48)
    at hudson.util.RobustReflectionConverter.determineType(RobustReflectionConverter.java:461)
    at hudson.util.RobustReflectionConverter.doUnmarshal(RobustReflectionConverter.java:327)
    ... 22 more

可能值得检查 /var/lib/jenkins/config.xml

的 umask

我今天 运行 遇到了类似的问题,同时将 Jenkins 从 2.176.1 升级到 2.176.2。升级本身不是问题; 它是插件

总结

您的 post 仅包含日志文件的一个子集,但就我而言,我发现一些条目指出插件是问题的原因。 日志中的重要数据是:

[...]
Jul 17, 2019 10:13:53 AM jenkins.InitReactorRunner onTaskFailed
SEVERE: Failed Loading plugin SAML Plugin v1.1.2 (saml)
java.io.IOException: SAML Plugin version 1.1.2 failed to load.
 - bouncycastle-api version 2.16.0 is older than required. To fix, install version 2.16.1 or later.
[...]

以及任何其他格式相似且传达相似信息的条目。

Root-Cause

我的系统有几个插件有待更新。升级服务时(例如 apt upgrade jenkins 等),服务通常会作为流程的一部分重新启动。重新启动使问题暴露出来,表明某些插件无法加载,因为它们现在需要更多 up-to-date 依赖项。

这些插件不仅仅导致错误被记录:它们抛出异常。 Jenkins 似乎没有准备好处理它们,并崩溃了。访问 Jenkins 主页将显示一个大胖子 stack-trace 而没有其他内容。

要注意的是,为了正确升级插件,您需要 Jenkins up-and-running,但有问题的插件 阻止 Jenkins 首先进入所需的 up-and-running 状态。

(我的)解决方案

有几个目标:

  1. 让 Jenkins 达到可以初始化并保持 运行 状态的程度;
  2. 访问管理控件以升级有问题的插件;
  3. 重新启动 Jenkins 服务并return 正常运行。

继续前的注意事项

在进入下一节之前要记住或尝试一些事情:

  1. 默认情况下,Jenkins 安装在/var/lib/jenkins/ 下,其config.xml 文件在此目录下。 创建此 config.xml 文件的备份 然后 继续!
  2. 你应该有一个 good-enough 的理解并且 有理由相信你有一个 similar-enough 问题 来证明尝试这样做是合理的。
  3. 关于无法读取的日志消息config.xml 是假的真正 似乎想说的是,它在尝试加载 指定的 SAML Java class 时失败了那里。
  4. 我的设置使用 SAML 2.0 进行 Okta 集成,这很重要 b/c 它管理登录,可能意味着仅启动服务可能还不够。
  5. 降级没有解决问题。如果升级是原因,那么使用 sudo apt-get install jenkins=2.176.1 降级会在重新启动服务后解决问题,但事实并非如此。
  6. 手动安装插件失败。

启动 Jenkins

就我而言,主要问题是上面显示的 SAML 插件,因为它控制我以管理员身份登录的能力。由于我使用 SAML 2.0 将身份验证与 Okta 集成,因此我的 config.xml 文件具有以下节点:

<securityRealm class="org.jenkinsci.plugins.saml.SamlSecurityRealm" plugin="saml@1.1.2">
    [...]
</securityRealm>

从文件中删除此部分(还记得备份吗?)会导致 Jenkins 停止尝试加载 SAML-related Java class,这在我的案例中允许它启动。但是,由于(现在缺少)Okta 集成,重新启动服务后无法登录

访问管理控制 + 插件升级


安全警告:这有效在我的情况下因为我支持一家公司无法从公司外部访问防火墙和此工具。如果您的 Jenkins 实例可以通过 Internet 访问,不要这样做并找到其他方法! 考虑暂时阻止 Internet 访问您的服务器解决问题时的最小值(例如禁用 port-forwarding 规则等)。 (这假定您与服务器位于同一局域网中,这样您就不会切断自己的访问权限。)


在我的例子中,auth 是 Okta 集成(即用于访问)和 Jenkins 中的 role-based auths 的组合,存储在 config.xml 文件中。如果这听起来像你,你应该有类似的东西:

<authorizationStrategy class="com.michelin.cio.hudson.plugins.rolestrategy.RoleBasedAuthorizationStrategy">
    [...]
    <role name="admin" pattern=".*">
    <permissions>
        <permission>hudson.model.View.Delete</permission>
        <permission>hudson.model.Computer.Connect</permission>
        [...]
    </permissions>
    <assignedSIDs>
        <sid>anonymous</sid>
        [...]
    </assignedSIDs>
    </role>
    [...]
</authorizationStrategy>

如上所示,我临时admin角色下添加了<sid>anonymous</sid>条目。这将允许您(实际上,任何人,因此出现上面的安全警告)以匿名管理员.[=28]的身份临时访问您的 Jenkins 实例=]

之后重新启动 Jenkins 服务(例如 sudo systemctl restart jenkins.service)。您现在可以进入 Manage Jenkins >> Manage Plugins 部分并强制更新。选中复选框以在下载插件后重新启动 Jenkins 以确保它们已安装。

正在清理

此时你应该恢复原来的config.xml(例如sudo mv config.xml.backup config.xml),然后重新启动Jenkins服务。这将撤消前面指定的更改s 部分,你应该回到原来的配置,无论是什么。

我在 jenkins 网页而不是登录页面上遇到了完全相同的错误。我得到它是因为 我想在我的 Jenkins 版本 2.73.3 上一次更新所有插件

就像你一样,系统重启也没有帮助。

所以我查看了日志,它们看起来很相似:

oct. 22, 2019 9:41:14 AM jenkins.InitReactorRunner onTaskFailed
GRAVE: Failed Loading plugin Credentials Plugin v2.3.0 (credentials)
java.io.IOException: Credentials Plugin v2.3.0 failed to load.
 - You must update Jenkins from v2.73.3 to v2.138.4 or later to run this plugin.
 - Structs Plugin v1.20 failed to load. Fix this plugin first.
        at hudson.PluginWrapper.resolvePluginDependencies(PluginWrapper.java:626)

关于一个小细节:对我来说 插件无法更新,因为 Jenkins 版本太旧。这与公认解决方案 中的日志完全相反。

所以我决定先更新jenkins

 sudo apt-get update
 sudo apt-get install jenkins  # Say N to overwrite the config.

我找回了 Jenkins,但不是所有的插件:虽然服务器已经启动,但一些监控作业仍然出错 & 运行。

所以我决定在管理页面重新启动插件更新(为了与 jenkins 的版本同步),我重新启动搜索更新并获取所有兼容的。安装并重启后一切终于恢复正常。

我认为添加这个来完成公认的解决方案很重要,因为您不必对 config.xml 进行危险的修改。

此类阻止访问 Jenkins Web 控制台的错误可能是由于授权插件错误和您在 Jenkins 配置文件中的错误导致的,这是由手动编辑或插件更新中断引起的。

作为一个快速而肮脏的解决方案,当更脆弱的解决方案失败时(包括备份太旧或不兼容)并且只有当您确保潜在的黑客无法访问您未受保护的 Jenkins master 时,

删除詹金斯config.xml

将 re-create 使用默认值并为您(以及所有其他人!)提供对 Jenkins Web 界面的快速匿名访问。请不要将其视为黑客建议。

因此,在恢复对 Jenkins 控制台的访问后要做的第一件事就是在以下位置设置适当的访问控制:

https://<JENKINS_URL>/configureSecurity/

您可能需要恢复的其他设置是 node/cloud 阻止管道构建在从节点或主节点上启动的标签,可以在以下位置完成:

https://<JENKINS_URL>/computer/