IntelliJ IDEA Inspections را روی جنکینز اجرا کنید

IntelliJ IDEA امروز دارای پیشرفته ترین تحلیلگر کد جاوا استاتیک است که در توانایی های خود "کهنه کار" هایی مانند سبک چک и باگ های نقطه ای. «بازرسی‌های» متعدد آن، کد را در جنبه‌های مختلف، از سبک کدنویسی گرفته تا باگ‌های معمولی، بررسی می‌کند.

با این حال، تا زمانی که نتایج تجزیه و تحلیل فقط در رابط محلی 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 با گزارش نتایج تجزیه و تحلیل در آن ذخیره می شود.

علاوه بر این، انتظار می رود که

  • مسیر جاوا 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>

تصویر تمام شده در داکر هاب موجود است.

قبل از حرکت، بیایید بررسی کنیم که تحلیلگر 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 می تواند تجزیه و تحلیل کند شامل اخطارهایی از کامپایلر جاوا و هشدارهایی از لاگ های اجرایی 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 را روی جنکینز اجرا کنید

به راحتی، این رابط برای همه تحلیلگرهای شناخته شده جهانی است. این شامل یک نمودار تعاملی از توزیع یافته ها بر اساس دسته و نموداری از پویایی تغییرات در تعداد یافته ها است. می توانید یک جستجوی سریع در شبکه در پایین صفحه انجام دهید. تنها چیزی که برای بازرسی های IDEA به درستی کار نمی کرد، امکان مرور کد به طور مستقیم در جنکینز بود (البته برای گزارش های دیگر، به عنوان مثال Checkstyle، این افزونه می تواند این کار را به زیبایی انجام دهد). به نظر می رسد این یک اشکال در تجزیه کننده گزارش IDEA است که باید برطرف شود.

از جمله ویژگی‌های Warnings NG، توانایی جمع‌آوری یافته‌های منابع مختلف در یک گزارش و برنامه‌ریزی Quality Gates، از جمله یک "جغجغه" برای مجموعه مرجع است. برخی از اسناد برنامه نویسی Quality Gates موجود است اینجا - با این حال، کامل نیست و باید به کد منبع نگاه کنید. از سوی دیگر، برای کنترل کامل بر آنچه در حال رخ دادن است، "جغجغه" را می توان به طور مستقل اجرا کرد (به من مراجعه کنید پست قبلی در مورد این موضوع).

نتیجه

قبل از شروع به تهیه این مطالب، تصمیم گرفتم جستجو کنم: آیا کسی قبلاً در مورد این موضوع در Habré نوشته است؟ من فقط پیدا کردم مصاحبه 2017 с تنبلآنجا که می گوید:

تا آنجایی که من می دانم، هیچ ادغام با جنکینز یا پلاگین maven وجود ندارد […] در اصل، هر علاقه مندی می تواند با IDEA Community Edition و Jenkins دوست شود، بسیاری از آنها فقط از این سود می برند.

خب، دو سال بعد ما افزونه Warnings NG را داریم و بالاخره این دوستی به نتیجه رسید!

منبع: www.habr.com

اضافه کردن نظر