Jenkins üzerinde IntelliJ IDEA denetimlerinin yürütülmesi

IntelliJ IDEA bugün, yetenekleri açısından bu tür "gazileri" geride bırakan en gelişmiş statik Java kod analiz cihazına sahiptir. Kontrol stili и Leke böcekleri. Çok sayıda "denetim", kodu kodlama stilinden tipik hatalara kadar çeşitli yönlerden kontrol eder.

Ancak analiz sonuçları yalnızca geliştiricinin IDE'sinin yerel arayüzünde görüntülendiği sürece geliştirme sürecine pek faydası yoktur. Statik analiz yerine getirilmesi gerekiyor Derleme hattının ilk adımı olarak, sonuçları kalite geçitlerini tanımlamalı ve kalite geçitleri geçilmezse derleme başarısız olmalıdır. TeamCity CI'nın IDEA ile entegre olduğu biliniyor. Ancak TeamCity'yi kullanmasanız bile IDEA denetimlerini başka herhangi bir CI sunucusunda çalıştırmayı kolayca deneyebilirsiniz. IDEA Community Edition, Jenkins ve Warnings NG eklentisini kullanarak bunun nasıl yapılabileceğini görmenizi öneririm.

Adım 1. Analizi konteynerde çalıştırın ve bir rapor alın

İlk bakışta, grafik arayüzü olmayan bir CI sistemi içerisinde IDE (masaüstü uygulaması!) çalıştırma fikri şüpheli ve çok zahmetli görünebilir. Neyse ki IDEA geliştiricileri çalıştırma olanağı sağladı kod biçimlendirme и denetimler komut satırından. Üstelik IDEA'yı bu modda çalıştırmak için bir grafik alt sistemine gerek yoktur ve bu görevler metin kabuğuna sahip sunucularda gerçekleştirilebilir.

Denetimler bir komut dosyası kullanılarak başlatılır bin/inspect.sh IDEA kurulum dizininden. Gerekli parametreler şunlardır:

  • projenin tam yolu (göreceli olanlar desteklenmez),
  • inceleme ayarlarının bulunduğu .xml dosyasının yolu (genellikle projenin içinde .idea/inspectionProfiles/Project_Default.xml konumunda bulunur),
  • Analiz sonuçlarına ilişkin raporların bulunduğu .xml dosyalarının saklanacağı klasörün tam yolu.

Ayrıca, beklenen

  • Java SDK'nın yolu IDE'de yapılandırılacaktır, aksi takdirde analiz çalışmaz. Bu ayarlar yapılandırma dosyasında bulunur jdk.table.xml IDEA genel yapılandırma klasöründe. IDEA genel yapılandırmasının kendisi varsayılan olarak kullanıcının ana dizininde bulunur, ancak bu konum açıkça belirtilebilir dosyada idea.properties.
  • Analiz edilen proje geçerli bir IDEA projesi olmalıdır; bunun için genellikle sürüm kontrolünde göz ardı edilen bazı dosyaları işlemeniz gerekir:
    • .idea/inspectionProfiles/Project_Default.xml — analizör ayarları, bunlar konteynerde incelemeler yapılırken açıkça kullanılacaktır,
    • .idea/modules.xml - aksi takdirde 'Bu proje modül içermiyor' hatasını alırız,
    • .idea/misc.xml - aksi takdirde 'JDK bu proje için doğru şekilde yapılandırılmamış' hatasını alırız,
    • *.iml-файлы — aksi halde modülde yapılandırılmamış bir JDK ile ilgili hata alırız.

Her ne kadar bu dosyalar genellikle .gitignoreörneğin bir dosyanın aksine, belirli bir geliştiricinin ortamına özgü herhangi bir bilgi içermezler. workspace.xml, bu tür bilgilerin bulunduğu yer ve bu nedenle bunu taahhüt etmeye gerek yoktur.

Açık çözüm, JDK'yı IDEA Community Edition ile birlikte analiz edilen projelerde "çekilmeye" hazır bir formda bir kapsayıcıya paketlemektir. Uygun bir temel konteyner seçelim ve Docker dosyamız şu şekilde olacaktır:

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

Seçeneği kullanma idea.config.path IDEA'yı klasörde genel yapılandırmasını aramaya zorladık /etc/idea, çünkü CI'da çalışırken kullanıcının ana klasörü belirsiz bir şeydir ve çoğu zaman tamamen yoktur.

Kaba kopyalanan dosya şöyle görünür: jdk.table.xmlKabın içine kurulu OpenJDK'ye giden yolları içeren (kendi dizininizdeki IDEA ayarlarına sahip benzer bir dosya temel alınabilir):

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>

Bitmiş görüntü Docker Hub'da mevcut.

Devam etmeden önce IDEA analizörünün konteynerde çalıştığını kontrol edelim:

docker run --rm -v <путь/к/вашему/проекту>:/var/project inponomarev/intellij-idea-analyzer

Analiz başarılı bir şekilde çalışmalı ve target/idea_inspections alt klasöründe analizör raporlarını içeren çok sayıda .xml dosyası görünmelidir.

Artık IDEA analizörünün herhangi bir CI ortamında bağımsız olarak çalıştırılabileceğine dair hiçbir şüphe yok ve ikinci adıma geçiyoruz.

2. Adım. Raporu görüntüleyin ve analiz edin

Raporu .xml dosyaları biçiminde almak işin yarısıdır; şimdi onu insanlar tarafından okunabilir hale getirmeniz gerekiyor. Ayrıca sonuçları, kalite kriterlerine göre kabul edilen değişikliğin başarılı olup olmadığını belirleme mantığı olan kalite kapılarında kullanılmalıdır.

Bu bize yardımcı olacaktır Jenkins Uyarıları NG EklentisiOcak 2019'da piyasaya sürüldü. Jenkins'te statik analiz sonuçlarıyla çalışmaya yönelik birçok bireysel eklentinin (CheckStyle, FindBugs, PMD, vb.) ortaya çıkışıyla birlikte artık eski olduğu işaretlendi.

Eklenti iki bölümden oluşuyor:

  • çok sayıda analizör mesaj toplayıcısı (tam listesini AcuCobol'dan ZPT Lint'e kadar bilimin bildiği tüm analizörleri içerir),
  • hepsi için tek bir rapor görüntüleyici.

Warnings NG'nin analiz edebileceği şeylerin listesi, Java derleyicisinden gelen uyarıları ve Maven yürütme günlüklerinden gelen uyarıları içerir: sürekli görünür olmalarına rağmen nadiren özel olarak analiz edilirler. IntelliJ IDEA raporları da tanınan formatlar listesine dahil edilmiştir.

Eklenti yeni olduğundan başlangıçta Jenkins Pipeline ile iyi etkileşime giriyor. Katılımıyla birlikte oluşturma adımı şu şekilde görünecektir (eklentiye hangi rapor formatını tanıdığımızı ve hangi dosyaların taranması gerektiğini söyleriz):

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

Rapor arayüzü şuna benzer:

Jenkins üzerinde IntelliJ IDEA denetimlerinin yürütülmesi

Uygun bir şekilde, bu arayüz tanınmış tüm analizörler için evrenseldir. Buluntuların kategoriye göre dağılımının etkileşimli bir diyagramını ve buluntu sayısındaki değişikliklerin dinamiklerinin bir grafiğini içerir. Sayfanın alt kısmındaki kılavuzda hızlı bir arama yapabilirsiniz. IDEA incelemelerinde düzgün çalışmayan tek şey, koda doğrudan Jenkins'te göz atabilme yeteneğiydi (her ne kadar Checkstyle gibi diğer raporlar için bu eklenti bunu çok güzel yapabiliyorsa da). Bunun IDEA rapor ayrıştırıcısında düzeltilmesi gereken bir hata olduğu anlaşılıyor.

Warnings NG'nin özellikleri arasında, farklı kaynaklardan elde edilen bulguları tek bir raporda toplama yeteneği ve referans düzeneği için bir "mandal" da dahil olmak üzere Quality Gates'i programlayabilme yeteneği yer alır. Bazı Quality Gates programlama belgeleri mevcuttur burada - ancak henüz tamamlanmadı ve kaynak koduna bakmanız gerekiyor. Öte yandan, olup bitenler üzerinde tam kontrol sağlamak için "mandal" bağımsız olarak uygulanabilir (bkz. önceki gün Bu tema hakkında).

Sonuç

Bu materyali hazırlamaya başlamadan önce araştırmaya karar verdim: Habré'de bu konu hakkında daha önce yazan var mı? sadece buldum röportaj 2017 с Lanynerede diyor:

Bildiğim kadarıyla Jenkins ya da maven eklentisi ile entegrasyon yok […] Prensipte her meraklı IDEA Community Edition ve Jenkins ile arkadaş olabilir, pek çoğu bundan yalnızca faydalanır.

İki yıl sonra Warnings NG Eklentisi ortaya çıktı ve sonunda bu dostluk meyvesini verdi!

Kaynak: habr.com

Yorum ekle