在 Jenkins 上运行 IntelliJ IDEA 检查

IntelliJ IDEA 如今拥有最先进的静态 Java 代码分析器,其功能远远落后于诸如 格纹 и 斑点虫。 它的大量“检查”从各个方面检查代码,从编码风格到典型错误。

然而,只要分析结果只显示在开发者IDE的本地界面中,对于开发过程来说就没有多大用处。 静态分析 必须履行 作为构建管道的第一步,其结果应定义质量门,如果未通过质量门,则构建应失败。 据了解,TeamCity CI 与 IDEA 集成。 但即使您不使用 TeamCity,您也可以轻松尝试在任何其他 CI 服务器中运行 IDEA 检查。 我建议您了解如何使用 IDEA 社区版、Jenkins 和警告 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 编程文档 这里 - 但是,它并不完整,你必须查看源代码。 另一方面,为了完全控制正在发生的事情,可以独立实施“棘轮”(参见我的 上一篇文章 关于这个主题)。

结论

在开始准备这份材料之前,我决定搜索一下:是否有人已经在 Habré 上写过有关此主题的文章? 我只发现 2017年面试 с 蓝菱他说:

据我所知,没有与 Jenkins 或 Maven 插件集成 […] 原则上,任何爱好者都可以与 IDEA Community Edition 和 Jenkins 交朋友,许多人只会从中受益。

嗯,两年后我们有了Warnings NG Plugin,这段友谊终于开花结果了!

来源: habr.com

添加评论