
GitLab سان پيار ڪريو ٿا پر غلطين کان نفرت ڪريو ٿا؟ ڇا توهان پنهنجي سورس ڪوڊ جي معيار کي بهتر بڻائڻ چاهيو ٿا؟ پوءِ توهان صحيح جاءِ تي آيا آهيو. اڄ اسين وضاحت ڪنداسين ته PVS-Studio C# اينالائيزر کي ضم ڪرڻ جي درخواستن کي چيڪ ڪرڻ لاءِ ڪيئن ترتيب ڏيو. هڪ يونيڪارن جهڙو موڊ رکو ۽ مزو وٺو.
— C، C++، C#، ۽ جاوا ۾ لکيل پروگرامن جي سورس ڪوڊ ۾ غلطين ۽ امڪاني ڪمزورين جي سڃاڻپ لاءِ هڪ اوزار آهي. اهو 64-بٽ سسٽم تي هلندو آهي. Windows, Linux и macOSاهو 32-bit، 64-bit، ۽ ايمبيڊڊ ARM پليٽ فارمن کي نشانو بڻائيندڙ ڪوڊ جو تجزيو ڪري سگهي ٿو.
رستي ۾، اسان PVS-Studio 7.08 جاري ڪيو، جنهن ۾ اسان گهڻو ڪجهه ڪيو. . مثال طور
- سي # تجزيه نگار هيٺ Linux и macOS;
- رائيڊر لاءِ پلگ ان؛
- نئين فائل لسٽ چيڪنگ موڊ.
فائل لسٽ چيڪنگ موڊ
اڳي، مخصوص فائلن کي چيڪ ڪرڻ لاءِ، توهان کي اينالائيزر کي فائل لسٽ تي مشتمل هڪ .xml فائل پاس ڪرڻي پوندي هئي. جڏهن ته، جيئن ته اهو تمام آسان نه هو، اسان هڪ .txt فائل پاس ڪرڻ جي صلاحيت شامل ڪئي آهي، جيڪا شين کي تمام آسان بڻائي ٿي.
مخصوص فائلن کي چيڪ ڪرڻ لاءِ، توهان کي هڪ پرچم بيان ڪرڻ جي ضرورت آهي —ذريعو فائلون (-f) ۽ فائلن جي فهرست سان هڪ .txt فائل منتقل ڪريو. اهو هن طرح نظر اچي ٿو:
pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.jsonجيڪڏهن توهان ڪمٽس يا پل درخواستن جي جائزي کي ترتيب ڏيڻ ۾ دلچسپي رکو ٿا، ته توهان هن موڊ کي استعمال ڪندي اهو پڻ ڪري سگهو ٿا. فرق تجزيو ڪرڻ لاءِ فائلن جي فهرست ۾ هوندو، ۽ اهو توهان جي استعمال ڪيل سسٽم تي منحصر هوندو.
درخواست جي تصديق جي اصول کي ضم ڪريو
چيڪ جو مکيه نقطو اهو يقيني بڻائڻ آهي ته تجزيه نگار پاران معلوم ڪيل مسئلا ضم ۾ نه اچن. رکن ٿا برانچ. اسان هر ڀيري پوري منصوبي جو تجزيو ڪرڻ نٿا چاهيون. خاص طور تي جڏهن شاخن کي ضم ڪيو ويندو آهي، اسان وٽ تبديل ٿيل فائلن جي هڪ فهرست هوندي آهي. تنهن ڪري، مان هڪ ضم درخواست چيڪ شامل ڪرڻ جي تجويز پيش ڪريان ٿو.
جامد تجزيي نگار کي لاڳو ڪرڻ کان اڳ ضم جي درخواست هن طرح نظر ايندي آهي:

يعني، اهي سڀئي غلطيون جيڪي برانچ ۾ هيون تبديليون، ماسٽر برانچ ڏانهن منتقل ڪيو ويندو. جيئن ته اسان هي نٿا چاهيون، اسان هڪ تجزيو شامل ڪريون ٿا، ۽ هاڻي ڊاگرام هن طرح نظر اچي ٿو:

اسان تجزيو ڪريون ٿا تبديليون 2 ۽ جيڪڏهن ڪا به غلطي نه آهي، ته اسان ضم جي درخواست قبول ڪندا آهيون، ٻي صورت ۾ اسان ان کي رد ڪندا آهيون.
رستي ۾، جيڪڏهن توهان C/C++ لاءِ ڪمٽس ۽ پل درخواستن جو تجزيو ڪرڻ ۾ دلچسپي رکو ٿا، ته توهان ان بابت پڙهي سگهو ٿا. .
GitLab
— هڪ اوپن سورس ويب تي ٻڌل DevOps لائف سائيڪل ٽول جيڪو Git لاءِ ڪوڊ ريپوزٽري مئنيجمينٽ سسٽم فراهم ڪري ٿو ان جي پنهنجي وڪي، مسئلي جي ٽريڪنگ سسٽم، CI/CD پائپ لائن، ۽ ٻين خاصيتن سان.
ضم جي درخواستن جو تجزيو شروع ڪرڻ کان اڳ، توهان کي پنهنجي منصوبي کي رجسٽر ڪرڻ ۽ اپلوڊ ڪرڻ جي ضرورت آهي. جيڪڏهن توهان کي خبر ناهي ته اهو ڪيئن ڪجي، مان صلاح ڏيان ٿو منهنجو ساٿي.
ويچاريهيٺ بيان ڪيل ماحول جي سيٽ اپ جو طريقو هڪ ممڪن طريقو آهي. مقصد تجزيو لاءِ گهربل ماحول کي ترتيب ڏيڻ ۽ تجزيي کي هلائڻ لاءِ قدمن جو مظاهرو ڪرڻ آهي. شايد، توهان جي صورت ۾، ماحول جي تياري جي مرحلن (ذخيرن کي شامل ڪرڻ، تجزيي کي نصب ڪرڻ) ۽ تجزيي کي الڳ ڪرڻ وڌيڪ بهتر هوندو: مثال طور، گهربل ماحول سان ڊاڪر تصويرون تيار ڪرڻ ۽ انهن کي استعمال ڪرڻ، يا ڪو ٻيو طريقو.
بهتر سمجهڻ لاءِ ته ڇا ٿيڻ وارو آهي، مان صلاح ڏيان ٿو ته توهان هيٺ ڏنل ڊاگرام ڏسو:

تجزيي نگار کي .NET ڪور SDK 3 جي ضرورت آهي، تنهن ڪري تجزيي نگار کي انسٽال ڪرڻ کان اڳ، توهان کي Microsoft ريپوزٽريز شامل ڪرڻ جي ضرورت آهي جتان تجزيي نگار جي انحصار کي نصب ڪيو ويندو. مختلف تقسيم لاءِ Microsoft ريپوزٽريز شامل ڪرڻ. Linux .
پيڪيج مئنيجر ذريعي PVS-Studio انسٽال ڪرڻ لاءِ، توهان کي PVS-Studio ريپوزٽريز کي به شامل ڪرڻ جي ضرورت پوندي. مختلف ورڇن لاءِ ريپوزٽريز شامل ڪرڻ کي وڌيڪ تفصيل سان بيان ڪيو ويو آهي .
تجزيي نگار کي هلائڻ لاءِ لائسنس ڪي جي ضرورت آهي. توهان آزمائشي لائسنس هتي حاصل ڪري سگهو ٿا .
ويچاريمهرباني ڪري نوٽ ڪريو ته بيان ڪيل موڊ (ضم ڪرڻ جي درخواستن جو تجزيو ڪرڻ) لاءِ انٽرپرائز لائسنس جي ضرورت آهي. تنهن ڪري، جيڪڏهن توهان هن موڊ کي آزمائڻ چاهيو ٿا، ته مهرباني ڪري "پيغام" جي ميدان ۾ اهو بيان ڪرڻ جي پڪ ڪريو ته توهان کي انٽرپرائز لائسنس جي ضرورت آهي.
جيڪڏهن ضم ڪرڻ جي درخواست ٿئي ٿي، ته اسان کي صرف تبديل ٿيل فائلن جي فهرست جو تجزيو ڪرڻ جي ضرورت آهي؛ ٻي صورت ۾، اسان سڀني فائلن جو تجزيو ڪندا آهيون. تجزيو کان پوءِ، اسان کي لاگ کي گهربل فارميٽ ۾ تبديل ڪرڻ جي ضرورت آهي.
هاڻي جڏهن ته اسان جي سامهون ڪم ڪندڙ الگورتھم آهي، اسان اسڪرپٽ لکڻ ڏانهن اڳتي وڌي سگهون ٿا. اهو ڪرڻ لاءِ، اسان کي فائل کي تبديل ڪرڻ جي ضرورت آهي. gitlab-ci.yml يا، جيڪڏهن اهو موجود ناهي، ته هڪ ٺاهيو. هڪ ٺاهڻ لاءِ، پنهنجي منصوبي جي نالي تي ڪلڪ ڪريو -> سي آءِ/سي ڊي سيٽ اپ ڪريو.

هاڻي اسان اسڪرپٽ لکڻ لاءِ تيار آهيون. اچو ته پهريان ڪوڊ لکون جيڪو اينالائيزر انسٽال ڪندو ۽ لائسنس داخل ڪندو:
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جيئن ته انسٽاليشن ۽ چالو ٿيڻ ٻين سڀني اسڪرپٽن کان اڳ ٿيڻ گهرجي، اسان هڪ خاص ليبل استعمال ڪندا آهيون. اڳ_اسڪرپٽمون کي هن ٽڪري جي ٿوري وضاحت ڪرڻ ڏيو.
تجزيي جي انسٽاليشن جي تياري:
- 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 updatePVS-اسٽوڊيو ۽ تجزيي نگار ذخيرا شامل ڪرڻ:
- 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/CD.

کُليل ونڊو ۾، اسان کي شيءِ ملندي آهي مختلف، ساڄي پاسي واري بٽڻ تي ڪلڪ ڪريو وڌايو ۽ متغير شامل ڪريو. نتيجو هن طرح نظر اچڻ گهرجي:

هاڻي اسان تجزيي ڏانهن اڳتي وڌي سگهون ٿا. پهرين، اچو ته مڪمل تجزيي لاءِ هڪ اسڪرپٽ شامل ڪريون. پرچم ۾ -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)" دستاويز "".
هن صورت ۾، اسان سڀني ريٽرن ڪوڊس ۾ دلچسپي رکون ٿا جن ۾ 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:
- plog-converter -t html -o eLog ./PVS-Studio.jsonافاديت — هڪ اوپن سورس پروجيڪٽ آهي جيڪو پارسر ايرر رپورٽن کي مختلف فارميٽ ۾ تبديل ڪرڻ لاءِ استعمال ڪيو ويندو آهي، جهڙوڪ HTML. يوٽيلٽي جي وڌيڪ تفصيلي وضاحت "پلاگ ڪنورٽر يوٽيلٽي" سب سيڪشن ۾ ڏني وئي آهي. .
رستي ۾، جيڪڏهن توهان IDE مان مقامي طور تي .json رپورٽ سان آساني سان ڪم ڪرڻ چاهيو ٿا، ته مان صلاح ڏيان ٿو ته اسان جو IDE رائيڊر لاءِ. ان جي استعمال کي وڌيڪ تفصيل سان بيان ڪيو ويو آهي .
سهولت لاءِ، هتي آهي 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 -> پوسٽون -> ڊوڙندوهڪ ورچوئل مشين ونڊو کلي ويندي، جنهن جي آخر ۾ توهان کي هيٺ ڏنل ڏسڻ گهرجي:

اسان ڏٺو نوڪري ڪامياب ٿي وئي. - ڪاميابي، سڀ ڪجهه شاندار آهي. هاڻي اسان جانچ ڪري سگهون ٿا ته اسان ڇا ڪيو آهي.
ڪم جا مثال
ڪم کي واضح ڪرڻ لاءِ، اچو ته هڪ سادو منصوبو ٺاهيون (۾ رکن ٿا) جنهن ۾ ڪيتريون ئي فائلون هونديون. ان کان پوءِ، ٻئي برانچ تي، اسان صرف هڪ فائل تبديل ڪنداسين ۽ ضم ڪرڻ جي درخواست ڪرڻ جي ڪوشش ڪنداسين.
اچو ته ٻن ڪيسن تي غور ڪريون: هڪ جنهن ۾ تبديل ٿيل فائل ۾ غلطي آهي ۽ ٻيو جنهن ۾ اها ناهي. پهريون، هڪ غلطي سان هڪ مثال.
فرض ڪريو ته ماسٽر برانچ ۾ هڪ فائل آهي. پروگرام.سي.ايس.، جنهن ۾ ڪا به غلطي ناهي، ۽ ٻي برانچ ۾، هڪ ڊولپر غلط ڪوڊ شامل ڪيو آهي ۽ ضم جي درخواست ڪرڻ چاهي ٿو. صحيح غلطي ايتري اهم ناهي، بنيادي ڳالهه اها آهي ته اها موجود آهي. مثال طور، اهي هڪ آپريٽر وساري ويٺا. ڌوڙ (ها، ):
void MyAwesomeMethod(String name)
{
if (name == null)
new ArgumentNullException(....);
// do something
....
}اچو ته غلطي سان مثال جي تجزيو جي نتيجي تي نظر وجهون. انهي سان گڏ، اهو يقيني بڻائڻ لاءِ ته صرف هڪ فائل جو تجزيو ڪيو ويو، مون هڪ جھنڊو شامل ڪيو. -r پي وي ايس-اسٽوڊيو-ڊاٽ نيٽ لانچ لائن ۾:

اسان ڏسون ٿا ته تجزيه نگار هڪ غلطي ڳولي لڌي ۽ شاخن کي ضم ڪرڻ جي اجازت نه ڏني.
اچو ته غلطي کان سواءِ مثال کي چيڪ ڪريون. ڪوڊ کي درست ڪريو:
void MyAwesomeMethod(String name)
{
if (name == null)
throw new ArgumentNullException(....);
// do something
....
}ضم جي درخواست جي تجزيي جا نتيجا:

جيئن اسان ڏسي سگهون ٿا، ڪابه غلطي نه ملي، ۽ ڪم ڪاميابي سان مڪمل ڪيو ويو، جيڪو اسان چيڪ ڪرڻ چاهيون ٿا.
ٿڪل
شاخن کي ضم ڪرڻ کان اڳ خراب ڪوڊ کي ختم ڪرڻ تمام آسان ۽ مزيدار آهي. تنهن ڪري، جيڪڏهن توهان CI/CD استعمال ڪندا آهيو، ته چيڪنگ لاءِ هڪ جامد تجزيه نگار کي ضم ڪرڻ جي ڪوشش ڪريو. خاص طور تي ڇاڪاڻ ته اهو ڪافي سادو آهي.
توهان جي ڌيان لاء توهان جي مهرباني.
جيڪڏهن توهان هن مضمون کي انگريزي ڳالهائيندڙ سامعين سان شيئر ڪرڻ چاهيو ٿا، ته مهرباني ڪري ترجمي جي لنڪ استعمال ڪريو: نڪولائي ميرونوف. .
جو ذريعو: www.habr.com
