All Projects → bentolor → Idea Cli Inspector

bentolor / Idea Cli Inspector

Licence: apache-2.0
A little command-line tool to integrate the awesome IntelliJ IDEA code inspections in your continuous integration (CI) process using Jenkins, Bamboo, et. al.

Programming Languages

groovy
2714 projects

Projects that are alternatives of or similar to Idea Cli Inspector

ci-minikube
run minikube on ci
Stars: ✭ 28 (-76.67%)
Mutual labels:  travis-ci, ci
Ci Matters
Integration (comparison) of different continuous integration services on Android project
Stars: ✭ 119 (-0.83%)
Mutual labels:  ci, travis-ci
developer-ci-benefits
Talk docs—includes CI (Continuous Integration) benefits, description, and setup tips 💡💪
Stars: ✭ 29 (-75.83%)
Mutual labels:  travis-ci, ci
Nevergreen
🐤 A build monitor with attitude
Stars: ✭ 170 (+41.67%)
Mutual labels:  ci, travis-ci
Here Be Dragons
An Intellij/Android Studio plugin to help visualise side effects in your code.
Stars: ✭ 325 (+170.83%)
Mutual labels:  intellij, androidstudio
Pupernetes
Spin up a full fledged Kubernetes environment designed for local development & CI
Stars: ✭ 199 (+65.83%)
Mutual labels:  ci, travis-ci
docker-coala-base
coala base docker image
Stars: ✭ 20 (-83.33%)
Mutual labels:  travis-ci, ci
Monorepo
Showcase of how to manage building projects inside monorepo with Gradle as build tool and CircleCI, Bitbucket Pipelines, Travis CI or GitHub Actions as CI tool.
Stars: ✭ 129 (+7.5%)
Mutual labels:  ci, travis-ci
Travis Buddy
🚀 Seamless integration between TravisCI and GitHub
Stars: ✭ 262 (+118.33%)
Mutual labels:  ci, travis-ci
CI-Utils
Utilities for running Common Lisp on CI platforms
Stars: ✭ 18 (-85%)
Mutual labels:  travis-ci, ci
Ci Detector
Detect continuous integration environment and get information of current build
Stars: ✭ 138 (+15%)
Mutual labels:  ci, travis-ci
Cibuildwheel
🎡 Build Python wheels for all the platforms on CI with minimal configuration.
Stars: ✭ 620 (+416.67%)
Mutual labels:  ci, travis-ci
Alpine Chroot Install
Install Alpine Linux in chroot with a breeze. Build ARM on Travis CI or any other x86_64 CI.
Stars: ✭ 133 (+10.83%)
Mutual labels:  ci, travis-ci
SideMirror
An Android Studio plugin to mirror your android devices with scrcpy directly from Android Studio.
Stars: ✭ 49 (-59.17%)
Mutual labels:  intellij, androidstudio
Trytravis
Send local git changes to Travis CI without commits or pushes.
Stars: ✭ 131 (+9.17%)
Mutual labels:  ci, travis-ci
ci playground
Playground for Cloud CI development for C++
Stars: ✭ 23 (-80.83%)
Mutual labels:  travis-ci, ci
build-status
Emacs minor mode that monitors and shows a buffer's build status in the mode line.
Stars: ✭ 26 (-78.33%)
Mutual labels:  travis-ci, ci
Intellij Plugin Save Actions
Supports configurable, Eclipse like, save actions, including "organize imports", "reformat code" and "rearrange code".
Stars: ✭ 440 (+266.67%)
Mutual labels:  intellij, androidstudio
Cize
🔌 Continuous integration with the simplest solution
Stars: ✭ 100 (-16.67%)
Mutual labels:  ci, travis-ci
Kontinuous
The Kubernetes Continuous Integration & Delivery Platform (CI/CD) 🔄
Stars: ✭ 115 (-4.17%)
Mutual labels:  ci

= IntelliJ IDEA CLI Inspector Wrapper idea-cli-inspector Benjamin Schmid, [email protected] :experimental: // For kbd: macro

A little command-line tool to integrate the awesome IntelliJ IDEA code inspections in your continuous integration (CI) process using Jenkins, Bamboo, et. al.

[Build Status]

== Quick start (using Docker and Maven)

  1. Add a valid IDEA inspection profile file to your project (find them at .idea/inspectionProfiles)
  2. Run within your project directory: ==== docker run --rm -v $(pwd):/project bentolor/idea-cli-inspector -rf pom.xml -p inspectionprofile.xml ====

Optionally you can also

  • Use/Add a complete IDEA configuration (.idea) to your project. This allows more fine control (i.e. defining inspection scopes)
  • add a .ideainspect to control i.e. ignored files/inspections and other details. See the example file provided with idea-cli-inspector.

== Why this tool? IntelliJ IDEA offers a vast amount of very high-quality, built-in code inspections. Currently it has more than 1073 inspections to offer. Using project-shared inspection profiles it's possible to guide developers in a wide range of coding aspects in a non-annoying way.

In contrast to well-known quality tools like http://www.sonarqube.org/[SonarQube] these inspections do have quite a few benefits:

  • violations are instantly visible during code writing with freely configurable severities and warning levels. (i.e. bold red errors, yellow warning or discreet hints as recommendation)
  • false alarms can be easily and immediately suppressed. A simple kbd:[Alt-Enter] directly at the location where they occur is enough. + Alternatively you can adjust your inspection settings just on-the-fly (i.e. reduce level, disable inspection or configure inspection properties)
  • IDEA allows you to check for new violations introduced with your changes while you are trying to commit them
  • Many inspections in IDEA provide semi-automatic quickfixes and auto-corrections. So again sometimes addressing an issue is as simply as pressing kbd:[Alt-Enter] kbd:[Right arrow] kbd:[Enter].
  • Because all inspections are based on IDEA´s Psi engine (which is a sort of permanent running syntax compiler) the inspections effectively work on an actual AST. So IDEA understands the code and does not only look for (textual) patterns which in return leads to a significantly lower rate of false-positives.

Nevertheless, though IDEA offers on-the-fly analysis and error visualization it does not stop the developer in committing code violating these helpful guidelines into the project repository. JetBrain´s CI solution https://www.jetbrains.com/teamcity/[TeamCity] does offer a easy and good integration. It is also possible to execute the IDEA project inspection https://www.jetbrains.com/idea/help/working-with-intellij-idea-features-from-command-line.html[ on the command line], which will produce a hard-readable set of XML files and no further support for integrating this into an automated tool chain.

Therefore I did hack this little Groovy script to easily include & report inspection checks into your CI chain.

== What it does

This tool is aimed to simplify the inclusion of IDEA code inspection in your CI chain. It executes a command-line based run of an IntelliJ inspection run. This produces a set of hardly human-readable XML files in the target directory.

Therefore the tool subsequently parses the generated inspection result files, allows to filter out selected result files and looks for messages with given severity (WARNING and ERROR by default).

The tool will list issues in a humand-readable form and exit with return code 1 if it did find any issues (your CI tool should interpret this as failure) or will happily tell you that everyhing is fine.

== Prerequisites & Limitations The script is developed in Groovy, so this has to be installed. Furthermore you need a valid installation of IntelliJ IDEA.

NOTE: Due to a limitation of IDEA itself it is not possible to run more than one IDEA instance at the same time. Therefore you must ensure, that no other IDEA is running on your PC / on your CI agents.

== Usage

=== Configuration file base usage

IDEA CLI Inspector supports configuration via a .ideainspect file in the project root directory. Below is a example:


include::.ideainspect[]

=== Command line based usage For a full / up-to-date list of options please run idea-cli-inspector -h:


= IntellIJ IDEA Code Analysis Wrapper - v1.5.2 - @bentolor

This tools runs IntelliJ IDEA inspection via command line and tries to parse the output.

Example usage: ./idea-cli-inspector -i ~/devel/idea -r . -p myinspections.xml
-d src/main/java -s unused,Annotator,TodoComment.xml -l ERROR

For more convenience you can pass all options in a .ideainspect file instead of passing it via command line

usage: groovy idea-cli-inspector [options] -d,--dir Limit IDEA inspection to this directory. Overrides the scope argument. -h,--help Show usage information and quit -i,--ideahome IDEA or Android Studio installation home directory. Default: IDEA_HOME env var or idea -ip,--iprops Full path to your idea.properties. Only required if 1) you use --scope and 2) file is not located under in the default. Default: <ideahome>/idea/bin/idea.properties -l,--levels Levels to look for. Default: WARNING,ERROR -n,--dry-run Dry-run: Do not start IDEA, but run parsing -p,--profile Use this inspection profile file. If given an absolute path, the target file is used, otherwise the arg denotes a file located under .idea/inspectionProfiles. Default: Project_Default.xml -r,--rootdir IDEA project root directory containing the .idea directory. Default: Working directory -rf,--rootfile full path to the pom.xml or build.gradle file for the project. Useful if the project is maven or gradle based and its rootdir does not contain all the *.iml and .idea/modules.xml files -s,--skip Analysis result files to skip. For example TodoComment or TodoComment.xml. -sc,--scope The name of the "Custom scope" to apply. Custom scopes can be defined in the IDE. Share the resulting file in .idea/scopes/scopename.xml and provide the name of the scope (not file) here. -sf,--skipfile Ignore issues affecting source files matching given regex. Example: .*/generated/.*. -t,--resultdir Target directory to place the IDEA inspection XML result files. Default: target/inspection-results -v,--verbose Enable verbose logging

== Example usage $ groovy idea-cli-inspector
-i ~/devel/idea
-r ~/projects/p1
-p myinspections.xml
-d server
-s unused,Annotator,TodoComment.xml
-l ERROR

This looks for a IntelliJ installation in ~/devel/idea, tries to perform a CLI-based code inspection run on the IDEA project ~/projects/p1/.idea with an inspection profile ~/projects/p1/.idea/inspectionProfiles/myinspections.xml limiting the inspection run to the subdirectory server within your project.

The IDEA inspection run will produce a set of .xml files. The amount, levels and result is based on the inspection profile you passed. Option -s tells to skip & ignore the warnings contained in the inspection result files unused.xml, Annotator.xml and TodoComment.xml. You can ommit the .xml suffix for convenience.

By default it will then look for entries marked as [WARNING] or [ERROR] within the remaining inspection result report files. In our case we only care for ERROR entries. If it finds entries, it will report the file joined with a description pointing to the file location and the inspection rule.

== Vanilla Maven and Gradle projects For many maven and gradle-based projects, .iml files and xml files under .idea/libraries are not committed to SCM as they are generated by IntelliJ based on maven/gradle files (see https://intellij-support.jetbrains.com/hc/en-us/articles/206544839-How-to-manage-projects-under-Version-Control-Systems after "You may consider not to share the following"). +

For such projects, the inspection must be launched by passing the path to the maven/gradle project file like in the following example:

$ groovy idea-cli-inspector \
    --ideahome ~/devel/idea \
    --rootdir ~/projects/p1 \
    --rootfile ~/projects/p1/pom.xml
    --profile ~/myinspections.xml \
    -l ERROR

== Example output


➜ idea-cli-inspector.git git:(master) ✗ ./idea-cli-inspector -i ~/devel/idea -r ../dashboard.git -p bens_idea15_2015_11.xml -d server -s Annotator,JSUnresolvedLibraryURL.xml,JavaDoc,TodoComment -l ERROR,WARNING

= IntellIJ IDEA Code Analysis Wrapper - v1.0 - @bentolor

Running IDEA IntelliJ Inspection

Executing: /home/ben/devel/idea/bin/idea.sh [/home/ben/devel/idea/bin/idea.sh, inspect, /home/ben/projects/idea-cli-inspector.git/../dashboard.git, /home/ben/projects/idea-cli-inspector.git/../dashboard.git/.idea/inspectionProfiles/bens_idea15_2015_11.xml, /home/ben/projects/idea-cli-inspector.git/../dashboard.git/target/inspection-results, -d, server] log4j:WARN No appenders could be found for logger (io.netty.util.internal.logging.InternalLoggerFactory). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. Please configure library 'Node.js v4.2.1 Core Modules' which is used in module 'client'

... IDEA spilling out quite a bunch of exceptions during inspection run ...

Inspecting produced result files in ../dashboard.git/target/inspection-results

Looking for: [[WARNING], [ERROR]]

Ignoring : [Annotator, JSUnresolvedLibraryURL, JavaDoc, TodoComment]

--- ClassNamePrefixedWithPackageName.xml [WARNING] server/src/main/java/de/foo/dashboard/data/DatasetVerticle.java:28 -- Class name DatasetVerticle begins with its package name #loc [WARNING] server/src/main/java/de/foo/dashboard/data/DatasetBuilder.java:17 -- Class name DatasetBuilder begins with its package name #loc

--- InterfaceNamingConvention.xml [WARNING] server/src/main/java/de/foo/dashboard/constants/Events.java:11 -- Interface name Events is too short (6 < 8) #loc

--- SameParameterValue.xml [WARNING] server/src/main/java/de/foo/dashboard/data/DatasetBuilder.java:30 -- Actual value of parameter 'type' is always 'de.exxcellent.dashboard.constants.DatasetType.ARRAY'

--- Skipping JavaDoc.xml --- Skipping TodoComment.xml --- DeprecatedClassUsageInspection.xml [WARNING] server/pom.xml:99 -- 'io.vertx.core.Starter' is deprecated

--- Skipping JSUnresolvedLibraryURL.xml --- Skipping Annotator.xml --- unused.xml [WARNING] server/src/main/java/de/foo/dashboard/data/DatasetBuilder.java:40 -- Method is never used. [WARNING] server/src/main/java/de/foo/dashboard/constants/DatasetType.java:14 -- Field has no usages. [WARNING] server/src/main/java/de/foo/dashboard/constants/DatasetType.java:14 -- Field has no usages. [WARNING] server/src/main/java/de/foo/dashboard/data/DatasetVerticle.java:28 -- Class is not instantiated. [WARNING] server/src/main/java/de/foo/dashboard/transformers/History.java:23 -- Class is not instantiated.

Analysis Result

Entries found. return code: 1

== Running within a Docker container (i.e. Travis CI)

Here is a .travis.yml which demonstrates how to run idea-cli-inspector within a Docker container. You can see this in practice running https://www.travis-ci.org/bentolor/microframeworks-showcase/[here on Travis CI] with the source inspected https://github.com/bentolor/microframeworks-showcase/[in my microframeworks-showcase project]

Two things to note:

  • IDEA needs some very basic configuration already existing. At least i.e. the .IntelliJIdea2018.1/config/options/jdk.table.xml which defines the locations of the installed JDKs
  • The IDEA configuration directory location varies from version to version and edition to edition. I.e. it's ~/.IntelliJIdea2018.1 for the IDEA 2018.1 Ultimate edition and ~/.IdeaIC2018.1 for the community edition
  • If you are using i.e. Node, Scala, VueJS etc. in your project please note, that these plugins bring more inspections to the table. If you want to have them in your CI/Docker run to, ensure that you
    add them to i.e. .IntelliJIdea2017.3/config/plugins/ directory so they are picked up and effective.
  • You can build these required configurations either by manually adjusting and then copying those configuration file into the container or by i.e. manually starting IDEA within the container once with the configuration directories mapped as Docker volumes i.e. like:

xhost + docker run -it --rm
--dns 192.168.144.18 --dns 8.8.8.8
-e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix
-v pwd/root/.IntelliJIdea2018.1:/root/.IntelliJIdea2018.1
-v pwd/root/.java:/root/.java debug-ideacli-dockeragent
/bin/bash


language: java

before_cache:

  • rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
  • rm -fr $HOME/.gradle/caches/*/plugin-resolution/

cache: directories: - $HOME/.gradle/caches/ - $HOME/.gradle/wrapper/

before_install:

  • sudo add-apt-repository ppa:mmk2410/intellij-idea -y
  • sudo apt-get update -q
  • sudo apt-get install intellij-idea-community -y
  • sudo apt-get install groovy -y

install:

script:

Copy idea configuration template (mostly .IntelliJIdea2018.1/config/options/jdk.table.xml)

  • cp -r ./tools/idea-cli-inspector/root/.IntelliJIdea2018.1 /home/travis/

Duplicate for community config dir

  • cp -r ./tools/idea-cli-inspector/root/.IntelliJIdea2018.1 /home/travis/.IdeaIC2018.1
  • ./idea-cli-inspector-master/idea-cli-inspector -i /opt/intellij-idea-community

== Troubleshooting & FAQ

.My inspection runs very long and takes to much time. What can I do?

First: Introduce and use a new scope where you exclude all folders and/or include only those folders which are relevant for your inspection. Typical folders which are not relevant are i.e. node_modules, docs or build output folders. Secondly think about creating and using a custom inspection profile for the purpose of the CI. There you i.e. might disable all inspections with INFO/HINT level or i.e. the spell checking.

.I receive a error message Please, specify sdk 'null' for module 'foo'

Probably you excluded misc.xml from the versionied IDEA project. Which is fine because this file is quite volatile. But this is the file where IDEA stores the "Root JDK".

To fix this error simply assign every module a SDK other than "Project SDK".

.The analysis seems to produce different results on subsequent runs on the same sources (esp. JavaScript)

This seems to be an issue with the IDEA caches which IntelliJ keeps i.e. under .IntelliJ201X.X/system. Try if deleting this directory prior to executing the analysis runs produces stable results.

.What shall I pass as IDEA home directory for Mac OSX?

/Applications/IntelliJ\ IDEA.app should be the default installation folder.

.I'm using Android Studio and I can't find idea.properties!

See the details about the location at http://tools.android.com/tech-docs/configuration

.Scoping does not work? First: Did you versionate the .idea/scope/scopename.xml file in your project? Did you specify the Custom scope name and not the filename?

If no, it might be that there is an issue that you are not pointing the --iprops option to the right idea.properties file or you i.e. don't have write access for it.

Background information and troubleshooting: Unfortunately IDEA yet does not offer a direct CLI option for applying scope. Therefore we need to pass a System property entries via modifying the idea.properties file. Check the output of the script if you spot any issues during this process. Check the content of idea.properties during the run and look out for you scope name.

.I receive different results in my IDE vs. on the CI server

Please check the following:

  • [ ] Same version of IDEA installed on CI vs. you installation?
  • [ ] Do you have the same plugins installed? Some bring own inspections or support fur understanding file formats (like .vue files with the vue plugin).
  • [ ] Do you delete the .IntelliJ201X.X/system folder prior to every run on CI (see above)?

== Source code & Contributions

The source code is located under https://github.com/bentolor/idea-cli-inspector.

== License Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.

You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].