Kuwunika kwa kuphatikiza zopempha mu GitLab pogwiritsa ntchito PVS-Studio ya C #

Kuwunika kwa kuphatikiza zopempha mu GitLab pogwiritsa ntchito PVS-Studio ya C #
Mumakonda GitLab ndikudana ndi nsikidzi? Mukufuna kuwongolera mtundu wa khodi yanu? Ndiye mwafika pamalo oyenera. Lero tikuwuzani momwe mungasinthire PVS-Studio C # analyzer kuti muwone kuphatikiza zopempha. Khalani ndi malingaliro a unicorn komanso kuwerenga kosangalatsa kwa aliyense.

Zithunzi za PVS Studio ndi chida chodziwira zolakwika ndi zofooka zomwe zingachitike mu code source ya mapulogalamu olembedwa mu C, C++, C# ndi Java. Imagwira pamakina a 64-bit pa Windows, Linux ndi macOS. Itha kusanthula khodi yopangidwira 32-bit, 64-bit ndi nsanja za ARM zophatikizidwa.

Mwa njira, tinatulutsa PVS-Studio 7.08, momwe tidachita zinthu zambiri chidwi. Mwachitsanzo:

  • C # analyzer ya Linux ndi macOS;
  • pulogalamu yowonjezera kwa Rider;
  • new file cheke mode.

Mawonekedwe a mndandanda wamafayilo

M'mbuyomu, kuti muwone mafayilo ena, kunali kofunikira kupititsa .xml ndi mndandanda wa mafayilo ku analyzer. Koma popeza izi sizothandiza kwambiri, tawonjezera luso losamutsa .txt, zomwe zimapangitsa moyo kukhala wosavuta.

Kuti muwone mafayilo enieni, muyenera kufotokoza mbendera --sourceFiles (-f) ndi kusamutsa .txt ndi mndandanda wamafayilo. Zikuwoneka motere:

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

Ngati mukufuna kukhazikitsa cheke kapena kukokera zopempha, mutha kuchita izi pogwiritsa ntchito njirayi. Kusiyana kudzakhala pakupeza mndandanda wa mafayilo oti muwunike ndipo zimadalira machitidwe omwe mukugwiritsa ntchito.

Mfundo yowunikira pempho la kuphatikiza

Chofunikira chachikulu cha cheke ndikuwonetsetsa kuti zovuta zomwe zimawonedwa ndi analyzer pakuphatikiza sizigwera mu mbuye nthambi. Sitikufunanso kusanthula ntchito yonse nthawi zonse. Komanso, pophatikiza nthambi, tili ndi mndandanda wa mafayilo osinthidwa. Chifukwa chake, ndikupangira kuwonjezera cheke chofunsira chophatikiza.

Umu ndi momwe pempho lophatikiza likuwonekera musanagwiritse ntchito static analyzer:

Kuwunika kwa kuphatikiza zopempha mu GitLab pogwiritsa ntchito PVS-Studio ya C #
Ndiko kuti, zolakwika zonse zomwe zinali munthambi Kusintha, adzasamukira ku nthambi ya master. Popeza sitingafune izi, timawonjezera kusanthula, ndipo tsopano chithunzichi chikuwoneka motere:

Kuwunika kwa kuphatikiza zopempha mu GitLab pogwiritsa ntchito PVS-Studio ya C #
Timasanthula kusintha2 ndipo, ngati palibe zolakwika, timavomereza pempho la kuphatikiza, apo ayi tikukana.

Mwa njira, ngati mukufuna kusanthula zomwe mukufuna kuchita ndikukoka zopempha za C/C ++, mutha kuwerenga za izi. apa.

GitLab

GitLab ndi chida chotseguka chapaintaneti cha DevOps chomwe chimapereka kasamalidwe ka code repository kwa Git yokhala ndi wiki yake, njira yolondolera nkhani, mapaipi a CI/CD ndi zina.

Musanayambe kusanthula zopempha zophatikiza, muyenera kulembetsa ndikukweza polojekiti yanu. Ngati simukudziwa momwe mungachitire izi, ndiye ndikupangira nkhani mnzanga.

ndemanga. Njira yokhazikitsira chilengedwe yomwe yafotokozedwa pansipa ndi imodzi mwazomwe zingatheke. Cholinga chake ndikuwonetsa njira zokhazikitsira chilengedwe chofunikira pakuwunika ndikuyambitsa analyzer. Mwinanso kwa inu zingakhale bwino kwambiri kuti mulekanitse magawo okonzekera chilengedwe (kuwonjezera nkhokwe, kukhazikitsa analyzer) ndi kusanthula: mwachitsanzo, kukonzekera zithunzi za Docker ndi malo ofunikira ndikuzigwiritsa ntchito, kapena njira ina.

Kuti mumvetsetse bwino zomwe zichitike tsopano, ndikupangira kuyang'ana chithunzichi:

Kuwunika kwa kuphatikiza zopempha mu GitLab pogwiritsa ntchito PVS-Studio ya C #
The analyzer imafuna .NET Core SDK 3 kuti igwire ntchito, kotero musanayike analyzer muyenera kuwonjezera zolemba za Microsoft zomwe zodalira zomwe zimafunikira kwa analyzer zidzayikidwa. Kuwonjezera nkhokwe za Microsoft pazogawa zosiyanasiyana za Linux zofotokozedwa m'chikalata chofanana.

Kuti muyike PVS-Studio kudzera mwa woyang'anira phukusi, mudzafunikanso kuwonjezera zosungira za PVS-Studio. Kuwonjezera nkhokwe kwa magawidwe osiyanasiyana akufotokozedwa mwatsatanetsatane mu gawo lofunikira la zolembedwa.

Analyzer amafunikira kiyi ya laisensi kuti agwire ntchito. Mutha kupeza chilolezo choyeserera pa tsamba lotsitsa la analyzer.

ndemanga. Chonde dziwani kuti njira yofotokozedwera (kuwunika kwa zopempha zophatikizira) imafuna laisensi ya Enterprise. Choncho, ngati mukufuna kuyesa akafuna ntchito, musaiwale kusonyeza mu "Uthenga" kumunda kuti muyenera Enterprise chilolezo.

Ngati pempho lophatikizana lichitika, ndiye kuti timangofunikira kusanthula mndandanda wamafayilo osinthidwa, apo ayi timasanthula mafayilo onse. Pambuyo pofufuza, tiyenera kusintha zipikazo kukhala mawonekedwe omwe tikufuna.

Tsopano, pokhala ndi ndondomeko ya ntchito pamaso panu, mukhoza kupita patsogolo polemba script. Kuti muchite izi, muyenera kusintha fayilo .gitlab-ci.yml kapena ngati kulibe, lengani. Kuti mupange, muyenera dinani dzina la polojekiti yanu -> Konzani CI/CD.

Kuwunika kwa kuphatikiza zopempha mu GitLab pogwiritsa ntchito PVS-Studio ya C #
Tsopano ndife okonzeka kulemba script. Tiyeni tilembe kaye kachidindo komwe kakhazikitse analyzer ndikulowetsa chilolezo:

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

Popeza kukhazikitsa ndi kutsegula kuyenera kuchitika zolemba zina zonse zisanachitike, timagwiritsa ntchito chizindikiro chapadera pamaso_script. Ndiroleni ndifotokoze pang'ono kachidutswachi.

Kukonzekera kukhazikitsa analyzer:

  - 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

Kuwonjezera PVS-Studio repositories ndi analyzer:

  - 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

Kutsegula kwa chilolezo:

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY

$PVS_NAME - Dzina lolowera.

$PVS_KEY - fungulo lazinthu.

Kubwezeretsa zodalira polojekiti komwe $CI_PROJECT_DIR - njira yonse yopita ku chikwatu cha polojekiti:

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

Kuti muwunike bwino, pulojekitiyi iyenera kumangidwa bwino, ndipo kudalira kwake kuyenera kubwezeretsedwanso (mwachitsanzo, phukusi lofunikira la NuGet liyenera kutsitsidwa).

Mutha kukhazikitsa zosintha zachilengedwe zomwe zili ndi chidziwitso cha laisensi podina kolowera, ndipo pambuyo pake CI/CD.

Kuwunika kwa kuphatikiza zopempha mu GitLab pogwiritsa ntchito PVS-Studio ya C #
Pazenera lomwe limatsegulidwa, pezani chinthucho Zosiyanasiyana, dinani batani lakumanja Lonjezani ndi kuwonjezera zosintha. Chotsatiracho chiyenera kuwoneka motere:

Kuwunika kwa kuphatikiza zopempha mu GitLab pogwiritsa ntchito PVS-Studio ya C #
Tsopano mutha kupitilira kusanthula. Choyamba, tiyeni tiwonjezere script kuti tiwunikenso kwathunthu. Ku mbendera -t timadutsa njira yopita ku yankho la mbendera -o lembani njira yopita ku fayilo yomwe zotsatira zowunikira zidzalembedwera. Tilinso ndi chidwi ndi code yobwereza. Pachifukwa ichi, tili ndi chidwi ndi ntchito yoyimitsa pamene code yobwereza ili ndi chidziwitso chomwe machenjezo adaperekedwa panthawi yowunikira. Izi ndi zomwe chidutswa ichi chikuwoneka:

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

Kubwezera zizindikiro ntchito pa mfundo ya pang'ono chigoba. Mwachitsanzo, ngati machenjezo adaperekedwa chifukwa cha kusanthula, ndiye kuti code yobwereza idzakhala yofanana ndi 8. Ngati chilolezocho chitatha mwezi umodzi, ndiye kuti code yobwereza idzakhala yofanana ndi 4. Ngati zolakwika zinadziwika panthawi ya kusanthula, ndipo chiphasocho chimatha mkati mwa mwezi umodzi, nambala yobwereranso, zonse ziwiri zidzalembedwa: onjezani manambala pamodzi ndikupeza nambala yomaliza yobwereza - 8+4=12. Chifukwa chake, poyang'ana ma bits ofananira, zidziwitso zamayiko osiyanasiyana zitha kupezeka pakuwunika. Makhodi obwelera akufotokozedwa mwatsatanetsatane mu gawo la "pvs-studio-dotnet (Linux / macOS) Return Codes" lachikalatacho "Kuyang'ana Visual Studio / MSBuild / .NET Core mapulojekiti kuchokera pamzere wamalamulo pogwiritsa ntchito PVS-Studio".

Pankhaniyi, tili ndi chidwi ndi zizindikiro zonse zobwerera kumene 8 ikuwonekera.

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

Tidzalandira 1 pomwe nambala yobwereza ili ndi nambala yomwe tikufuna, apo ayi tidzalandira 0.

Yakwana nthawi yoti muwonjezere kusanthula kwa pempho lophatikiza. Tisanachite izi, tiyeni tikonze malo a script. Tiyenera kuchitidwa pokhapokha pempho lophatikizana lichitika. Zikuwoneka motere:

merge:
  script:
  only:
  - merge_requests

Tiyeni tipite ku script yokha. Ndinayang'anizana ndi mfundo yakuti makina enieni sakudziwa kalikonse chiyambi/mbuye. Ndiye tiyeni timuthandize pang'ono:

  - git fetch origin

Tsopano timapeza kusiyana pakati pa nthambi ndikusunga zotsatira txt wapamwamba:

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

Kumeneko $CI_COMMIT_SHA - Hash ya kudzipereka komaliza.

Kenako, timayamba kusanthula mndandanda wa mafayilo pogwiritsa ntchito mbendera -f. Timasamutsa fayilo yomwe idalandiridwa kale ya .txt kupitako. Chabwino, pofanizira ndi kusanthula kwathunthu, timayang'ana ma code obwerera:

  - 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

Zolemba zonse zowunikira pempho la kuphatikiza ziziwoneka motere:

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

Chotsalira ndikuwonjezera kutembenuka kwa chipika pambuyo poti zolemba zonse zakonzedwa. Timagwiritsa ntchito chizindikirocho pambuyo_script ndi zothandiza pulagi-otembenuza:

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

Zothandiza pulagi-otembenuza ndi pulojekiti yotseguka yomwe imagwiritsidwa ntchito kutembenuza malipoti olakwika a anthu ena kukhala mitundu yosiyanasiyana, monga HTML. Kufotokozera mwatsatanetsatane za kugwiritsidwa ntchito kwaperekedwa mundime "Plog Converter Utility" gawo lofunikira la zolembedwa.

Mwa njira, ngati mukufuna kugwira ntchito ndi .json malipoti kwanuko kuchokera ku IDE, ndiye ndikupangira zathu. plugin kwa IDE Rider. Kugwiritsa ntchito kwake kumafotokozedwa mwatsatanetsatane mu chikalata choyenera.

Kuti zikhale zosavuta, ndi izi .gitlab-ci.yml kwathunthu:

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

Mukangowonjezera zonse ku fayilo, dinani Chitani zosintha. Kuti muwone kuti zonse zili zolondola, pitani CI/CD -> Mabomba -> akuthamanga. Zenera la makina enieni lidzatsegulidwa, pamapeto pake payenera kukhala zotsatirazi:

Kuwunika kwa kuphatikiza zopempha mu GitLab pogwiritsa ntchito PVS-Studio ya C #
anaona Yobu anapambana - kupambana, zonse zili bwino. Tsopano mutha kuyesa zomwe mwachita.

Zitsanzo za ntchito

Mwachitsanzo, tiyeni tipange pulojekiti yosavuta (in mbuye) omwe azikhala ndi mafayilo angapo. Pambuyo pake, munthambi ina tidzasintha fayilo imodzi yokha ndikuyesera kupanga pempho lophatikizana.

Tiyeni tiganizire milandu iwiri: pamene fayilo yosinthidwa ili ndi zolakwika komanso pamene ilibe. Choyamba, chitsanzo ndi cholakwika.

Tiyerekeze kuti pali fayilo munthambi ya master Pulogalamu.cs, yomwe ilibe zolakwika, koma munthambi ina wopanga adawonjezera nambala yolakwika ndipo akufuna kupanga pempho lophatikiza. Kulakwitsa kotani komwe adapanga sikofunikira kwambiri, chachikulu ndikuti kulipo. Mwachitsanzo, woyendetsa anayiwala kuponyera (Iya, zolakwika kwambiri):

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

Tiyeni tiwone zotsatira za kusanthula chitsanzo ndi cholakwika. Komanso kuti ndiwonetsetse kuti fayilo imodzi yokha yagawidwa, ndinawonjezera mbendera -r ku mzere wotsegulira pvs-studio-dotnet:

Kuwunika kwa kuphatikiza zopempha mu GitLab pogwiritsa ntchito PVS-Studio ya C #
Tikuwona kuti wosanthula adapeza cholakwika ndipo sanalole kuphatikiza nthambi.

Tiyeni tione chitsanzo popanda cholakwika. Kukonza kodi:

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

Gwirizanitsani zotsatira zowunikira:

Kuwunika kwa kuphatikiza zopempha mu GitLab pogwiritsa ntchito PVS-Studio ya C #
Monga tikuonera, palibe zolakwa zomwe zinapezeka, ndipo ntchitoyo idapambana, zomwe ndi zomwe tinkafuna kufufuza.

Pomaliza

Kuchotsa malamulo oyipa musanaphatikize nthambi ndikosavuta komanso kosangalatsa. Chifukwa chake ngati mukugwiritsa ntchito CI/CD, yesani kuyika static analyzer kuti muwone. Komanso, izi zimachitika mosavuta.

Zikomo chifukwa tcheru chanu.

Kuwunika kwa kuphatikiza zopempha mu GitLab pogwiritsa ntchito PVS-Studio ya C #
Ngati mukufuna kugawana nkhaniyi ndi omvera olankhula Chingerezi, chonde gwiritsani ntchito ulalo womasulira: Nikolay Mironov. Kuwunika kwa kuphatikiza zopempha mu GitLab pogwiritsa ntchito PVS-Studio ya C #.

Source: www.habr.com

Kuwonjezera ndemanga