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

Dim*_*zky 7 jenkins jenkins-plugins

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

重新启动詹金斯后出现此错误,有人可以建议我如何解决它吗?

事情是 :

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

-我没有更改插件上的任何内容,只是直接重新启动

-我已经很久没有重新启动我的詹金斯了

hudson.util.HudsonFailedToLoad: org.jvnet.hudson.reactor.ReactorException: java.io.IOException: Unable to read /var/lib/jenkins/config.xml
    at hudson.WebAppMain$3.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$3.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.access$1100(Jenkins.java:326)
    at jenkins.model.Jenkins$16.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$7.runTask(Jenkins.java:1086)
    at org.jvnet.hudson.reactor.Reactor$2.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
Run Code Online (Sandbox Code Playgroud)

cod*_*edd 15

我今天遇到了类似的问题,同时将 Jenkins2.176.12.176.2. 不过,升级本身并不是问题;问题在于升级本身。这是插件

概括

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

[...]
Jul 17, 2019 10:13:53 AM jenkins.InitReactorRunner$1 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.
[...]
Run Code Online (Sandbox Code Playgroud)

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

根本原因

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

这些插件不仅仅会导致错误被记录:它们还会引发异常。詹金斯似乎还没有准备好处理它们,并且崩溃了。访问 Jenkins 主页将显示一大堆堆栈跟踪,仅此而已。

问题是,为了正确升级插件,您需要 Jenkins 启动并运行,但有问题的插件首先会阻止Jenkins 达到所需的启动和运行状态。

(我的)解决方案

有几个目标:

  1. 让 Jenkins 能够初始化并保持运行状态;
  2. 访问管理控件以升级有问题的插件;
  3. 重新启动 Jenkins 服务并恢复正常运行。

继续之前的注意事项

进入下一部分之前,需要记住或尝试的一些事项:

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

引导詹金斯

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

<securityRealm class="org.jenkinsci.plugins.saml.SamlSecurityRealm" plugin="saml@1.1.2">
    [...]
</securityRealm>
Run Code Online (Sandbox Code Playgroud)

从文件中删除此部分(还记得备份吗?)会导致 Jenkins 停止尝试加载与 SAML 相关的 Java 类,这使得它在我的情况下能够启动。但是,由于(现已缺失)Okta 集成,重新启动服务后无法登录。

访问管理控制+插件升级


安全警告:这适用于我的情况,因为我位于公司防火墙后面,并且无法从公司外部访问此工具。如果您的 Jenkins 实例可以访问 Internet,请不要这样做并寻找其他方法!在解决问题时,请考虑至少暂时阻止对服务器的 Internet 访问(例如禁用端口转发规则等)。(这假设您与服务器位于同一个 LAN 中,这样您就不会切断自己的访问权限。)


就我而言,身份验证是 Okta 集成(即用于访问)和 Jenkins 中基于角色的身份验证的组合,存储在文件中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>
Run Code Online (Sandbox Code Playgroud)

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

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

打扫干净

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