GitLabi merge request'ide analüüsimine PVS-Studio abil C# jaoks

Merge-päringute analüüs GitLabis PVS-Studio abil C# jaoks
Kas armastate GitLabi ja vihkate vigu? Kas soovite parandada lähtekoodi kvaliteeti? Siis olete õigesse kohta sattunud. Täna räägime, kuidas seadistada C# analüsaator PVS-Studio, et kontrollida merge request'e. Soovime kõigile ükssarvikute meeleolu ja head lugemist.

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

Muide, meil ilmus PVS-Studio 7.08, kus tegime palju huvitavat huvitavat. Näiteks:

  • C# analüsaator Linuxi ja macOS-i jaoks;
  • plugin Riderile;
  • uus failide nimekirja kontrollimise režiim.

Failide nimekirja kontrollimise režiim

Varem, et kontrollida teatud faile, tuli analüsaatorile edastada .xml fail nimekirjaga. Kuid kuna see ei olnud väga mugav, lisasime võimaluse edastada .txt, mis lihtsustab elu oluliselt.

Teatud failide kontrollimiseks peate määrama lipu —sourceFiles (-f) ja edastama .txt nimekirjaga. See näeb välja järgmine:

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

Kui teid huvitab commitide või pull requestide kontrollimise seadistamine, siis saate seda teha ka selle režiimi abil. Erinevus seisneb failide analüüsimise nimekirja saamise meetodis ja see sõltub kasutatavatest süsteemidest.

Merge requestide kontrollimise põhimõte

Kontrollimise peamine eesmärk on tagada, et analüsaatori tuvastatud probleemid ei satuks master harusse. Samuti ei soovi me iga kord kogu projekti analüüsida. Eriti kuna harude liitmisel on meil loetelu muudetud failidest. Seega soovitan lisada merge requestide kontrollimise.

Nii näeb merge request välja enne staatilise analüsaatori rakendamist:

Merge-päringute analüüs GitLabis PVS-Studio abil C# jaoks
See tähendab, et kõik vead, mis olid harus changes, lähevad üle peaharusse. Kuna me seda ei soovi, lisame analüüsi ja nüüd näeb skeem välja järgmiselt:

Merge-päringute analüüs GitLabis PVS-Studio abil C# jaoks
Analüüsime changes2 ja kui vigu pole, aktsepteerime merge requesti, vastasel juhul lükkame selle tagasi.

Muide, kui teid huvitab commitide ja pull requestide analüüs C/C++ jaoks, siis saate sellest lugeda siit.

GitLab

GitLab — avatud lähtekoodiga DevOps elutsükli veebitööriist, mis esindab koodi hoidlate haldussüsteemi Git'i jaoks koos oma vikiga, veaparanduste jälgimise süsteemiga, CI/CD torujuhtme ja muude funktsioonidega.

Enne, kui asute merge request'ide analüüsi rakendama, peate registreeruma ja oma projekti üles laadima. Kui te ei tea, kuidas seda teha, siis soovitan artiklile minu kolleegi.

Märkus. Allpool kirjeldatud keskkonna seadistamise meetod on üks võimalustest. Eesmärk on näidata samme, kuidas seadistada analüüsi jaoks vajalik keskkond ja käivitada analüsaator. Võib-olla on teie puhul optimaalsem etappide jagamine (hoidlate lisamine, analüüsaatori installimine) ja analüüs: näiteks Docker piltide ettevalmistamine vajaliku keskkonnaga ja nende kasutamine või mõni muu meetod.

Et paremini mõista, mis järgmisena juhtub, soovitan vaadata järgmist skeemi:

Merge-päringute analüüs GitLabis PVS-Studio abil C# jaoks
Analüsaatoriks vajalik .NET Core SDK 3, seetõttu tuleb analüsaatori paigaldamise eel lisada Microsofti hoidlad, kust paigaldatakse analüsaatori jaoks vajalikud sõltuvused. Microsofti hoidlate lisamine erinevatele Linuxi distributsioonidele on kirjeldatud vastavas dokumendis.

PVS-Studio installimiseks pakihalduri kaudu tuleb samuti lisada PVS-Studio hoidlad. Hoidlate lisamine erinevatele distributsioonidele on üksikasjalikult kirjeldatud vastavas dokumentatsiooni osas.

Analüsaatori tööks on vajalik litsentsivõti. Prooviversiooni saamiseks külastage analüsaatori allalaadimise lehte.

Märkus. Pange tähele, et kirjeldatud töörežiimiks (tõhususe analüüs merge requestide jaoks) on vajalik Enterprise litsents. Seega, kui soovite seda töörežiimi proovida, pöörake tähelepanu, et valdkonnas "Teade" peate märkima, et vajalik on just Enterprise litsents.

Kui toimub merge request, siis peame analüüsima ainult muudetud failide loendit, muul juhul analüüsime kõiki faile. Pärast analüüsi tuleb logid konverteerida vajalikku vormingusse.

Nüüd, olles töökava silme ees, saame liikuda skripti kirjutamise juurde. Selleks tuleb muuta faili .gitlab-ci.yml või, kui seda ei ole, luua see. Selle loomiseks vajutage oma projekti nimele -> Seadista CI/CD.

Merge-päringute analüüs GitLabis PVS-Studio abil C# jaoks
Nüüd oleme valmis skripti kirjutamiseks. Alustame kodeerimist, mis installib analüsaatori ja sisestab 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 peab toimuma enne kõiki teisi skripte, kasutame spetsiaalset märget before_script. Selgitan seda fragmenti veidi.

Analüsaatori installimise 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 ja analüsaatori reposte 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.

Projektide sõltuvuste taastamine, kus $CI_PROJECT_DIR – täielik teeperekond projekti katalooge:

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

Korrektseks analüüsiks peab projekt edukalt olema kompileeritud ja selle sõltuvused peavad olema taastatud (näiteks vajalikud NuGet paketid peavad olema alla laetud).

Keskkonnamuutujate seadistamiseks, mis sisaldavad litsentsi teavet, klõpsake Seaded, ja seejärel klõpsake CI / CD.

Merge-päringute analüüs GitLabis PVS-Studio abil C# jaoks
Avanevas aknas otsime Muutujad, paremal klõpsame nupule Laienda ja lisame muutujad. Tulemus peaks olema järgmine:

Merge-päringute analüüs GitLabis PVS-Studio abil C# jaoks
Nüüd saab analüüsile üle minna. Esiteks lisame skripti täieliku analüüsi jaoks. Lipp -t edastame teeperekonna lahenduse juurde, lipp -o mõtleme faili teele, kuhu analüüsi tulemused salvestatakse. Samuti huvitab meid tagasikutsumise kood. Antud juhul on oluline, et töö lõppeks, kui tagasikutsumise kood sisaldab teavet, et analüüsi käigus olid antud hoiatused. Niisiis, see lõik 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

Tagasikutsumise koodid toimivad bitimaski põhimõttel. Näiteks, kui analüüsi tulemusel antakse hoiatuseid, siis tagasikutsumise kood on 8. Kui litsents aegub kuu jooksul, siis tagasikutsumise kood on 4. Kui analüüsi käigus leitakse vigu ja litsents aegub kuu jooksul, siis koodis on kirjas mõlemad väärtused: liidame numbrid kokku ja saame lõppkoodina — 8+4=12. Nii et sobivate bitide kontrollimisega on võimalik saada teavet erinevate seisundite kohta analüüsi käigus. Tagasikutsumise koode kirjeldatakse põhjalikumalt jaotises "pvs-studio-dotnet tagasikutsumise koodid (Linux / macOS)" dokumentatsioonis "Visual Studio / MSBuild / .NET Core projektide kontrollimine käsurealt PVS-Studio abil".

Antud juhul huvitavad meid kõik tagastuskoode, kus figureerib 8.

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

Saame 1, kui tagastuskoht sisaldab meid huvitavat bitti, vastasel juhul saame 0.

On aeg lisada merge request'i analüüs. Enne seda valmistame skripti jaoks koha ette. Peame kindlustama, et see käivitatakse ainult siis, kui toimub merge request. See näeb välja nii:

merge:
  script:
  only:
  - merge_requests

Liigume skripti juurde. Kohtasin seda, et virtuaalmasin ei tea midagi origin/master. Seega aitame tal veidi:

  - git fetch origin

Nüüd saame harude erinevuse ja salvestame tulemuse txt faili:

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

Kus $CI_COMMIT_SHA – viimase commit'i hash.

Edasi käivitame failide nimekirja analüüsi, kasutades lippu -f. Edastame eelnevalt saadud .txt faili. Ja analoogiliselt 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

Täielik skript merge request'i kontrollimiseks näeb välja nii:

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 ainult logi konverteerimine lisada pärast kõigi skriptide töötamist. Kasutame märgist pärast_skripti ja utiliiti plog-converter:

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

Tööriist plog-converter — see on avatud lähtekoodiga projekt, mida kasutatakse analüsaatori veateate aruannete konverteerimiseks erinevatesse vormidesse, näiteks HTML. Utiliidi põhjalik kirjeldus on esitatud "Plog Converter Utility" alajaotuses vastava jaotise dokumentatsioonis.

Muide, kui soovite .json aruanne mugavalt IDE-s kohapeal kasutada, siis soovitan meie plugin IDE Riderile. Selle kasutamist käsitletakse põhjalikumalt vastavas dokumendis.

Mugavuse huvides siin .gitlab-ci.yml kogu:

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 kõik faili lisada, vajutage Commit changes. Kuidas veenduda, et kõik on õige, minema CI/CD -> Torud -> Running. Avaneb virtuaalmasina aken, mille lõpus peaks olema järgmine:

Merge-päringute analüüs GitLabis PVS-Studio abil C# jaoks
Nägin Töö õnnestus – edu, kõik on suurepärane. Nüüd saab ka valminut katsetada.

Näidised töötamisest

Näiteks loome lihtsa projekti (s master) kus on mitu faili. Pärast seda muudame teises harus ainult ühe faili ja proovime teha merge request'i.

Vaatleme kahte juhtumit: kui muudetud fail sisaldab viga ja kui ei. Alustame näitega, kus on viga.

Oletame, et master harus on fail Program.cs, mis ei sisalda vigu, kuid teises harus on arendaja lisanud vigase koodi ja soovib teha merge request'i. Millise vea ta tegi – ei ole nii oluline, oluline on see, et see on olemas. Näiteks unustas ta operaatori viska (jah, niimoodi eksivad):

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

Vaadakem vea analüüsi tulemust. Samuti olen veendunud, et analüüsiti ainult ühte faili, lisades lipu -r pvs-studio-dotnet: käivitusreale:

Merge-päringute analüüs GitLabis PVS-Studio abil C# jaoks
Näeme, et analüsaator leidis vea ja ei lubanud harude liitmist.

Kontrollime näidet, kus viga ei esine. Parandame koodi:

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

Merge request'i analüüsi tulemused:

Merge-päringute analüüs GitLabis PVS-Studio abil C# jaoks
Kuidas näeme, vigu ei leitud ja ülesande täitmine õnnestus, nagu me soovisime kontrollida.

Kokkuvõte

Halbamine vale koodi haruude amalgamatsiooni – see on väga mugav ja meeldiv. Seetõttu, kui kasutate CI/CD, proovige integreerida staatiline analüsaator kontrollimiseks. Eriti kuna see on piisavalt lihtne.

Aitäh tähelepanu eest.

Merge-päringute analüüs GitLabis PVS-Studio abil C# jaoks
Kui soovite jagada seda artiklit ingliskeelse publikuga, palun kasutage tõlke linki: Nikolay Mironov. Merge-päringute analüüs GitLabis PVS-Studio abil C# jaoks.

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster