تحليل طلبات الدمج في GitLab باستخدام PVS-Studio لـ C #

تحليل طلبات الدمج في GitLab باستخدام PVS-Studio لـ C #
هل تحب GitLab وتكره الحشرات؟ هل تريد تحسين جودة شفرة المصدر الخاصة بك؟ ثم لقد اتيتم الى المكان الصحيح. سنخبرك اليوم بكيفية تكوين محلل PVS-Studio C # للتحقق من طلبات الدمج. تحياتي للجميع وقراءة سعيدة.

استوديو PVS هي أداة لاكتشاف الأخطاء ونقاط الضعف المحتملة في التعليمات البرمجية المصدر للبرامج المكتوبة بلغة C و C ++ و C # و Java. يعمل على أنظمة 64 بت على أنظمة Windows و Linux و macOS. يمكنه تحليل التعليمات البرمجية المصممة لمنصات ARM 32 بت و 64 بت والمضمنة.

بالمناسبة ، لقد أصدرنا PVS-Studio 7.08 ، حيث قمنا بالكثير من الأشياء مثير للاهتمام. على سبيل المثال:

  • محلل C # لنظامي Linux و macOS ؛
  • البرنامج المساعد لراكب.
  • وضع فحص قائمة الملفات الجديدة.

وضع فحص قائمة الملفات

في السابق ، من أجل التحقق من ملفات معينة ، كان من الضروري تمرير ملف .xml مع قائمة من الملفات إلى المحلل اللغوي. ولكن نظرًا لأن هذا ليس ملائمًا للغاية ، فقد أضفنا القدرة على نقل .txt ، مما يبسط الحياة إلى حد كبير.

من أجل التحقق من ملفات معينة ، يجب عليك تحديد العلم --ملفات المصدر (-f) وتمرير .txt بقائمة من الملفات. تبدو هكذا:

pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.json

إذا كنت مهتمًا بإعداد عمليات التحقق من الالتزام أو طلبات السحب ، فيمكنك أيضًا القيام بذلك باستخدام هذا الوضع. سيكون الاختلاف في الحصول على قائمة بالملفات للتحليل وسيعتمد على الأنظمة التي تستخدمها.

التحقق من مبدأ طلب الدمج

الجوهر الرئيسي للفحص هو التأكد من أن المشاكل التي اكتشفها المحلل لا تقع في الدمج رئيسي فرع. أيضًا ، لا نريد تحليل المشروع بأكمله في كل مرة. علاوة على ذلك ، عند دمج الفروع ، لدينا قائمة بالملفات التي تم تغييرها. لذلك ، أقترح إضافة فحص طلب دمج.

هذا ما يبدو عليه طلب الدمج قبل إدخال المحلل الثابت:

تحليل طلبات الدمج في GitLab باستخدام PVS-Studio لـ C #
أي كل الأخطاء التي كانت في الفرع التغييرات، سينتقل إلى الفرع الرئيسي. نظرًا لأننا لا نريد هذا ، نضيف التحليل ، والآن تبدو الدائرة هكذا:

تحليل طلبات الدمج في GitLab باستخدام PVS-Studio لـ C #
تحليل التغييرات 2 وفي حالة عدم وجود أخطاء نقبل طلب الدمج وإلا فإننا نرفضه.

بالمناسبة ، إذا كنت مهتمًا بتحليل الالتزامات وسحب الطلبات لـ C / C ++ ، فيمكنك القراءة عنها. هنا.

GitLab

GitLab هي أداة ويب مفتوحة المصدر لدورة حياة DevOps توفر نظامًا لإدارة مستودع الأكواد لـ Git مع wiki الخاص بها ونظام تتبع الأخطاء وخط أنابيب CI / CD وميزات أخرى.

قبل الشروع في تنفيذ تحليل طلبات الدمج ، تحتاج إلى التسجيل وتحميل مشروعك. إذا كنت لا تعرف كيفية القيام بذلك ، فأقترح статью زميلي.

لاحظ. طريقة إعداد البيئة الموضحة أدناه هي إحدى الطرق الممكنة. الهدف هو إظهار خطوات إعداد البيئة اللازمة للتحليل وتشغيل المحلل. ربما ، في حالتك ، سيكون من الأفضل فصل مراحل إعداد البيئة (إضافة مستودعات ، تثبيت المحلل) والتحليل: على سبيل المثال ، إعداد صور Docker مع البيئة اللازمة واستخدامها ، أو بطريقة أخرى.

لفهم ما سيحدث الآن بشكل أفضل ، أقترح إلقاء نظرة على الرسم التخطيطي التالي:

تحليل طلبات الدمج في GitLab باستخدام PVS-Studio لـ C #
يتطلب المحلل .NET Core SDK 3 للعمل ، لذلك قبل تثبيت المحلل ، تحتاج إلى إضافة مستودعات Microsoft ، والتي سيتم من خلالها تثبيت التبعيات اللازمة للمحلل. إضافة مستودعات Microsoft لتوزيعات Linux المختلفة الموصوفة في الوثيقة ذات الصلة.

لتثبيت PVS-Studio عبر مدير الحزم ، ستحتاج أيضًا إلى إضافة مستودعات PVS-Studio. إضافة مستودعات للتوزيعات المختلفة موصوفة بمزيد من التفصيل في القسم المقابل من الوثائق.

يحتاج المحلل إلى مفتاح ترخيص للعمل. يمكنك الحصول على ترخيص تجريبي من محلل تحميل الصفحة.

لاحظ. يرجى ملاحظة أن وضع التشغيل الموصوف (تحليل طلبات الدمج) يتطلب ترخيص Enterprise. لذلك ، إذا كنت ترغب في تجربة وضع التشغيل هذا ، في حقل "الرسالة" ، لا تنس الإشارة إلى أنك بحاجة إلى ترخيص Enterprise.

في حالة حدوث طلب دمج ، فإننا نحتاج إلى تحليل قائمة الملفات التي تم تغييرها فقط ، وإلا فإننا نحلل جميع الملفات. بعد التحليل ، نحتاج إلى تحويل السجلات إلى التنسيق الذي نحتاجه.

الآن ، مع وجود خوارزمية العمل أمام أعيننا ، يمكننا المضي قدمًا في كتابة السيناريو. للقيام بذلك ، تحتاج إلى تغيير الملف .gitlab-ci.yml أو ، إذا لم يكن موجودًا ، فقم بإنشائه. لإنشائه ، تحتاج إلى النقر فوق اسم مشروعك -> قم بإعداد CI / CD.

تحليل طلبات الدمج في GitLab باستخدام PVS-Studio لـ C #
الآن نحن جاهزون لكتابة السيناريو. لنكتب أولاً الكود الذي سيقوم بتثبيت المحلل وإدخال الترخيص:

before_script:
  - apt-get update && apt-get -y install wget gnupg 

  - apt-get -y install git
  - wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
  - dpkg -i packages-microsoft-prod.deb
  - apt-get update
  - apt-get install apt-transport-https
  - apt-get update
  
  - wget -q -O - https://files.viva64.com/etc/pubkey.txt | apt-key add -
  - wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
  - apt-get update
  - apt-get -y install pvs-studio-dotnet

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
  - dotnet restore "$CI_PROJECT_DIR"/Test/Test.sln

نظرًا لأن التثبيت والتفعيل يجب أن يحدث قبل جميع البرامج النصية الأخرى ، فإننا نستخدم تسمية خاصة before_script. اسمحوا لي أن أشرح هذا الجزء قليلا.

التحضير لتثبيت المحلل:

  - wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
  - dpkg -i packages-microsoft-prod.deb
  - apt-get update
  - apt-get install apt-transport-https
  - apt-get update

إضافة مستودعات PVS-Studio والمحلل:

  - wget -q -O - https://files.viva64.com/etc/pubkey.txt | apt-key add -
  - wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
  - apt-get update
  - apt-get -y install pvs-studio-dotnet

تفعيل الترخيص:

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY

PVS_NAME دولار - اسم المستخدم.

PVS_KEY دولار - مفتاح المنتج.

استعادة تبعيات المشروع حيث CI_PROJECT_DIR دولار - المسار الكامل إلى دليل المشروع:

  - dotnet restore "$CI_PROJECT_DIR"/Path/To/Solution.sln

من أجل التحليل الصحيح ، يجب بناء المشروع بنجاح ، ويجب استعادة تبعياته (على سبيل المثال ، يجب تنزيل حزم NuGet الضرورية).

يمكنك تعيين متغيرات البيئة التي تحتوي على معلومات الترخيص بالنقر فوق الضبط، وبعد - على CI / قرص مضغوط.

تحليل طلبات الدمج في GitLab باستخدام PVS-Studio لـ C #
في النافذة التي تفتح ، ابحث عن العنصر المتغيرات، انقر بزر الماوس الأيمن على الزر وسع وإضافة المتغيرات. يجب أن تكون النتيجة كما يلي:

تحليل طلبات الدمج في GitLab باستخدام PVS-Studio لـ C #
الآن يمكننا الانتقال إلى التحليل. أولاً ، دعنا نضيف نصًا لتحليل كامل. إلى العلم -t تمرير الطريق إلى حل العلم -o اكتب مسار الملف حيث سيتم كتابة نتائج التحليل. نحن مهتمون أيضًا برمز الإرجاع. في هذه الحالة ، نحن مهتمون بإيقاف العمل عندما يحتوي كود الإرجاع على معلومات تفيد بإصدار تحذيرات أثناء التحليل. إليك ما يبدو عليه المقتطف:

job:
  script:
  - exit_code=0
  - pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -o 
PVS-Studio.json || exit_code=$?
  - exit_code=$((($exit_code & 8)/8))
  - if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi

تعمل رموز الإرجاع على مبدأ قناع البت. على سبيل المثال ، إذا تم إصدار تحذيرات نتيجة للتحليل ، فسيكون رمز الإرجاع 8. إذا انتهت صلاحية الترخيص في غضون شهر ، فسيكون رمز الإرجاع 4. إذا تم العثور على أخطاء أثناء التحليل ، والترخيص أيضًا تنتهي الصلاحية في غضون شهر ، في إرجاع الكود ، ستتم كتابة القيمتين: اجمع الأرقام معًا واحصل على رمز الإرجاع النهائي - 8 + 4 = 12. وبالتالي ، من خلال التحقق من البتات المقابلة ، يمكن الحصول على معلومات حول الحالات المختلفة أثناء التحليل. يتم وصف رموز الإرجاع بمزيد من التفصيل في pvs-studio-dotnet (Linux / macOS) قسم رموز الإرجاع في المستند.التحقق من مشاريع Visual Studio / MSBuild / .NET Core من سطر الأوامر باستخدام PVS-Studio".

في هذه الحالة ، نحن مهتمون بجميع رموز الإرجاع حيث تظهر 8.

  - exit_code=$((($exit_code & 8)/8))

سنحصل على 1 عندما يحتوي رمز الإرجاع على جزء من الرقم الذي نهتم به ، وإلا فسنحصل على 0.

حان الوقت لإضافة تحليل طلب الدمج. قبل القيام بذلك ، دعنا نجهز مكانًا للنص. نحتاج إلى تنفيذه فقط عند حدوث طلب دمج. تبدو هكذا:

merge:
  script:
  only:
  - merge_requests

دعنا ننتقل إلى النص نفسه. لقد صادفت حقيقة أن الآلة الافتراضية لا تعرف شيئًا عنها الأصل / السيد. لذلك دعونا نساعدها قليلاً:

  - git fetch origin

الآن نحصل على فرق الفروع ونحفظ النتيجة في TXT ملف:

  - git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt

حيث CI_COMMIT_SHA دولار - تجزئة الالتزام الأخير.

بعد ذلك ، نبدأ تحليل قائمة الملفات باستخدام العلم -f. نقوم بنقل ملف .txt الذي تم استلامه مسبقًا إليه. حسنًا ، بالقياس مع التحليل الكامل ، ننظر إلى رموز الإرجاع:

  - exit_code=0
  - pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f 
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
  - exit_code=$((($exit_code & 8)/8))
  - if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi

سيبدو النص الكامل للتحقق من طلب الدمج كما يلي:

merge:
  script:
  - git fetch origin
  - git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
  - exit_code=0
  - pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f 
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
  - exit_code=$((($exit_code & 8)/8))
  - if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
  only:
  - merge_requests

يبقى فقط لإضافة تحويل السجل بعد عمل جميع البرامج النصية. باستخدام الملصق after_script والمنفعة بلوج المحول:

after_script:
  - plog-converter -t html -o eLog ./PVS-Studio.json

فائدة بلوج المحول هو مشروع مفتوح المصدر يستخدم لتحويل تقرير خطأ المحلل اللغوي إلى أشكال مختلفة مثل HTML. للحصول على وصف أكثر تفصيلاً للأداة ، راجع القسم الفرعي "Plog Converter Utility". القسم المقابل من الوثائق.

بالمناسبة ، إذا كنت تريد العمل بشكل ملائم مع تقرير .json محليًا من IDE ، فأقترح إذن المساعد لـ IDE Rider. تم وصف استخدامه بمزيد من التفصيل في الوثيقة ذات الصلة.

للراحة هنا .gitlab-ci.yml جميع:

image: debian

before_script:
  - apt-get update && apt-get -y install wget gnupg 

  - apt-get -y install git
  - wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
  - dpkg -i packages-microsoft-prod.deb
  - apt-get update
  - apt-get install apt-transport-https
  - apt-get update
  
  - wget -q -O - https://files.viva64.com/etc/pubkey.txt | apt-key add -
  - wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
  - apt-get update
  - apt-get -y install pvs-studio-dotnet

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
  - dotnet restore "$CI_PROJECT_DIR"/Test/Test.sln

merge:
  script:
  - git fetch origin
  - git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
  - exit_code=0
  - pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f 
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
  - exit_code=$((($exit_code & 8)/8))
  - if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
  only:
  - merge_requests

job:
  script:
  - exit_code=0
  - pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -o 
PVS-Studio.json || exit_code=$?
  - exit_code=$((($exit_code & 8)/8))
  - if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
  
after_script:
  - plog-converter -t html -o eLog ./PVS-Studio.json

بمجرد إضافة كل شيء إلى الملف ، انقر فوق الالتزام التغييرات. لمعرفة ما إذا كان كل شيء صحيحًا ، انتقل إلى CI / CD -> خطوط الأنابيب -> الركض. ستفتح نافذة الآلة الافتراضية ، وفي نهايتها يجب أن تكون على النحو التالي:

تحليل طلبات الدمج في GitLab باستخدام PVS-Studio لـ C #
منشار نجح أيوب - النجاح ، كل شيء على ما يرام. الآن يمكنك اختبار ما قمت به.

أمثلة العمل

للحصول على مثال للعمل ، دعنا ننشئ مشروعًا بسيطًا (بتنسيق رئيسي) والتي ستحتوي على عدة ملفات. بعد ذلك ، في فرع آخر ، سنقوم بتغيير ملف واحد فقط ونحاول تقديم طلب دمج.

لنفكر في حالتين: عندما يحتوي الملف المعدل على خطأ وعندما لا يحتوي على خطأ. أولاً ، مثال به خطأ.

لنفترض أن هناك ملفًا في الفرع الرئيسي Program.csالذي لا يحتوي على أخطاء ، وفي فرع آخر أضاف المطور كود خاطئ ويريد تقديم طلب دمج. ما نوع الخطأ الذي ارتكبه ليس مهمًا جدًا ، الشيء الرئيسي هو أنه موجود. على سبيل المثال ، لقد نسيت عامل التشغيل رمي (نعم، ذلك خطأ):

void MyAwesomeMethod(String name)
{
  if (name == null)
    new ArgumentNullException(....);
  // do something
  ....
}

لنلقِ نظرة على نتيجة تحليل مثال به خطأ. أيضًا ، للتأكد من تحليل ملف واحد فقط ، أضفت العلم -r إلى خط البداية pvs-studio-dotnet:

تحليل طلبات الدمج في GitLab باستخدام PVS-Studio لـ C #
نرى أن المحلل وجد خطأ ولم يسمح بدمج الفروع.

دعنا نتحقق من المثال بدون أخطاء. إصلاح الكود:

void MyAwesomeMethod(String name)
{
  if (name == null)
    throw new ArgumentNullException(....);
  // do something
  ....
}

نتائج تحليل طلب الدمج:

تحليل طلبات الدمج في GitLab باستخدام PVS-Studio لـ C #
كما نرى ، لم يتم العثور على أخطاء ، وتم تنفيذ المهمة بنجاح ، وهو ما أردنا التحقق منه.

اختتام

يعد التخلص من الكود السيئ قبل دمج الفروع أمرًا مريحًا وممتعًا للغاية. لذلك ، إذا كنت تستخدم CI / CD ، فحاول تضمين محلل ثابت للتحقق منه. علاوة على ذلك ، يتم ذلك بكل بساطة.

شكرا لكم على اهتمامكم.

تحليل طلبات الدمج في GitLab باستخدام PVS-Studio لـ C #
إذا كنت ترغب في مشاركة هذه المقالة مع جمهور يتحدث الإنجليزية ، فيرجى استخدام رابط الترجمة: نيكولاي ميرونوف. تحليل طلبات الدمج في GitLab باستخدام PVS-Studio لـ C #.

المصدر: www.habr.com

إضافة تعليق