害你加班的bug就是我写的,记一次升级Jenkins插件引发的加班
主旨
本文主要記錄了下Jenkins升級插件過程中出現(xiàn)的場景,一次加班經(jīng)歷,事發(fā)時沒有截圖,有興趣可以看看。
起因
需求
最近有個需求:在Jenkins流水線中完成下載Git上的文件簡單修改并提交的功能
起初找到了相關(guān)的插件用法,即使用 SSH Agent Plugin 來完成這個功能
插件不生效
經(jīng)測試無法完成效果,分別懷疑了以下幾點(diǎn):
- 憑據(jù)配置有誤
- 寫錯了腳本
- 當(dāng)前未安裝此插件
- 當(dāng)前插件版本過低
- 當(dāng)前插件由于某種原因未生效
排查不生效原因
經(jīng)排查,發(fā)現(xiàn)的確沒有生效,原因是之前運(yùn)維同事做遷移時做的一系列騷操作搞的:
- 用最新的Jenkins war包部署 + 老版本Jenkins家目錄
- 由于新版本需要使用新版本的插件才能生效,升級了所有插件
- 升級完重啟,啟動不起來了……
- 回退老版本war包,繼續(xù)使用當(dāng)前升級過插件的Jenkins家目錄
- 在插件管理處,按提示降級了部分插件
預(yù)感
等我看到 Manage Jenkins 那一片紅的時候,就有預(yù)感這次要不簡單,當(dāng)時也沒多想,去檢查了下 SSH Agent Plugin 的版本
升級插件
發(fā)現(xiàn)提示W(wǎng)arn 需要升級此插件到某版本及以后,插件方能生效,沒多想,升級就是了
沒想此舉為我昨晚的加班,打開了潘多拉魔盒…… 升級完重啟,啟動不起來了!
Jenkins掛機(jī)
啟動報錯如下:(昨晚沒心情截圖,直接搜的錯誤)
com.thoughtworks.xstream.mapper.CannotResolveClassException: com.michelin.cio.hudson.plugins.rolestrategy.RoleBasedAuthorizationStrategyat com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:79)atcom.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:379)at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)at org.jenkinsci.jruby.JRubyMapper.realClass(JRubyMapper.java:34)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)Caused: jenkins.util.xstream.CriticalXStreamException: com.michelin.cio.hudson.plugins.rolestrategy.RoleBasedAuthorizationStrategy : com.michelin.cio.hudson.plugins.rolestrategy.RoleBasedAuthorizationStrategy---- Debugging information ----message : com.michelin.cio.hudson.plugins.rolestrategy.RoleBasedAuthorizationStrategycause-exception : com.thoughtworks.xstream.mapper.CannotResolveClassExceptioncause-message : com.michelin.cio.hudson.plugins.rolestrategy.RoleBasedAuthorizationStrategyclass : hudson.model.Hudsonrequired-type : hudson.model.Hudsonconverter-type : hudson.util.RobustReflectionConverterpath : /hudson/authorizationStrategyline number : 11version : 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:161)at hudson.util.XStream2.unmarshal(XStream2.java:132)at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1173)at hudson.XmlFile.unmarshal(XmlFile.java:178)Caused: java.io.IOException: Unable to read /var/lib/jenkins/config.xmlat hudson.XmlFile.unmarshal(XmlFile.java:181)at hudson.XmlFile.unmarshal(XmlFile.java:161)at jenkins.model.Jenkins.loadConfig(Jenkins.java:3005)at jenkins.model.Jenkins.access$1300(Jenkins.java:304)at jenkins.model.Jenkins$13.run(Jenkins.java:3104)at org.jvnet.hudson.reactor.TaskGraphBuilder$TaskImpl.run(TaskGraphBuilder.java:169)at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:296)at jenkins.model.Jenkins$5.runTask(Jenkins.java:1066)at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:214)at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:117)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748)Caused: org.jvnet.hudson.reactor.ReactorExceptionat org.jvnet.hudson.reactor.Reactor.execute(Reactor.java:282)at jenkins.InitReactorRunner.run(InitReactorRunner.java:48)at jenkins.model.Jenkins.executeReactor(Jenkins.java:1100)at jenkins.model.Jenkins.<init>(Jenkins.java:904)at hudson.model.Hudson.<init>(Hudson.java:85)at hudson.model.Hudson.<init>(Hudson.java:81)at hudson.WebAppMain$3.run(WebAppMain.java:233)Caused: hudson.util.HudsonFailedToLoadat hudson.WebAppMain$3.run(WebAppMain.java:250)經(jīng)過
按錯誤信息排解問題
發(fā)現(xiàn)問題不可怕,一頓 Google Bing 發(fā)現(xiàn)了 StackOverFlow 的相關(guān)問題解決辦法
說是因?yàn)樯壛?Role-based Authorization Strategy 插件會導(dǎo)致這個問題,What?? 我沒升級它啊,這怎么回事!先看看外國老哥的解法:
簡述解法:
按這一套操作后,的確服務(wù)能起來了
工程蒸發(fā),引發(fā)的思考
接下來發(fā)現(xiàn)了另一個問題 ———— 所有工程都沒了!!
先顧不上工程蒸發(fā)了的問題,手動創(chuàng)建了個測試流水線工程來測下 SSH Agent Plugin 是否生效,發(fā)現(xiàn)依舊無效
工程沒了問題其實(shí)不大,因?yàn)橛脩暨€在、權(quán)限還在、構(gòu)建工程的流水線腳本在 GitLab 上,大不了再配置一下就行了
我想了下,就算配置好工程后,使 SSH Agent Plugin 插件生效 還沒完成啊,插件版本還是亂成了一鍋粥,這不是定時炸彈么
簡單了解了下,Jenkins 的插件升級后,降級的版本是有一個默認(rèn)值的,但這個值不一定是當(dāng)前 Jenkins 版本默認(rèn)或可用的值,最好的辦法是向上升級
思及此節(jié),決定去升級下 Jenkins 及插件,另辟了一處實(shí)驗(yàn)場開搞
備份Jenkins家目錄
Jenkins 家目錄里最大的部分是 workspace 這個目錄,就是每個構(gòu)建工程運(yùn)行時的家目錄的父級,這個目錄里的數(shù)據(jù)無需備份
將 Jenkins 家目錄備走后,手動創(chuàng)建 workspace 目錄,以防新工程無法構(gòu)建
下載新war包,部署Tomcat
在中科大的靜像站下載了2.222.3的war包 https://mirrors.ustc.edu.cn/jenkins/war-stable/2.222.3/
部署到Tomcat的ROOT目錄下
修改Tomcat conf/server.xml,修改 Tomcat 編碼為UTF-8
修改 conf/context.xml,修改靜態(tài)資源緩存最大值,需添加一行 <Resources cachingAllowed="true" cacheMaxSize="100000" />
啟動Tomcat
訪問測試Jenkins服務(wù),查看插件錯誤警告
訪問服務(wù)后,發(fā)現(xiàn)服務(wù)還可以登錄,進(jìn)來看到工程都還在!點(diǎn)開 Manage Jenkins 處,發(fā)現(xiàn)仍是大面積報紅,檢查發(fā)現(xiàn)是 Pipeline 依賴的組件不正確,按錯誤提示去 pluginManager updates處找到被依賴的插件,按提示升級,升級完重啟(大部分插件需要重啟以激活)
重啟后,Pipeline相關(guān)的錯誤不在了,再去看其他的,直到所有的都解決了,插件也都正常了
除了之前插件上的報紅,還有幾處安全提示,我們的Jenkins不連外網(wǎng),就一并關(guān)掉了
最后 Manage Jenkins 就變成了這樣
備份,恢復(fù)服務(wù)
備份原服務(wù)家目錄,將新版本部署到原 Tomcat,還原新版本家目錄,重啟服務(wù)
在恢復(fù)過程中,有提示某些數(shù)據(jù) Unreadable,這些可以通過點(diǎn)擊提示,管理這些舊數(shù)據(jù),我這邊因?yàn)橹饕臇|西都在,就選了清除不可讀數(shù)據(jù)了
后續(xù)工程修復(fù),測試插件
所有失而復(fù)得的工程,其實(shí)只記錄了內(nèi)部的一些參數(shù),但 SCM 如Git,這些流水線腳本信息都沒記錄,可能是因?yàn)?Git 插件升級所致
苦逼的一個一個加回來,好在工程不多,也就10來個,等所有工程修復(fù)好后,我測試了下之前失效的插件,插件可用了 :happy:
結(jié)尾
寫這段文字主要記錄一下這件挺坑的事,警示自己或大家,不要在沒備份的情況下,去做一些不可逆的操作,比如升級 Jenkins,備份的作用同樣適用于其他場景
總結(jié)
以上是生活随笔為你收集整理的害你加班的bug就是我写的,记一次升级Jenkins插件引发的加班的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 抽取剔除视频帧工具
- 下一篇: VeryCD转型的应对措施,让我们继续分