IntelliJ IDEA hari ini memiliki analisa kode Java statis paling canggih, yang dalam kemampuannya jauh tertinggal dari "veteran" seperti Checkstyle dan Spotbugs . Banyak "inspeksi" memeriksa kode dalam berbagai aspek, dari gaya pengkodean hingga bug karakteristik.
Namun, sementara hasil analisis hanya ditampilkan di antarmuka lokal IDE pengembang, mereka sedikit berguna untuk proses pengembangan. Analisis statis harus dilakukan sebagai langkah pertama dari pipa rakitan, hasilnya harus menentukan gerbang kualitas, dan rakitan harus gagal jika gerbang kualitas tidak dilewati. TeamCity CI diketahui terintegrasi dengan IDEA. Tetapi bahkan jika Anda tidak menggunakan TeamCity, Anda dapat mencoba menjalankan inspeksi IDEA pada server CI lainnya. Saya mengusulkan untuk melihat bagaimana hal ini dapat dilakukan dengan menggunakan IDEA Community Edition, Jenkins dan Warnings NG plugin.
Langkah 1. Jalankan analisis dalam wadah dan dapatkan laporan
Awalnya, ide untuk memulai IDE (aplikasi desktop!) Di dalam sistem CI yang tidak memiliki antarmuka grafis bisa tampak meragukan dan sangat menyusahkan. Untungnya, pengembang IDEA telah menyediakan kemampuan untuk menjalankan pemformatan kode dan inspeksi dari baris perintah. Selain itu, untuk menjalankan IDEA dalam mode ini, subsistem grafis tidak diperlukan dan tugas-tugas ini dapat dilakukan pada server dengan shell teks.
Inspeksi diluncurkan menggunakan bin/inspect.sh
dari direktori instalasi IDEA. Sebagai parameter yang diperlukan:
- jalur penuh ke proyek (relatif tidak didukung)
- path ke file .xml dengan pengaturan inspeksi (biasanya terletak di dalam proyek di .idea / inspectionProfiles / Project_Default.xml),
- path lengkap ke folder tempat file .xml dengan laporan hasil analisis akan ditambahkan.
Selain itu, diharapkan hal itu
- IDE akan mengonfigurasi jalur ke Java SDK, jika tidak, analisisnya tidak akan berfungsi. Pengaturan ini terkandung dalam file konfigurasi
jdk.table.xml
di folder konfigurasi global IDEA. Konfigurasi IDEA global itu sendiri terletak secara default di direktori home pengguna, tetapi lokasi ini dapat secara eksplisit ditentukan dalam file idea.properties
. - proyek yang dianalisis harus merupakan proyek IDEA yang valid, untuk itu kontrol versi harus melakukan beberapa file yang biasanya diabaikan, yaitu:
.idea/inspectionProfiles/Project_Default.xml
- pengaturan analisa, mereka jelas akan digunakan ketika memulai inspeksi dalam wadah,.idea/modules.xml
- jika tidak kita akan mendapatkan kesalahan 'Proyek ini tidak mengandung modul',.idea/misc.xml
- jika tidak kita akan mendapatkan kesalahan 'JDK tidak dikonfigurasi dengan benar untuk proyek ini',*.iml-
- jika tidak kita akan mendapatkan kesalahan tentang JDK yang tidak dikonfigurasi dalam modul.
Meskipun file-file ini biasanya termasuk dalam .gitignore
, mereka tidak mengandung informasi khusus untuk lingkungan pengembang tertentu - tidak seperti, misalnya, file workspace.xml
, di mana informasi tersebut terkandung, dan oleh karena itu tidak perlu untuk melakukan itu.
Sendiri memohon cara untuk mengemas JDK bersama-sama dengan Edisi Komunitas IDEA dalam sebuah wadah dalam bentuk yang siap untuk "mengatur" proyek-proyek yang dianalisis. Kami akan memilih wadah dasar yang sesuai, dan inilah Dockerfile yang kami 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
Dengan menggunakan opsi idea.config.path
kami memaksa IDEA untuk mencari konfigurasi globalnya di folder /etc/idea
, karena folder home pengguna dalam kondisi CI adalah hal yang tidak ditentukan dan seringkali sama sekali tidak ada.
Ini adalah bagaimana file jdk.table.xml
disalin ke wadah terlihat seperti, di mana jalur ke OpenJDK diinstal di dalam wadah ditulis (file serupa dari direktori Anda sendiri dengan pengaturan IDEA dapat diambil):
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>
Gambar yang sudah jadi tersedia di Docker Hub .
Sebelum melanjutkan, periksa awal penganalisis IDEA dalam wadah:
docker run --rm -v <///>:/var/project inponomarev/intellij-idea-analyzer
Analisis akan berhasil dengan sukses, dan banyak file .xml dengan laporan penganalisa akan muncul di subfolder target / idea_inspections.
Sekarang tidak ada lagi keraguan bahwa IDEA dapat dijalankan secara offline di lingkungan CI apa pun, dan kami beralih ke langkah kedua.
Langkah 2. Tampilkan dan analisis laporan
Mendapatkan laporan dalam bentuk file .xml adalah setengah dari perjuangan, sekarang Anda harus membuatnya dapat dibaca oleh manusia. Dan juga hasilnya harus digunakan di gerbang kualitas - logika menentukan apakah perubahan yang diterima melewati atau tidak lulus sesuai dengan kriteria kualitas.
Ini akan membantu kami Jenkins Warnings NG Plugin , yang dirilis pada Januari 2019. Dengan kemunculannya, banyak plugin individual untuk bekerja dengan hasil analisis statis di Jenkins (CheckStyle, FindBugs, PMD, dll.) Sekarang ditandai sebagai usang.
Plugin terdiri dari dua bagian:
- banyak pengumpul pesan penganalisa ( daftar lengkap mencakup semua penganalisa yang diketahui dari AcuCobol hingga ZPT Lint),
- penampil tunggal untuk mereka semua.
Daftar yang bisa dianalisis NG Peringatan mencakup peringatan dari kompiler Java dan peringatan dari log runtime Maven: meskipun mereka selalu terlihat, jarang dianalisis dengan sengaja. Laporan IntelliJ IDEA juga termasuk dalam daftar format yang dikenal.
Karena plugin ini baru, awalnya berinteraksi dengan baik dengan Jenkins Pipeline. Langkah perakitan dengan partisipasinya akan terlihat seperti ini (kami hanya memberi tahu plug-in 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:

Mudahnya, antarmuka ini bersifat universal untuk semua analis yang dikenal. Ini berisi diagram interaktif distribusi temuan berdasarkan kategori dan grafik dinamika perubahan jumlah penemuan. Di kisi di bagian bawah halaman, Anda dapat melakukan pencarian cepat. Satu-satunya hal yang IDEA tidak berhasil untuk inspeksi adalah kemampuan untuk menelusuri kode secara langsung di Jenkins (walaupun untuk laporan lain, misalnya Checkstyle, plugin ini dapat melakukannya dengan indah). Ini tampaknya merupakan bug pengurai laporan IDEA untuk diperbaiki.
Di antara kemampuan Peringatan NG adalah kemampuan untuk mengumpulkan temuan dari berbagai sumber dalam satu laporan dan program Quality Gates, 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 kontrol penuh atas apa yang terjadi, "ratchet" dapat diimplementasikan secara independen (lihat posting saya sebelumnya tentang topik ini).
Kesimpulan
Sebelum mulai menyiapkan materi ini, saya memutuskan untuk mencari: apakah ada orang yang sudah menulis tentang topik ini di Habré? Saya hanya menemukan wawancara 2017 dengan lany di mana dia mengatakan:
Sejauh yang saya tahu, tidak ada integrasi dengan Jenkins atau plugin pakar [...] Pada prinsipnya, setiap penggemar bisa berteman dengan IDEA Community Edition dan Jenkins, banyak yang akan mendapat manfaat dari ini.
Ya: dua tahun kemudian, kita memiliki Plugin Peringatan NG, dan akhirnya persahabatan ini menjadi kenyataan!