在 Jenkins 上運行 IntelliJ IDEA 檢查

IntelliJ IDEA 擁有當今最先進的靜態 Java 代碼分析器,就其能力而言,它已經遠遠落後於諸如此類的“老手” 格子風格 и 斑點蟲. 它的眾多“檢查”從各個方面檢查代碼,從編碼風格到特徵錯誤。

但是,只要分析結果只顯示在開發者本地的IDE中,對開發過程的用處不大。 靜態分析 必須進行 作為構建管道的第一步,其結果必須確定質量門,如果質量門失敗,則構建必須失敗。 眾所周知,TeamCity CI 與 IDEA 集成在一起。 但即使您不使用 TeamCity,您仍然可以嘗試在任何其他 CI 服務器上運行 IDEA 檢查。 我建議看看如何使用 IDEA Community Edition、Jenkins 和 Warnings NG 插件來完成。

步驟 1. 在容器中運行分析並獲得報告

起初,在沒有圖形界面的 CI 系統中運行 IDE(桌面應用程序!)的想法可能看起來很可疑並且很麻煩。 好在IDEA開發者已經提供了運行的能力 代碼格式化 и 檢查 從命令行。 此外,要在這種模式下運行 IDEA,不需要圖形子系統,這些任務可以在具有文本 shell 的服務器上執行。

使用腳本啟動檢查 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>

成品圖 在 Docker Hub 上可用.

在繼續之前,讓我們測試在容器中運行 IDEA 解析器:

docker run --rm -v <путь/к/вашему/проекту>:/var/project inponomarev/intellij-idea-analyzer

分析應該成功進行,並且帶有分析器報告的大量 .xml 文件應該出現在 target/idea_inspections 子文件夾中。

現在IDEA分析器可以在任何CI環境下離線運行已經沒有任何疑問了,我們進入第二步。

步驟 2. 顯示和分析報告

獲得 .xml 文件形式的報告是成功的一半,現在需要使其易於閱讀。 而且它的結果應該用於質量門——根據質量標準確定接受的變更是否通過的邏輯。

這將幫助我們 Jenkins 警告 NG 插件於 2019 年 XNUMX 月發布。 隨著它的推出,許多用於在 Jenkins 中處理靜態分析結果的獨立插件(CheckStyle、FindBugs、PMD 等)現在被標記為已過時。

該插件由兩部分組成:

  • 許多分析器消息收集器(完整清單 包括科學界已知的所有分析儀,從 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')]
    )
}

報表界面是這樣的:

在 Jenkins 上運行 IntelliJ IDEA 檢查

這個接口對於所有可識別的解析器都是通用的,這很方便。 它包含按類別分佈的交互式圖表和發現數量變化的動態圖。 在頁面底部的網格中,您可以執行快速搜索。 IDEA 檢查唯一不能正常工作的是在 Jenkins 中直接瀏覽代碼的能力(儘管對於其他報告,例如 Checkstyle,這個插件可以做得很漂亮)。 它似乎是 IDEA 報告解析器中的一個錯誤,需要修復。

Warnings NG 的功能之一是能夠在一份報告和程序質量門中匯總來自不同來源的發現,包括參考組件的“棘輪”。 一些 Quality Gates 編程文檔可用 這裡 - 但是,它並不完整,您必須查看源代碼。 另一方面,為了完全控制正在發生的事情,“棘輪”可以獨立實施(見我的 上一篇 關於這個主題)。

結論

在開始準備這份材料之前,我決定先看看:有沒有人已經在哈布雷上寫過這個話題? 我才發現 採訪2017 с 蘭尼它說:

據我所知,沒有與 Jenkins 或 maven 插件的集成 [...]

好吧,兩年後我們有了 Warnings NG 插件,終於實現了這種友誼!

來源: www.habr.com

添加評論