Jalankan IntelliJ IDEA Inspection di Jenkins

IntelliJ IDEA saat ini memiliki penganalisis kode Java statis tercanggih, yang, dalam hal kemampuannya, telah jauh tertinggal dari "veteran" seperti Gaya cek ΠΈ Spotbug. Banyaknya "inspeksi" memeriksa kode dalam berbagai aspek, dari gaya pengkodean hingga bug karakteristik.

Namun, selama hasil analisis hanya ditampilkan di IDE lokal pengembang, hasil tersebut tidak banyak berguna untuk proses pengembangan. Analisis Statis harus dilaksanakan sebagai langkah awal dari build pipeline, hasilnya harus menentukan quality gates, dan build harus gagal jika quality gates gagal. TeamCity CI diketahui terintegrasi dengan IDEA. Tetapi meskipun Anda tidak menggunakan TeamCity, Anda masih dapat mencoba menjalankan inspeksi IDEA di server CI lainnya. Saya mengusulkan untuk melihat bagaimana hal ini dapat dilakukan dengan menggunakan plugin Edisi Komunitas IDEA, Jenkins dan Peringatan NG.

Langkah 1. Jalankan analisis dalam wadah dan dapatkan laporan

Pada awalnya, ide menjalankan IDE (aplikasi desktop!) di dalam sistem CI yang tidak memiliki antarmuka grafis mungkin tampak meragukan dan sangat merepotkan. Untungnya, pengembang IDEA telah menyediakan kemampuan untuk menjalankannya pemformatan kode ΠΈ inspeksi dari baris perintah. Selain itu, untuk menjalankan IDEA dalam mode ini, subsistem grafis tidak diperlukan, dan tugas ini dapat dilakukan di server dengan kerangka teks.

Inspeksi diluncurkan menggunakan skrip bin/inspect.sh dari direktori instalasi IDEA. Parameter yang dibutuhkan adalah:

  • path lengkap ke proyek (yang relatif tidak didukung),
  • path ke file .xml dengan pengaturan inspeksi (biasanya terletak di dalam proyek di .idea/inspectionProfiles/Project_Default.xml),
  • jalur lengkap ke folder tempat file .xml dengan laporan hasil analisis akan disimpan.

Selain itu diharapkan

  • jalur ke Java SDK akan dikonfigurasi di IDE, jika tidak, analisis tidak akan berfungsi. Pengaturan ini terkandung dalam file konfigurasi. jdk.table.xml dalam folder konfigurasi global IDEA. Konfigurasi IDEA global default itu sendiri ada di direktori home pengguna, tetapi lokasi ini dapat diatur secara eksplisit dalam file idea.properties.
  • proyek yang dianalisis harus merupakan proyek IDEA yang valid, di mana beberapa file yang biasanya diabaikan harus dikomit ke kontrol versi, yaitu:
    • .idea/inspectionProfiles/Project_Default.xml β€” pengaturan penganalisa, mereka jelas akan digunakan saat meluncurkan inspeksi dalam wadah,
    • .idea/modules.xml - jika tidak, kami mendapatkan kesalahan 'Proyek ini tidak berisi modul',
    • .idea/misc.xml - jika tidak, kami mendapatkan kesalahan 'JDK tidak dikonfigurasi dengan benar untuk proyek ini',
    • *.iml-Ρ„Π°ΠΉΠ»Ρ‹ - jika tidak, kami akan mendapatkan kesalahan tentang JDK yang tidak dikonfigurasi dalam modul.

Meskipun file-file ini biasanya termasuk dalam .gitignore, mereka tidak berisi informasi khusus untuk lingkungan pengembang tertentu - tidak seperti, misalnya, file workspace.xml, di mana informasi tersebut, adil, terkandung, dan oleh karena itu tidak perlu melakukannya.

Dengan sendirinya, jalan keluar menyarankan dirinya untuk mengemas JDK bersama dengan Edisi Komunitas IDEA ke dalam wadah dalam bentuk yang siap untuk "diatur" pada proyek yang dianalisis. Mari kita pilih wadah dasar yang sesuai, dan inilah Dockerfile yang kita dapatkan:

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 opsi idea.config.path kami membuat IDEA mencari konfigurasi globalnya di folder /etc/idea, karena folder beranda pengguna dalam kondisi kerja di CI adalah hal yang tidak terbatas dan seringkali sama sekali tidak ada.

Beginilah tampilan file yang disalin ke wadah jdk.table.xml, yang berisi jalur ke OpenJDK yang dipasang di dalam wadah (dapat didasarkan pada file serupa dari direktori pengaturan IDEA Anda sendiri):

jdk.tabel.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>

Gambar selesai tersedia di Docker Hub.

Sebelum melanjutkan, mari kita coba menjalankan parser IDEA di wadah:

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

Analisis harus bekerja dengan sukses, dan banyak file .xml dengan laporan penganalisis akan muncul di subfolder target/idea_inspections.

Sekarang tidak diragukan lagi bahwa penganalisa IDEA dapat dijalankan secara offline di lingkungan CI mana pun, dan kita beralih ke langkah kedua.

Langkah 2. Tampilkan dan analisis laporan

Mendapatkan laporan dalam bentuk file .xml adalah setengah dari perjuangan, sekarang perlu dibuat agar dapat dibaca oleh manusia. Dan juga hasilnya harus digunakan di gerbang kualitas - logika untuk menentukan apakah perubahan yang diterima lulus atau tidak sesuai dengan kriteria kualitas.

Ini akan membantu kita Peringatan Jenkins NG Pluginyang dirilis pada Januari 2019. Dengan diperkenalkannya, banyak plugin terpisah untuk bekerja dengan hasil analisis statis di Jenkins (CheckStyle, FindBugs, PMD, dll.) Sekarang ditandai sebagai usang.

Plugin ini terdiri dari dua bagian:

  • banyak pengumpul pesan penganalisa (daftar lengkap mencakup semua penganalisa yang diketahui sains dari AcuCobol hingga ZPT Lint),
  • penampil laporan tunggal untuk semuanya.

Daftar hal-hal yang dapat diurai Peringatan NG mencakup peringatan kompiler Java dan peringatan dari log eksekusi Maven: meskipun selalu terlihat, jarang dianalisis dengan sengaja. Laporan IntelliJ IDEA juga disertakan dalam daftar format yang dikenali.

Karena pluginnya baru, plugin ini awalnya berinteraksi dengan baik dengan Jenkins Pipeline. Langkah build dengan partisipasinya akan terlihat seperti ini (kami hanya memberi tahu plugin format laporan mana yang kami kenali dan file mana yang harus dipindai):

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

Antarmuka laporan terlihat seperti ini:

Jalankan IntelliJ IDEA Inspection di Jenkins

Lebih mudah bahwa antarmuka ini bersifat universal untuk semua pengurai yang dapat dikenali. Ini berisi bagan interaktif tentang distribusi penemuan berdasarkan kategori dan grafik dinamika perubahan jumlah penemuan. Di kisi di bagian bawah halaman, Anda dapat melakukan pencarian cepat. Satu-satunya hal yang tidak berfungsi dengan benar untuk pemeriksaan IDEA adalah kemampuan untuk menelusuri kode secara langsung di Jenkins (walaupun untuk laporan lain, seperti Checkstyle, plugin ini dapat melakukannya dengan baik). Tampaknya ada bug di parser laporan IDEA yang perlu diperbaiki.

Di antara fitur Peringatan NG adalah kemampuan untuk mengumpulkan temuan dari berbagai sumber dalam satu laporan dan program Gerbang Kualitas, termasuk "ratchet" untuk rakitan referensi. Beberapa dokumentasi pemrograman Quality Gates tersedia di sini - namun, itu tidak lengkap, dan Anda harus melihat sumbernya. Di sisi lain, untuk kendali penuh atas apa yang terjadi, "ratchet" dapat diimplementasikan secara mandiri (lihat my Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ост tentang tema ini).

Kesimpulan

Sebelum mulai menyiapkan materi ini, saya memutuskan untuk melihat: apakah sudah ada yang menulis tentang topik ini di Habré? Saya hanya menemukan wawancara 2017 с Lanydi mana dikatakan:

Sejauh yang saya tahu, tidak ada integrasi dengan Jenkins atau plugin maven [...] Pada prinsipnya, setiap peminat dapat menjadikan Edisi Komunitas IDEA dan teman-teman Jenkins, banyak yang hanya akan mendapat manfaat dari ini.

Nah, setelah dua tahun kami memiliki Plugin Peringatan NG, dan akhirnya persahabatan ini menjadi kenyataan!

Sumber: www.habr.com

Tambah komentar