لدى IntelliJ IDEA اليوم محلل أكواد جافا الأكثر تقدماً ، والذي ترك قدراته وراءه مثل "قدامى المحاربين" مثل Checkstyle و Spotbugs . تقوم "عمليات التفتيش" الكثيرة بفحص الشفرة في جوانب مختلفة ، بدءًا من نمط الترميز وحتى الأخطاء المميزة.
ومع ذلك ، في حين يتم عرض نتائج التحليل فقط في الواجهة المحلية لمطور 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 مع تقارير حول نتائج التحليل.
بالإضافة إلى ذلك ، من المتوقع أن
- سيقوم IDE بتكوين المسار إلى Java SDK ، وإلا لن يعمل التحليل. توجد هذه الإعدادات في ملف تكوين
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
ملف 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>
الصورة النهائية متاحة على Docker Hub .
قبل الانتقال ، تحقق من بدء محلل IDEA في الحاوية:
docker run --rm -v <///>:/var/project inponomarev/intellij-idea-analyzer
يجب أن ينجح التحليل بنجاح ، ويجب أن تظهر العديد من ملفات .xml التي تحتوي على تقارير محلل في الهدف الفرعي / idea_inspect للمجلد الفرعي.
الآن لم يعد هناك أي شك في أنه يمكن تشغيل IDEA في وضع عدم الاتصال في أي بيئة CI ، ونحن ننتقل إلى الخطوة الثانية.
الخطوة 2. عرض وتحليل التقرير
الحصول على تقرير في شكل ملفات .xml هو نصف المعركة ، والآن تحتاج إلى جعله قابلاً للقراءة البشرية. وأيضًا يجب استخدام نتائجه في بوابات الجودة - منطق تحديد ما إذا كان التغيير المقبول يمر أو لا يمر وفقًا لمعايير الجودة.
هذا سوف يساعدنا Jenkins Warnings NG Plugin ، الذي صدر في يناير 2019. مع ظهوره ، يتم الآن وضع علامة على العديد من المكونات الإضافية الفردية للعمل مع نتائج التحليل الثابت في Jenkins (CheckStyle ، FindBugs ، PMD ، إلخ).
يتكون البرنامج المساعد من جزأين:
- العديد من جامعي رسائل المحلل (تشمل القائمة الكاملة جميع المحللين المعروفين من AcuCobol إلى ZPT Lint) ،
- عارض واحد لهم جميعا.
تتضمن قائمة ما يمكن لتحليلات تحذيرات NG تحذيرات من برنامج التحويل البرمجي لـ Java والتحذيرات من سجلات وقت تشغيل 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')] ) }
تبدو واجهة التقرير كما يلي:

مريح ، هذه الواجهة عالمية لجميع المحللين المعترف بهم. أنه يحتوي على مخطط تفاعلي لتوزيع الاكتشافات حسب الفئة ورسم بياني لديناميات التغييرات في عدد الاكتشافات. في الشبكة في أسفل الصفحة ، يمكنك إجراء بحث سريع. الشيء الوحيد الذي لم تعمل IDEA بشكل صحيح لعمليات التفتيش هو القدرة على تصفح الكود مباشرة في جنكينز (على الرغم من أن التقارير الأخرى ، مثل Checkstyle ، يمكن لهذا البرنامج المساعد القيام بهذا بشكل جميل). هذا يبدو أن تقرير محلل تقرير IDEA لإصلاح.
من بين قدرات Warnings NG القدرة على تجميع النتائج من مصادر مختلفة في تقرير واحد وبرنامج جيتس للجودة ، بما في ذلك مجموعة اسئلة للتجميع المرجعي. تتوفر بعض وثائق برمجة Quality Gates هنا - ومع ذلك ، فهي غير كاملة ، وعليك إلقاء نظرة على المصدر. من ناحية أخرى ، من أجل السيطرة الكاملة على ما يحدث ، يمكن تنفيذ "السقاطة" بشكل مستقل (انظر مشاركتي السابقة حول هذا الموضوع).
استنتاج
قبل البدء في إعداد هذه المادة ، قررت البحث: هل قام أحد بالفعل بكتابة هذا الموضوع في حبري؟ لقد وجدت فقط مقابلة 2017 مع lany حيث يقول:
حسب علمي ، لا يوجد أي تكامل مع Jenkins أو البرنامج المساعد maven [...] من حيث المبدأ ، يمكن لأي متحمس تكوين صداقات IDEA Community Edition و Jenkins ، سيستفيد الكثيرون من هذا.
حسنًا: بعد عامين ، أصبح لدينا تحذيرات NG Plugin ، وأخيراً أصبحت هذه الصداقة حقيقية!