
作者:Rethink 鏈接:https://www.jianshu.com/p/5475a9216427
Performance插件兼容性問題
自由風格項目中,有使用Performance插件收集構建產物,但是截至到目前最新版本(Jenkins v2.298,Performance:v3.19),此插件和Jenkins都存在有兼容性問題,會導致項目配置頁面table, div錯位,而導致無法保存配置,這個問題已經存在了好長時間了(至少半年),插件作者一直沒有修復,目前在項目中要想使用這個插件,有以下三種解決辦法:
將自由風格項目切換為流水線風格;
服務器上手動修改項目的config.xml文件以達到保存配置的效果;
Jenkins版本降級,經過測試,此插件在v2.263.4 LTS上可以正常使用,降級前做好備份工作,以及考慮其他插件的兼容性問題。
修改Jenkins 安全策略(CSP)
場景:藉助Robot Framework Plugin,可將Robot Framework項目更好的集成到Jenkins中,但是直接在Jenkins 項目中點擊預覽測試報告,會出現Opening Robot Framework log failed的錯誤,這是由於Jenkins為了避免受到惡意HTML/JS文件的攻擊,會默認將安全策略CSP設置為:
sandbox;default-src'none';img-src'self';style-src'self';
在此配置下,只允許加載Jenkins服務器上託管的CSS文件和圖片文件。解決辦法需要藉助Startup Trigger和Groovy plugin兩個插件,具體步驟如下:
Jenkins中新建一個Job,該Job專用Jenkins啟動時執行的配置命令;
在「構建觸發器」模塊,選擇「Build when job nodes start」選項,Restricted node Label保持空白,Quiet period設置為0;
在「構建」模塊,選擇「Execute system Groovy 」,執行如下Groovy命令:
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP","")
重啟Jenkins服務器進行測試,會發現等待所有節點連接成功後此項目會立即自動觸發構建。再去觸發Robot項目構建,等待完成後點擊訪問測試報告頁面,會發現已經可以正常訪問了;
自定義Jenkins相對訪問路徑
場景:nginx為Jenkins做目錄代理,同時站點下還代理了很多其他的應用,這裡需要自定義Jenkins相對訪問路徑。本機訪問Jenkins的路徑為:http://localhost:29908,需要改為:http://localhost:29908/jenkins, 方法如下:
在Jenkins安裝根目錄下找到 jenkins.xml文件;
找到service節點下的arguements子節點,並在最後面添加--prefix參數:--prefix="/jenkins",其中 /jenkins 是自定義的訪問路徑;
重啟Jenkins服務,此時本機已經可以通過http://localhost:29908/jenkins進行訪問;
測試目錄代理訪問;
注意:如果在目錄代理之前,子節點和主節點之間就已經通過JNLP的方式連接好了,則需要找到子節點根目錄下的jenkins-slave.xml文件,將service.arguements節點-jnlpUrl參數值修改為正確的值。
git clone失敗 : Killed by signal 15
場景:jenkins項目clone代碼時,出現任務被kill掉的情況,導致出現以下錯誤信息:

通過查看控制台的輸出日誌,可以看出原因是因為超時了。如果在限制時間內代碼都沒有clone完成,那麼就任務就會被強制殺死:

解決方法:當所需要clone的版本庫過大或服務器網速較差時,clone的時間會超過默認的10分鐘。因此需要修改clone的超時時間。設置方法如下:

Jenkins:Build step 'Execute Windows batch command' marked build as failure
場景:使用Jenkins定時跑接口測試用例,明明所有的用例都執行成功了,但是還是會觸發執行失敗時的郵件通知,查看Jenkins控制台日誌,發現是由於上面截圖的原因導致的。
解決方法:在bat腳本(shell同樣適用)最後一行加上exit 0,表示正常運行程序並退出程序。
Jenkins運行在Tomcat容器中,替換jar包的方法
背景:jenkins.war中引用的commons-fileupload-1.3.1-jenkins-2.jar被掃出來有安全隱患,需要替換到最新的1.4版本,因為掃描的時候是根據版本來的,如果直接採用覆蓋並重命名的方法,還是會被掃出來,目前採取的方法是創建軟連接。
先下載最新的commons-fileupload-1.4.jar
創建軟鏈接(管理員權限),Linux系統下同理。
mklinkwebapps\jenkins\WEB-INF\lib\commons-fileupload-1.3.1-jenkins-2.jarwebapps\jenkins\WEB-INF\lib\commons-fileupload-1.4.jar
把舊的commons-fileupload-1.3.1-jenkins-2.jar刪除
重啟tomcat
Windows節點機無法運行jnlp文件
在節點機雙擊jnlp文件沒有反應時,可以嘗試用命令行方式運行此文件,cmd進入jnlp文件目錄下,運行javaws slave-agent.jnlp,可以查看具體的錯誤提示,如下:

上圖中這種情況,只需要修改下java安全配置即可解決,其他情況再具體分析。
關閉CSRF防護
Jenkins v2.204.6之前的版本,要想關閉CSRF防護,只需要在全局安全配置中禁用相關配置即可,但是較高版本的 Jenkins 默認均開啟CSRF防護且刪除了禁用的入口。要想禁用CSRF防護,只能通過配置參數的方式。Jenkins若是跑在Tomcat下,只需在tomcat啟動腳本中加入配置如下:
-Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true
若是以jar包形式部署的,只需在啟動時加上配置參數即可。
修改 JVM 的內存配置
無論是以 Jdk Jar 方式運行Jenkins,還是將 War 包放在 Tomcat等容器下運行,都會存在一個問題:默認 JVM 內存分配太少,這導致啟動或者運行一段時間後內存溢出報錯 java.lang.OutOfMemoryError: PermGen spac。所以,需要在啟動前修改配置文件中的JVM 內存配置。
setJAVA_OPTS=-server-Xms5000M-Xmx5000M-Xss512k-XX:+AggressiveOpts-XX:+UseBiasedLocking-XX:PermSize=256M-XX:MaxPermSize=512M-XX:+DisableExplicitGC-XX:MaxTenuringThreshold=31-XX:+UseConcMarkSweepGC-XX:+UseParNewGC-XX:+CMSParallelRemarkEnabled-XX:+UseCMSCompactAtFullCollection-XX:LargePageSizeInBytes=128m-XX:+UseFastAccessorMethods-XX:+UseCMSInitiatingOccupancyOnly-Djava.awt.headless=true
這裡的幾個 JVM 參數含義如下:-Xms: 使用的最小堆內存大小-Xmx: 使用的最大堆內存大小-XX:PermSize: 內存的永久保存區域大小-XX:MaxPermSize: 最大內存的永久保存區域大小這幾個參數也不是配置越大越好,具體要根據所在機器實際內存和使用大小配置。
配置優化減少磁盤空間占用
Job 構建歷史較多時,如果沒有配置好清理策略的話,會導致占用大量磁盤空間,最終可能會因磁盤空間不夠而導致構建失敗。並且在加載項目配置時,Jenkins也需要花費時間分析歷史構建記錄,頁面加載的耗時會相應的增加。
丟棄舊的構建配置
如上圖,配置最大保持 2 天之內的構建,如果超過 2 天的構建,則會在Job 執行前被清理掉,同時配置了最大保持構建數量為 30 個,意思就是如果 2 天內構建次數如果超過 30 次,則最多保留最近執行的 30 個構建。
使用Disk Uasge插件
不建議,使用此插件的過程中,發現可能會導致服務器卡頓。
定時清理tomcat日誌
默認情況下,tomcat每天都會生成新的日誌文件,且某些情況下,產生的日誌文件體積會非常大,如果長期不清理,日誌文件會越來越多,占用很多磁盤空間。
目前的處理方法是在Jenkins新建了一個定時任務,專門用來刪除tomcat產生的日誌文件。

設置構建超時時間
有些 Job 在執行構建時,由於某些原因導致構建掛起,耗時比較長,而這些長時間掛起的 Job 會導致 Jenkins 內存占用比較大,性能下降,嚴重的會直接導致 Jenkins 掛掉。所以,我們需要設置構建超時時間來預防這種事情發生,一旦超過一定的時間,要讓 Job 自動停止掉,如下:

設置全局屬性
適當設置全局屬性,可以避免在pipeline中重複寫死一些固定值,例如輸出日誌地址、接口請求地址等等,而且當固定值需要修改時,只需要修改一次即可,不用去每個文件裡面修改,方便維護。設置入口為:系統管理 -> 系統配置-> 全局屬性-> Environment variables ,如下圖:

統一管理腳本
需要安裝Managed script插件,該插件是為了在管理文件時創建 Script 腳本文件,然後在 Job 中配置直接使用,方便腳本的統一管理和維護。插件安裝完成後,進入「系統管理」 —> 「Managed files」 ,點擊 「Add a new Config」 ,並選擇 「Groovy file」 類型,創建一個新的 Groovy 腳本文件,然後輸入我們要執行的腳本代碼,如下:

創建完畢後,我們在 Job 中構建處選擇 「Execute managed script」 就可以使用這些腳本了。
輕量備份
使用ThinBackup插件,允許我們對Jenkins配置信息進行全量或增量備份,由於插件不會保存構建歷史和構建工件,所備份過程更為快捷,並且無需關閉Jenkins服務器。

還原備份:

END
關注後端面試那些事,回復【2022面經】
獲取最新大廠Java面經

