Εκτελέστε το IntelliJ IDEA Inspections στο Jenkins

Το IntelliJ IDEA διαθέτει σήμερα τον πιο προηγμένο στατικό αναλυτή κώδικα Java, ο οποίος, όσον αφορά τις δυνατότητές του, έχει αφήσει πολύ πίσω του «βετεράνους» όπως Στυλ ελέγχου и Spotbugs. Οι πολυάριθμες "επιθεωρήσεις" του ελέγχουν τον κώδικα σε διάφορες πτυχές, από το στυλ κωδικοποίησης έως τα χαρακτηριστικά σφάλματα.

Ωστόσο, εφόσον τα αποτελέσματα της ανάλυσης εμφανίζονται μόνο στο τοπικό IDE του προγραμματιστή, είναι ελάχιστα χρήσιμα για τη διαδικασία ανάπτυξης. Στατική Ανάλυση πρέπει να πραγματοποιηθεί Ως το πρώτο βήμα του αγωγού κατασκευής, τα αποτελέσματά του πρέπει να καθορίσουν τις πύλες ποιότητας και η κατασκευή πρέπει να αποτύχει εάν οι πύλες ποιότητας αποτύχουν. Το TeamCity CI είναι γνωστό ότι είναι ενσωματωμένο με το IDEA. Αλλά ακόμα κι αν δεν χρησιμοποιείτε το TeamCity, μπορείτε να δοκιμάσετε να εκτελέσετε επιθεωρήσεις IDEA σε οποιονδήποτε άλλο διακομιστή CI. Προτείνω να δούμε πώς μπορεί να γίνει αυτό χρησιμοποιώντας το πρόσθετο IDEA Community Edition, Jenkins και Warnings NG.

Βήμα 1. Εκτελέστε την ανάλυση σε ένα δοχείο και λάβετε μια αναφορά

Αρχικά, η ιδέα της εκτέλεσης μιας IDE (επιτραπέζιας εφαρμογής!) μέσα σε ένα σύστημα CI που δεν έχει γραφική διεπαφή μπορεί να φαίνεται αμφίβολη και πολύ ενοχλητική. Ευτυχώς, οι προγραμματιστές IDEA έχουν παράσχει τη δυνατότητα εκτέλεσης μορφοποίηση κώδικα и επιθεωρήσεις από τη γραμμή εντολών. Επιπλέον, για την εκτέλεση του 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.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 είναι η μισή μάχη, τώρα πρέπει να γίνει αναγνώσιμη από τον άνθρωπο. Και επίσης τα αποτελέσματά του θα πρέπει να χρησιμοποιούνται σε πύλες ποιότητας - η λογική για τον καθορισμό του εάν η αποδεκτή αλλαγή περνά ή όχι σύμφωνα με κριτήρια ποιότητας.

Αυτό θα μας βοηθήσει Πρόσθετο Jenkins Warnings NGπου κυκλοφόρησε τον Ιανουάριο του 2019. Με την εισαγωγή του, πολλά ξεχωριστά πρόσθετα για εργασία με αποτελέσματα στατικής ανάλυσης στο 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')]
    )
}

Η διεπαφή αναφοράς μοιάζει με αυτό:

Εκτελέστε το IntelliJ IDEA Inspections στο Jenkins

Είναι βολικό ότι αυτή η διεπαφή είναι καθολική για όλους τους αναγνωρίσιμους αναλυτές. Περιέχει ένα διαδραστικό γράφημα της κατανομής των ευρημάτων ανά κατηγορία και ένα γράφημα της δυναμικής των αλλαγών στον αριθμό των ευρημάτων. Στο πλέγμα στο κάτω μέρος της σελίδας, μπορείτε να εκτελέσετε μια γρήγορη αναζήτηση. Το μόνο πράγμα που δεν λειτούργησε σωστά για τις επιθεωρήσεις IDEA ήταν η δυνατότητα περιήγησης στον κώδικα απευθείας στο Jenkins (αν και για άλλες αναφορές, όπως το Checkstyle, αυτό το πρόσθετο μπορεί να το κάνει όμορφα). Φαίνεται ότι είναι ένα σφάλμα στον αναλυτή αναφορών IDEA που πρέπει να διορθωθεί.

Μεταξύ των χαρακτηριστικών του Warnings NG είναι η δυνατότητα συγκέντρωσης ευρημάτων από διαφορετικές πηγές σε μία αναφορά και προγραμματισμού Quality Gates, συμπεριλαμβανομένης μιας "καστάνιας" για μια διάταξη αναφοράς. Διατίθεται κάποια τεκμηρίωση προγραμματισμού Quality Gates εδώ - ωστόσο, δεν είναι πλήρες, και πρέπει να κοιτάξετε την πηγή. Από την άλλη πλευρά, για πλήρη έλεγχο του τι συμβαίνει, η «καστάνια» μπορεί να εφαρμοστεί ανεξάρτητα (βλ. προηγούμενη ανάρτηση σχετικά με αυτό το θέμα).

Συμπέρασμα

Πριν ξεκινήσω να ετοιμάζω αυτό το υλικό, αποφάσισα να κοιτάξω: έχει γράψει κανείς ήδη για αυτό το θέμα στο Habré; μόνο βρήκα συνέντευξη 2017 с Lanyόπου λέει:

Από όσο γνωρίζω, δεν υπάρχει ενσωμάτωση με το Jenkins ή ένα πρόσθετο maven [...] Κατ 'αρχήν, οποιοσδήποτε ενθουσιώδης θα μπορούσε να κάνει φίλους του IDEA Community Edition και του Jenkins, πολλοί θα επωφεληθούν μόνο από αυτό.

Λοιπόν, μετά από δύο χρόνια έχουμε το Warnings NG Plugin, και επιτέλους αυτή η φιλία έγινε πραγματικότητα!

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο