Menjalankan pemeriksaan IntelliJ IDEA pada Jenkins

IntelliJ IDEA hari ini mempunyai penganalisis kod Java statik yang paling maju, yang dalam keupayaannya meninggalkan jauh di belakang "veteran" seperti Gaya semak ΠΈ pepijat. Banyak "pemeriksaan"nya menyemak kod dalam pelbagai aspek, daripada gaya pengekodan kepada pepijat biasa.

Walau bagaimanapun, selagi keputusan analisis hanya dipaparkan dalam antara muka tempatan IDE pembangun, ia tidak banyak digunakan untuk proses pembangunan. Analisis statik mesti ditunaikan Sebagai langkah pertama saluran paip binaan, keputusannya harus menentukan gerbang kualiti, dan binaan harus gagal jika pintu kualiti tidak diluluskan. Adalah diketahui bahawa TeamCity CI disepadukan dengan IDEA. Tetapi walaupun anda tidak menggunakan TeamCity, anda boleh cuba menjalankan pemeriksaan IDEA dengan mudah dalam mana-mana pelayan CI lain. Saya cadangkan anda melihat bagaimana ini boleh dilakukan menggunakan pemalam IDEA Community Edition, Jenkins dan Warnings NG.

Langkah 1. Jalankan analisis dalam bekas dan dapatkan laporan

Pada mulanya, idea untuk menjalankan IDE (aplikasi desktop!) di dalam sistem CI yang tidak mempunyai antara muka grafik mungkin kelihatan meragukan dan sangat menyusahkan. Nasib baik, pemaju IDEA telah menyediakan keupayaan untuk dijalankan pemformatan kod ΠΈ pemeriksaan daripada baris arahan. Selain itu, untuk menjalankan IDEA dalam mod ini, subsistem grafik tidak diperlukan dan tugas ini boleh dilakukan pada pelayan dengan cangkerang teks.

Pemeriksaan dilancarkan menggunakan skrip bin/inspect.sh daripada direktori pemasangan IDEA. Parameter yang diperlukan ialah:

  • laluan penuh ke projek (yang relatif tidak disokong),
  • laluan ke fail .xml dengan tetapan pemeriksaan (biasanya terletak di dalam projek dalam .idea/inspectionProfiles/Project_Default.xml),
  • laluan penuh ke folder di mana fail .xml dengan laporan tentang hasil analisis akan disimpan.

Di samping itu, adalah dijangkakan

  • laluan ke Java SDK akan dikonfigurasikan dalam IDE, jika tidak, analisis tidak akan berfungsi. Tetapan ini terkandung dalam fail konfigurasi jdk.table.xml dalam folder konfigurasi global IDEA. Konfigurasi global IDEA itu sendiri terletak dalam direktori rumah pengguna secara lalai, tetapi lokasi ini boleh dinyatakan secara eksplisit dalam fail idea.properties.
  • Projek yang dianalisis mestilah projek IDEA yang sah, yang mana anda perlu melakukan beberapa fail yang biasanya diabaikan kepada kawalan versi, iaitu:
    • .idea/inspectionProfiles/Project_Default.xml β€” tetapan penganalisis, ia jelas akan digunakan semasa menjalankan pemeriksaan dalam bekas,
    • .idea/modules.xml - jika tidak, kami akan mendapat ralat 'Projek ini tidak mengandungi modul',
    • .idea/misc.xml - jika tidak, kami akan mendapat ralat 'JDK tidak dikonfigurasikan dengan betul untuk projek ini',
    • *.iml-Ρ„Π°ΠΉΠ»Ρ‹ β€” jika tidak, kami akan mendapat ralat tentang JDK yang tidak dikonfigurasikan dalam modul.

Walaupun fail ini biasanya disertakan dalam .gitignore, ia tidak mengandungi sebarang maklumat khusus untuk persekitaran pembangun tertentu - tidak seperti, sebagai contoh, fail workspace.xml, di mana maklumat tersebut terkandung, dan oleh itu tidak perlu melakukannya.

Penyelesaian yang jelas adalah untuk membungkus JDK bersama-sama dengan Edisi Komuniti IDEA ke dalam bekas dalam bentuk yang sedia untuk "diadu" pada projek yang dianalisis. Mari kita pilih bekas asas yang sesuai, dan ini adalah fail Docker kami:

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

Menggunakan pilihan idea.config.path kami memaksa IDEA mencari konfigurasi globalnya dalam folder /etc/idea, kerana folder rumah pengguna semasa bekerja dalam CI adalah perkara yang tidak pasti dan selalunya tidak hadir sepenuhnya.

Beginilah rupa fail yang disalin ke bekas: jdk.table.xml, yang mengandungi laluan ke OpenJDK yang dipasang di dalam bekas (fail serupa dari direktori anda sendiri dengan tetapan IDEA boleh diambil sebagai asas):

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>

Imej yang telah siap tersedia di Docker Hub.

Sebelum meneruskan, mari semak sama ada penganalisis IDEA berjalan dalam bekas:

docker run --rm -v <ΠΏΡƒΡ‚ΡŒ/ΠΊ/Π²Π°ΡˆΠ΅ΠΌΡƒ/ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ>:/var/project inponomarev/intellij-idea-analyzer

Analisis harus berjalan dengan jayanya dan banyak fail .xml dengan laporan penganalisis akan muncul dalam subfolder target/idea_inspections.

Kini tidak ada keraguan lagi bahawa penganalisis IDEA boleh dijalankan kendiri dalam mana-mana persekitaran CI, dan kami meneruskan ke langkah kedua.

Langkah 2. Paparkan dan analisis laporan

Mendapatkan laporan dalam bentuk fail .xml adalah separuh daripada perjuangan; kini anda perlu menjadikannya boleh dibaca manusia. Dan juga keputusannya harus digunakan dalam gerbang kualiti - logik untuk menentukan sama ada perubahan yang diterima lulus atau gagal mengikut kriteria kualiti.

Ini akan membantu kita Jenkins Warnings NG Plugin, yang dikeluarkan pada Januari 2019. Dengan kemunculannya, banyak pemalam individu untuk bekerja dengan hasil analisis statik dalam Jenkins (CheckStyle, FindBugs, PMD, dll.) kini ditandakan sebagai usang.

Pemalam ini terdiri daripada dua bahagian:

  • banyak pengumpul mesej penganalisis (senarai penuh termasuk semua penganalisis yang diketahui sains dari AcuCobol hingga ZPT Lint),
  • pemapar laporan tunggal untuk kesemuanya.

Senarai perkara yang Warnings NG boleh menganalisis termasuk amaran daripada pengkompil Java dan amaran daripada log pelaksanaan Maven: walaupun ia sentiasa kelihatan, ia jarang dianalisis secara khusus. Laporan IntelliJ IDEA juga disertakan dalam senarai format yang diiktiraf.

Memandangkan pemalam itu baharu, ia pada mulanya berinteraksi dengan baik dengan Jenkins Pipeline. Langkah binaan dengan penyertaannya akan kelihatan seperti ini (kami hanya memberitahu pemalam format laporan yang kami kenali dan fail yang perlu diimbas):

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')]
    )
}

Antara muka laporan kelihatan seperti ini:

Menjalankan pemeriksaan IntelliJ IDEA pada Jenkins

Dengan mudah, antara muka ini adalah universal untuk semua penganalisis yang diiktiraf. Ia mengandungi gambar rajah interaktif taburan penemuan mengikut kategori dan graf dinamik perubahan dalam bilangan penemuan. Anda boleh melakukan carian pantas dalam grid di bahagian bawah halaman. Satu-satunya perkara yang tidak berfungsi dengan betul untuk pemeriksaan IDEA ialah keupayaan untuk menyemak imbas kod terus dalam Jenkins (walaupun untuk laporan lain, contohnya Checkstyle, pemalam ini boleh melakukannya dengan cantik). Nampaknya ini adalah pepijat dalam penghurai laporan IDEA yang perlu diperbaiki.

Antara ciri Amaran NG ialah keupayaan untuk mengagregat penemuan daripada sumber yang berbeza dalam satu laporan dan program Quality Gates, termasuk "ratchet" untuk perhimpunan rujukan. Beberapa dokumentasi pengaturcaraan Quality Gates tersedia di sini - walau bagaimanapun, ia tidak lengkap, dan anda perlu melihat kod sumber. Sebaliknya, untuk kawalan sepenuhnya ke atas apa yang berlaku, "ratchet" boleh dilaksanakan secara bebas (lihat my jawatan sebelum ini mengenai tema ini).

Kesimpulan

Sebelum mula menyediakan bahan ini, saya memutuskan untuk mencari: adakah sesiapa sudah menulis mengenai topik ini di Habré? Saya hanya jumpa temuduga 2017 с lannydi mana dia berkata:

Setakat yang saya tahu, tiada integrasi dengan Jenkins atau pemalam maven [...] Pada dasarnya, mana-mana peminat boleh berkawan dengan IDEA Community Edition dan Jenkins, ramai yang hanya akan mendapat manfaat daripada ini.

Nah, dua tahun kemudian kami mempunyai Amaran NG Plugin, dan akhirnya persahabatan ini telah membuahkan hasil!

Sumber: www.habr.com

Tambah komen