GitLabi liitmistaotluste analüüs, kasutades PVS-Studio for C#

GitLabi liitmistaotluste analüüs, kasutades PVS-Studio for C#
Armastad GitLabi ja vihkad vigu? Kas soovite oma lähtekoodi kvaliteeti parandada? Siis olete jõudnud õigesse kohta. Täna räägime teile, kuidas konfigureerida PVS-Studio C# analüsaatorit ühendamistaotluste kontrollimiseks. Ükssarviku meeleolu ja mõnusat lugemist kõigile.

PVS-stuudio on tööriist C, C++, C# ja Java keeles kirjutatud programmide lähtekoodi vigade ja võimalike haavatavuste tuvastamiseks. Töötab 64-bitistes süsteemides Windowsis, Linuxis ja macOS-is. Oskab analüüsida 32-bitistele, 64-bitistele ja manustatud ARM-platvormidele mõeldud koodi.

Muide, andsime välja PVS-Studio 7.08, milles tegime palju asju huvitav. Näiteks:

  • C# analüsaator Linuxi ja macOS-i jaoks;
  • Rideri pistikprogramm;
  • uue faililoendi kontrollimise režiim.

Failide loendi kontrollimise režiim

Varem oli teatud failide kontrollimiseks vaja analüsaatorisse edastada failide nimekirjaga .xml. Aga kuna see pole eriti mugav, oleme lisanud .txt edastamise võimaluse, mis teeb elu väga lihtsaks.

Konkreetsete failide kontrollimiseks peate määrama lipu --allikafailid (-f) ja teisaldage .txt koos failide loendiga. See näeb välja selline:

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

Kui olete huvitatud kohustuste kontrollimise või tõmbamistaotluste seadistamisest, saate seda teha ka selles režiimis. Erinevus seisneb analüüsitavate failide loendi hankimises ja see sõltub sellest, milliseid süsteeme te kasutate.

Ühinemistaotluse kontrollimise põhimõte

Kontrollimise põhiolemus on tagada, et analüsaatori poolt ühendamisel tuvastatud probleemid ei satuks süsteemi meister haru. Samuti ei taha me iga kord kogu projekti analüüsida. Veelgi enam, filiaalide ühendamisel on meil muudetud failide loend. Seetõttu soovitan lisada liitmistaotluse kontrolli.

Selline näeb välja liitmistaotlus enne staatilise analüsaatori rakendamist:

GitLabi liitmistaotluste analüüs, kasutades PVS-Studio for C#
See tähendab, et kõik vead, mis filiaalis olid muutused, kolib põhiharusse. Kuna me seda ei sooviks, lisame analüüsi ja nüüd näeb diagramm välja selline:

GitLabi liitmistaotluste analüüs, kasutades PVS-Studio for C#
Analüüsides muutused2 ja kui vigu pole, aktsepteerime liitmistaotlust, vastasel juhul lükkame selle tagasi.

Muide, kui olete huvitatud C/C++ sissekannete ja tõmbamistaotluste analüüsimisest, siis võite selle kohta lugeda siin.

GitLab

GitLab on avatud lähtekoodiga veebipõhine DevOpsi elutsükli tööriist, mis pakub Giti jaoks koodihoidla haldussüsteemi koos oma wiki, probleemide jälgimissüsteemi, CI/CD torujuhtme ja muude funktsioonidega.

Enne liitmistaotluste analüüsi alustamist peate registreeruma ja oma projekti üles laadima. Kui te ei tea, kuidas seda teha, siis soovitan artiklit minu kolleeg.

Märkus. Allpool kirjeldatud keskkonna seadistamise meetod on üks võimalikest. Eesmärk on näidata samme analüüsiks vajaliku keskkonna seadistamiseks ja analüsaatori käivitamiseks. Võib-olla oleks Sinu puhul optimaalsem eraldada keskkonna ettevalmistamise (hoidlate lisamine, analüsaatori paigaldamine) ja analüüsi etapid: näiteks Dockeri piltide ettevalmistamine koos vajaliku keskkonnaga ja nende kasutamine või mõni muu meetod.

Et paremini mõista, mis nüüd juhtub, soovitan vaadata järgmist diagrammi:

GitLabi liitmistaotluste analüüs, kasutades PVS-Studio for C#
Analüsaator vajab töötamiseks .NET Core SDK 3, seega tuleb enne analüsaatori paigaldamist lisada Microsofti hoidlad, kust analüsaatori jaoks vajalikud sõltuvused installeeritakse. Microsofti hoidlate lisamine erinevatele Linuxi distributsioonidele kirjeldatud vastavas dokumendis.

PVS-Studio installimiseks paketihalduri kaudu peate lisama ka PVS-Studio hoidlad. Erinevate distributsioonide hoidlate lisamist kirjeldatakse üksikasjalikumalt artiklis dokumentatsiooni asjakohane jaotis.

Analüsaatori tööks on vaja litsentsivõtit. Proovilitsentsi saate aadressil analüsaatori allalaadimise leht.

Märkus. Pange tähele, et kirjeldatud töörežiim (liitmistaotluste analüüs) nõuab ettevõtte litsentsi. Seetõttu, kui soovite seda töörežiimi proovida, ärge unustage väljale "Sõnum" märkida, et vajate ettevõtte litsentsi.

Kui tekib liitmistaotlus, peame analüüsima ainult muudetud failide loendit, vastasel juhul analüüsime kõiki faile. Pärast analüüsi peame teisendama logid meile vajalikusse vormingusse.

Nüüd, kui tööalgoritm on teie silme ees, võite liikuda skripti kirjutamise juurde. Selleks peate faili muutma .gitlab-ci.yml või kui seda pole, looge see. Selle loomiseks peate klõpsama oma projekti nimel -> Seadistage CI/CD.

GitLabi liitmistaotluste analüüs, kasutades PVS-Studio for C#
Nüüd oleme valmis stsenaariumi kirjutama. Kirjutame esmalt analüsaatori installimise koodi ja sisestame litsentsi:

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

Kuna installimine ja aktiveerimine peavad toimuma enne kõiki teisi skripte, kasutame spetsiaalset silti enne_skripti. Lubage mul seda fragmenti veidi selgitada.

Analüsaatori paigaldamise ettevalmistamine:

  - 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 hoidlate ja analüsaatori lisamine:

  - 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

Litsentsi aktiveerimine:

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY

$PVS_NAME - Kasutajanimi.

$PVS_KEY - tootevõti.

Projekti sõltuvuste taastamine kus $CI_PROJECT_DIR – täielik tee projektikataloogi:

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

Korrektseks analüüsiks tuleb projekt edukalt üles ehitada ja selle sõltuvused taastada (näiteks alla laadida vajalikud NuGeti paketid).

Litsentsiteavet sisaldavaid keskkonnamuutujaid saate määrata klõpsates Kehtestamine, ja pärast - sisse CI/CD.

GitLabi liitmistaotluste analüüs, kasutades PVS-Studio for C#
Leidke avanevas aknas üksus Muutujad, klõpsake paremal asuvat nuppu Laiendama ja lisada muutujaid. Tulemus peaks välja nägema selline:

GitLabi liitmistaotluste analüüs, kasutades PVS-Studio for C#
Nüüd saate analüüsi juurde minna. Esmalt lisame täieliku analüüsi jaoks skripti. Lipu juurde -t läbime tee lahenduse juurde lipule -o kirjutage faili tee, kuhu analüüsitulemused kirjutatakse. Oleme huvitatud ka tagastuskoodist. Sel juhul oleme huvitatud, et toiming peatuks, kui tagastuskood sisaldab teavet selle kohta, et analüüsi käigus anti hoiatusi. See fragment näeb välja selline:

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

Tagastuskoodid töötavad bitimaski põhimõttel. Näiteks kui analüüsi tulemusena tehti hoiatusi, siis tagastamiskood võrdub 8-ga. Kui tegevusluba aegub kuu aja jooksul, siis on tagastuskood võrdne 4-ga. Kui analüüsi käigus tuvastati vigu, siis on tagastuskood võrdne 8-ga. ja litsents aegub kuu aja jooksul, tagastab kood, kirjutatakse mõlemad väärtused: liitke numbrid kokku ja saate lõpliku tagastuskoodi - 4+12=XNUMX. Seega saab vastavaid bitte kontrollides analüüsi käigus saada infot erinevate olekute kohta. Tagastuskoode kirjeldatakse üksikasjalikumalt dokumendi "pvs-studio-dotnet (Linux / macOS) tagastuskoodid" jaotises "Visual Studio / MSBuild / .NET Core projektide kontrollimine käsurealt PVS-Studio abil".

Sel juhul oleme huvitatud kõigist tagastuskoodidest, kus kuvatakse 8.

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

1 saame siis, kui tagastuskood sisaldab meid huvitava numbri bitti, vastasel juhul saame 0.

On aeg lisada liitmistaotluse analüüs. Enne kui seda teeme, valmistame ette skripti jaoks koha. Peame seda täitma ainult siis, kui esitatakse ühendamistaotlus. See näeb välja selline:

merge:
  script:
  only:
  - merge_requests

Liigume edasi skripti enda juurde. Seisin silmitsi tõsiasjaga, et virtuaalmasin ei tea sellest midagi päritolu/meister. Nii et aitame teda natuke:

  - git fetch origin

Nüüd saame harude erinevuse ja salvestame tulemuse sisse txt fail:

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

kus $CI_COMMIT_SHA – viimase sidumise räsi.

Järgmisena hakkame lipu abil failide loendit analüüsima -f. Edastame sellele eelnevalt saadud .txt faili. Noh, analoogselt täieliku analüüsiga vaatame tagastuskoode:

  - 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

Liitmistaotluse kontrollimise täielik skript näeb välja järgmine:

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

Jääb vaid lisada logikonversioon pärast kõigi skriptide töötlemist. Kasutame silti järel_skript ja kasulikkust plog-muundur:

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

Utiliit plog-muundur on avatud lähtekoodiga projekt, mida kasutatakse parseri veaaruannete teisendamiseks erinevatesse vormidesse, näiteks HTML-i. Utiliidi täpsem kirjeldus on toodud alajaotises "Plog Converter Utility" dokumentatsiooni asjakohane jaotis.

Muide, kui soovite mugavalt töötada IDE-st pärit .json-aruannetega, siis soovitan meie pistikprogramm IDE Rider jaoks. Selle kasutamist kirjeldatakse üksikasjalikumalt artiklis asjakohane dokument.

Mugavuse huvides on see siin .gitlab-ci.yml täielikult:

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

Kui olete kõik faili lisanud, klõpsake nuppu Tehke muudatused. Selleks, et näha, kas kõik on õige, minge aadressile CI / CD -> Torujuhtmed -> Running. Avaneb virtuaalmasina aken, mille lõpus peaks olema järgmine teave:

GitLabi liitmistaotluste analüüs, kasutades PVS-Studio for C#
Saag Töö õnnestus - edu, kõik on hästi. Nüüd saate testida, mida olete teinud.

Näited töödest

Töö näite jaoks loome lihtsa projekti (in meister), mis sisaldab mitut faili. Pärast seda muudame teises harus ainult ühte faili ja proovime teha liitmistaotluse.

Vaatleme kahte juhtumit: kui muudetud fail sisaldab viga ja millal mitte. Esiteks näide veaga.

Oletame, et põhiharus on fail Programm.cs, mis ei sisalda vigu, kuid teises harus lisas arendaja vigase koodi ja soovib teha liitmistaotluse. Millise vea ta tegi, polegi nii oluline, peaasi, et see on olemas. Näiteks operaator unustas viskama (jah, nii vale):

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

Vaatame veaga näite analüüsimise tulemust. Samuti lisasin lipu, et veenduda, et sõeluti ainult üks fail -r pvs-studio-dotneti käivitusliinile:

GitLabi liitmistaotluste analüüs, kasutades PVS-Studio for C#
Näeme, et analüsaator leidis vea ja ei lubanud harusid liita.

Kontrollime näidet ilma veata. Koodi parandamine:

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

Ühenda taotluse analüüsi tulemused:

GitLabi liitmistaotluste analüüs, kasutades PVS-Studio for C#
Nagu näeme, vigu ei leitud ja ülesande täitmine oli edukas, mida tahtsime kontrollida.

Järeldus

Halva koodi väljarookimine enne harude liitmist on väga mugav ja meeldiv. Nii et kui kasutate CI/CD-d, proovige kontrollimiseks manustada staatiline analüsaator. Pealegi tehakse seda üsna lihtsalt.

Tänan teid tähelepanu eest.

GitLabi liitmistaotluste analüüs, kasutades PVS-Studio for C#
Kui soovite seda artiklit inglise keelt kõneleva publikuga jagada, kasutage tõlkelinki: Nikolai Mironov. GitLabi liitmistaotluste analüüs, kasutades PVS-Studio for C#.

Allikas: www.habr.com

Lisa kommentaar