IntelliJ IDEA 擁有當今最先進的靜態 Java 代碼分析器,就其能力而言,它已經遠遠落後於諸如此類的“老手”
但是,只要分析結果只顯示在開發者本地的IDE中,對開發過程的用處不大。 靜態分析
步驟 1. 在容器中運行分析並獲得報告
起初,在沒有圖形界面的 CI 系統中運行 IDE(桌面應用程序!)的想法可能看起來很可疑並且很麻煩。 好在IDEA開發者已經提供了運行的能力
使用腳本啟動檢查 bin/inspect.sh
從 IDEA 安裝目錄。 所需的參數是:
- 項目的完整路徑(不支持相關路徑),
- 帶有檢查設置的 .xml 文件的路徑(通常位於 .idea/inspectionProfiles/Project_Default.xml 中的項目內),
- 將存儲帶有分析結果報告的 .xml 文件的文件夾的完整路徑。
此外,預計
- Java SDK的路徑需要在IDE中配置,否則無法解析。 這些設置包含在配置文件中。
jdk.table.xml
在 IDEA 全局配置文件夾中。 默認的全局 IDEA 配置本身在用戶的主目錄中,但是這個位置可以顯式設置 在文件中idea.properties
. - 分析的項目必須是一個有效的 IDEA 項目,為此一些通常被忽略的文件將不得不提交到版本控制,即:
.idea/inspectionProfiles/Project_Default.xml
— 分析器設置,它們顯然會在容器中啟動檢查時使用,.idea/modules.xml
- 否則我們會得到錯誤“這個項目不包含任何模塊”,.idea/misc.xml
- 否則我們會收到錯誤“JDK 未為此項目正確配置”,*.iml-файлы
- 否則我們將收到關於模塊中未配置的 JDK 的錯誤。
雖然這些文件通常包含在 .gitignore
,它們不包含任何特定於特定開發人員環境的信息 - 例如,不像文件 workspace.xml
,其中僅包含此類信息,因此沒有必要提交。
就其本身而言,出路建議將 JDK 與 IDEA Community Edition 一起打包到一個容器中,以準備好在分析的項目上“設置”。 讓我們選擇一個合適的基礎容器,這是我們得到的 Dockerfile:
Dockerfile
FROM openkbs/ubuntu-bionic-jdk-mvn-py3
ARG INTELLIJ_VERSION="ideaIC-2019.1.1"
ARG INTELLIJ_IDE_TAR=${INTELLIJ_VERSION}.tar.gz
ENV IDEA_PROJECT_DIR="/var/project"
WORKDIR /opt
COPY jdk.table.xml /etc/idea/config/options/
RUN wget https://download-cf.jetbrains.com/idea/${INTELLIJ_IDE_TAR} &&
tar xzf ${INTELLIJ_IDE_TAR} &&
tar tzf ${INTELLIJ_IDE_TAR} | head -1 | sed -e 's//.*//' | xargs -I{} ln -s {} idea &&
rm ${INTELLIJ_IDE_TAR} &&
echo idea.config.path=/etc/idea/config >> idea/bin/idea.properties &&
chmod -R 777 /etc/idea
CMD idea/bin/inspect.sh ${IDEA_PROJECT_DIR} ${IDEA_PROJECT_DIR}/.idea/inspectionProfiles/Project_Default.xml ${IDEA_PROJECT_DIR}/target/idea_inspections -v2
使用選項 idea.config.path
我們讓 IDEA 在文件夾中查找它的全局配置 /etc/idea
,因為在 CI 的工作條件下,用戶的主文件夾是不確定的,而且通常完全不存在。
這是複製到容器的文件的樣子 jdk.table.xml
,其中包含容器內安裝的 OpenJDK 的路徑(它可以基於您自己的 IDEA 設置目錄中的類似文件):
jdk表.xml
<application>
<component name="ProjectJdkTable">
<jdk version="2">
<name value="1.8" />
<type value="JavaSDK" />
<version value="1.8" />
<homePath value="/usr/java" />
<roots>
<annotationsPath>
<root type="composite">
<root url="jar://$APPLICATION_HOME_DIR$/lib/jdkAnnotations.jar!/" type="simple" />
</root>
</annotationsPath>
<classPath>
<root type="composite">
<root url="jar:///usr/java/jre/lib/charsets.jar!/" type="simple" />
<root url="jar:///usr/java/jre/lib/deploy.jar!/" type="simple" />
<root url="jar:///usr/java/jre/lib/ext/access-bridge-64.jar!/" type="simple" />
<root url="jar:///usr/java/jre/lib/ext/cldrdata.jar!/" type="simple" />
<root url="jar:///usr/java/jre/lib/ext/dnsns.jar!/" type="simple" />
<root url="jar:///usr/java/jre/lib/ext/jaccess.jar!/" type="simple" />
<root url="jar:///usr/java/jre/lib/ext/jfxrt.jar!/" type="simple" />
<root url="jar:///usr/java/jre/lib/ext/localedata.jar!/" type="simple" />
<root url="jar:///usr/java/jre/lib/ext/nashorn.jar!/" type="simple" />
<root url="jar:///usr/java/jre/lib/ext/sunec.jar!/" type="simple" />
<root url="jar:///usr/java/jre/lib/ext/sunjce_provider.jar!/" type="simple" />
<root url="jar:///usr/java/jre/lib/ext/sunmscapi.jar!/" type="simple" />
<root url="jar:///usr/java/jre/lib/ext/sunpkcs11.jar!/" type="simple" />
<root url="jar:///usr/java/jre/lib/ext/zipfs.jar!/" type="simple" />
<root url="jar:///usr/java/jre/lib/javaws.jar!/" type="simple" />
<root url="jar:///usr/java/jre/lib/jce.jar!/" type="simple" />
<root url="jar:///usr/java/jre/lib/jfr.jar!/" type="simple" />
<root url="jar:///usr/java/jre/lib/jfxswt.jar!/" type="simple" />
<root url="jar:///usr/java/jre/lib/jsse.jar!/" type="simple" />
<root url="jar:///usr/java/jre/lib/management-agent.jar!/" type="simple" />
<root url="jar:///usr/java/jre/lib/plugin.jar!/" type="simple" />
<root url="jar:///usr/java/jre/lib/resources.jar!/" type="simple" />
<root url="jar:///usr/java/jre/lib/rt.jar!/" type="simple" />
</root>
</classPath>
</roots>
<additional />
</jdk>
</component>
</application>
成品圖
在繼續之前,讓我們測試在容器中運行 IDEA 解析器:
docker run --rm -v <путь/к/вашему/проекту>:/var/project inponomarev/intellij-idea-analyzer
分析應該成功進行,並且帶有分析器報告的大量 .xml 文件應該出現在 target/idea_inspections 子文件夾中。
現在IDEA分析器可以在任何CI環境下離線運行已經沒有任何疑問了,我們進入第二步。
步驟 2. 顯示和分析報告
獲得 .xml 文件形式的報告是成功的一半,現在需要使其易於閱讀。 而且它的結果應該用於質量門——根據質量標準確定接受的變更是否通過的邏輯。
這將幫助我們
該插件由兩部分組成:
- 許多分析器消息收集器(
完整清單 包括科學界已知的所有分析儀,從 AcuCobol 到 ZPT Lint), - 所有這些的單個報告查看器。
Warnings NG 可以解析的事物列表包括 Java 編譯器警告和來自 Maven 執行日誌的警告:儘管它們經常出現,但很少有目的地對其進行分析。 IntelliJ IDEA 報告也包含在可識別格式列表中。
由於該插件是新的,它最初與 Jenkins Pipeline 交互良好。 他參與的構建步驟將如下所示(我們只是告訴插件我們識別哪種報告格式以及應該掃描哪些文件):
stage ('Static analysis'){
sh 'rm -rf target/idea_inspections'
docker.image('inponomarev/intellij-idea-analyzer').inside {
sh '/opt/idea/bin/inspect.sh $WORKSPACE $WORKSPACE/.idea/inspectionProfiles/Project_Default.xml $WORKSPACE/target/idea_inspections -v2'
}
recordIssues(
tools: [ideaInspection(pattern: 'target/idea_inspections/*.xml')]
)
}
報表界面是這樣的:
這個接口對於所有可識別的解析器都是通用的,這很方便。 它包含按類別分佈的交互式圖表和發現數量變化的動態圖。 在頁面底部的網格中,您可以執行快速搜索。 IDEA 檢查唯一不能正常工作的是在 Jenkins 中直接瀏覽代碼的能力(儘管對於其他報告,例如 Checkstyle,這個插件可以做得很漂亮)。 它似乎是 IDEA 報告解析器中的一個錯誤,需要修復。
Warnings NG 的功能之一是能夠在一份報告和程序質量門中匯總來自不同來源的發現,包括參考組件的“棘輪”。 一些 Quality Gates 編程文檔可用
結論
在開始準備這份材料之前,我決定先看看:有沒有人已經在哈布雷上寫過這個話題? 我才發現
據我所知,沒有與 Jenkins 或 maven 插件的集成 [...]
好吧,兩年後我們有了 Warnings NG 插件,終於實現了這種友誼!
來源: www.habr.com