在Jenkins上运行IntelliJ IDEA检查

如今,IntelliJ IDEA拥有最先进的静态Java代码分析器,其功能远远落后于CheckstyleSpotbugs等“老手”。 它的许多“检查”都从各个方面检查代码,从编码样式到特征性错误。


但是,尽管分析结果仅显示在开发人员IDE的本地界面中,但在开发过程中几乎没有用。 静态分析作为组装流水线的第一步,其结果应确定质量门,如果质量门未通过,则组装将失败。 TeamCity CI已知与IDEA集成在一起。 但是,即使您没有使用TeamCity,也可以尝试在任何其他CI服务器上运行IDEA检查。 我建议看看如何使用IDEA社区版,Jenkins和Warnings NG插件来完成此操作。


步骤1.在容器中运行分析并获得报告


最初,在没有图形界面的CI系统中启动IDE(桌面应用程序!)的想法似乎很可疑且非常麻烦。 幸运的是,IDEA开发人员提供了从命令行运行代码格式设置检查的功能。 此外,要以这种模式运行IDEA,不需要图形子系统,并且可以在带有文本外壳的服务器上执行这些任务。


使用IDEA安装目录中的bin/inspect.sh启动检查。 由于参数是必需的:


  • 项目的完整路径(不支持相对路径)
  • 具有检查设置的.xml文件的路径(通常位于.idea / inspectionProfiles / Project_Default.xml中的项目内部),
  • 包含分析结果报告的.xml文件将添加到该文件夹​​的完整路径。

另外,预计


  • IDE将配置Java SDK的路径,否则分析将无法进行。 这些设置包含在IDEA全局配置文件夹中的jdk.table.xml配置文件中。 缺省情况下,全局IDEA配置本身位于用户的主目录中,但可以idea.properties文件中明确指定此位置。
  • 被分析的项目应该是有效的IDEA项目,对此版本控制必须提交一些通常被忽略的文件,即:
    • .idea/inspectionProfiles/Project_Default.xml分析器设置,在容器中开始检查时显然会使用它们,
    • .idea/misc.xml否则,我们会收到错误消息“该项目未正确配置JDK”,
    • *.iml- -否则我们会收到有关模块中未配置的JDK的错误。

尽管这些文件通常包含在.gitignore ,但它们不包含特定于特定开发人员环境的任何信息-例如,与workspace.xml文件不同,该文件包含在其中,因此无需提交。


它本身就是一种将JDK与IDEA Community Edition打包在一起的方式,该方式可以“设置”已分析的项目。 我们将选择适当的基本容器,这是我们得到的Dockerfile:


Docker文件
 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.config.path我们迫使IDEA在/etc/idea文件夹中查找其全局配置,因为在CI条件下用户的主文件夹是未定义的,并且经常完全不存在。


这就是复制到容器的jdk.table.xml文件的样子,其中写入了安装在容器内的OpenJDK的路径(可以从您自己的目录中使用IDEA设置获取类似文件):


jdk.table.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文件形式获取报告是成功的一半,现在您需要使其易于阅读。 并且其结果也应在质量门中使用-根据质量标准确定接受的更改是否通过的逻辑。


这将帮助我们于2019年1月发布的Jenkins Warnings NG插件 。 凭借其外观,许多用于处理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')] ) } 

报告界面如下所示:



方便地,该接口对于所有公认的分析仪都是通用的。 它包含一个按类别显示的发现分布的交互式图表,以及一个发现数目变化的动态图表。 在页面底部的网格中,可以执行快速搜索。 IDEA不能在检查中正常运行的唯一一件事是直接在Jenkins中浏览代码的能力(尽管对于其他报告,例如Checkstyle,此插件可以做到这一点)。 这似乎是要修复的IDEA报告解析器错误。


Warnings NG的功能之一是能够将来自不同来源的发现汇总到一个报告中,并为Quality Gates编程,包括用于参考程序集的棘轮。 此处提供一些Quality Gates编程文档-但是,它不完整,您必须查看源代码。 另一方面,为了完全控制正在发生的事情,可以独立实施“棘轮”(请参阅​​我之前关于该主题的帖子 )。


结论


在开始准备本材料之前,我决定进行搜索:是否有人已经在哈布雷(Habré)上写过这个话题? 我只在2017年接受 兰尼的 采访时发现他说:


据我所知,没有与Jenkins或maven插件集成,原则上,任何发烧友都可以结识IDEA社区版和Jenkins的朋友,许多人将从中受益。

好:两年后,我们有了Warnings NG插件,终于实现了这种友谊!

Source: https://habr.com/ru/post/zh-CN450214/


All Articles