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

Merge requestide analüüs GitLabis kasutades PVS-Studio C# jaoks
Kas armastate GitLabi ja ei salli vigu? Soovite parandada lähtekoodi kvaliteeti? Siis olete õiges kohas. Täna räägime, kuidas seadistada C# analüsaatorit PVS-Studio, et kontrollida merge request'e. Soovime kõigile ükssarvikute tuju ja meeldivat lugemist.

PVS-Studio on tööriist, mis tuvastab vead ja potentsiaalsed haavatavused programmide lähtekoodis, mis on kirjutatud keeltes C, C++, C# ja Java. Toimib 64-bitistes süsteemides Windowsi, Linuxi ja macOSi peal. Suudab analüüsida koodi, mis on mõeldud 32-bitistele, 64-bitistele ja sisseehitatud ARM platvormidele.

Muide, meil on välja antud PVS-Studio 7.08, milles oleme teinud palju uut huvitavat. Näiteks:

  • C# analüsaator Linuxi ja macOSi jaoks;
  • lisand Riderile;
  • uus failide loendi kontrollimise režiim.

Failide loendi kontrollimise režiim

Varem oli teatud failide kontrollimiseks vajalik edastada analüsaatorile .xml fail failide nimekirjaga. Kuna see ei olnud väga mugav, lisasime võimaluse edastada .txt, mis lihtsustab elu.

Teatud failide kontrollimiseks tuleb näidata lipp --sourceFiles (-f) ja edastada .txt fail nimekirjaga. See näeb välja järgmiselt:

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

Kui teid huvitab commit'ide või pull request'ide kontrollimise seadistamine, saate seda režiimi kasutades samuti teha. Erinevus seisneb faili nimekirja saamise meetodis, mis sõltub kasutatavatest süsteemidest.

Merge request'ide kontrollimise põhimõte

Kontrollimise peamine tähendus on vältida, et analüsaatori tuvastatud probleemid satuvad master harusse. Samuti ei soovi me igakord projekti täielikult analüüsida. Eriti kuna harude sulandumisel on meil nimekiri muudetud failidest. Seetõttu pakun välja merge request'i kontrollimise.

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

Merge requestide analüüs GitLabis kasutades PVS-Studio C# jaoks
Ehk et kõik vead, mis olid haru changes, lähevad master harusse. Kuna me ei taha, et see nii oleks, lisame analüüsi ja nüüd näeb skeem välja järgmiselt:

Merge requestide analüüs GitLabis kasutades PVS-Studio C# jaoks
Analüüsime changes2 ja kui vigu ei esine, aktsepteerime merge request'i, muidu lükkame selle tagasi.

Muide, kui teid huvitab commit'ide ja pull request'ide analüüs C/C++ jaoks, siis saate selle kohta lugeda. siin.

GitLab

GitLab — avatud lähtekoodiga DevOps elu tsükli veebitööriist, mis esindab koodirepositooriumide haldussüsteemi Git'ile koos oma wiki, veateate jälgimise süsteemi, CI/CD torustiku ja muude funktsioonidega.

Enne merge request'ide analüüsi rakendamist peate registreerima ja oma projekti üles laadima. Kui te ei tea, kuidas seda teha, siis soovitan artiklit minu kolleegist.

Märkus. Allpool kirjeldatud keskkonna seadistamise meetod on üks võimalikest. Eesmärk on näidata vajalike seadistusjuhiste samme analüüsimiseks ja analüsaatori käivitamiseks. Võimalik, et teie puhul on optimaalne jagada keskkonna ettevalmistamise etapid (reposiitide lisamine, analüsaatori installimine) ja analüüs: näiteks Docker'i piltide ettevalmistamine vajaliku keskkonnaga ja nende kasutamine või mõni muu meetod.

Et paremini mõista, mis järgmiseks toimub, soovitan vaadata järgmist skeemi:

Merge requestide analüüs GitLabis kasutades PVS-Studio C# jaoks
Analüsaator vajab .NET Core SDK 3, seega tuleb analüsaatori installimise eel lisada Microsofti repositooriumid, mille kaudu installitakse analüsaatorile vajalikud sõltuvused. Microsofti repositooriumide lisamine erinevatele Linuxi distributsioonidele on kirjeldatud vastavas dokumentatsioonis..

PVS-Studio installimiseks pakettide halduri kaudu tuleb samuti lisada PVS-Studio repositooriumid. Erinevate distributsioonide repositooriumide lisamine on põhjalikumalt kirjeldatud vastavas dokumentatsiooni osas..

Analüsaatori tööks on vajalik litsentsivõti. Prooviversiooni saab saada analüsaatori allalaadimise lehelt..

Märkus. Pange tähele, et kirjeldatud töörežiimi (merge request’ide analüüs) jaoks on vajalik Enterprise litsents. Seetõttu, kui soovite seda töörežiimi proovida, märkige oma sõnumi väljale, et vajate just Enterprise litsentsi.

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

Nüüd, kui meil on töö algoritm ees, saame liikuda skripti kirjutamise juurde. Selleks tuleb muuta faili .gitlab-ci.yml või, kui seda ei ole, luua uus. Uue loomise jaoks tuleb klikata oma projekti nimel -> Seadista CI/CD.

Merge requestide analüüs GitLabis kasutades PVS-Studio C# jaoks
Nüüd oleme valmis skripti kirjutamiseks. Alustame koodist, mis seadistab 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 sildit. 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 repo 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 – projekti katalooge täpsustav tee:

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

Korrektseks analüüsiks peab projekt olema edukalt kokku seatud ning selle sõltuvused peavad olema taastatud (nt vajalikud NuGet paketid peavad olema alla laaditud).

Keskkonnamuutujate seadistamiseks, mis sisaldavad litsentsiteavet, klõpsake Setting, seejärel klõpsake CI / CD.

Merge requestide analüüs GitLabis kasutades PVS-Studio C# jaoks
Avanenud aknas leiate jaotise Variables, paremal klõpsake nuppu Expand ja lisage muutujad. Tulemuseks peaks olema järgmine:

Merge requestide analüüs GitLabis kasutades PVS-Studio C# jaoks
Nüüd saab alustada analüüsi. Esmalt lisame skripti täieliku analüüsi jaoks. Flagi -t edastame tee lahendusele, flagi -o märkime faili tee, kuhu analüüsi tulemused kirjutatakse. Samuti huvitab meid tagastusväärtus. Antud juhul on oluline, et töö jätkuks, kui tagastusväärtus sisaldab teavet selle kohta, et analüüsi käigus andis hoiatusi. Näiteks selline fragment:

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 bitimaskimise printsiibi järgi. Näiteks, kui analüüsi käigus anti hoiatuseid, siis tagastuskood on 8. Kui litsents aegub kuu jooksul, siis tagastuskood on 4. Kui analüüsi käigus tuvastatakse vigu ja litsents aegub kuu jooksul, siis tagastuskood sisaldab mõlemaid väärtuseid: liidame numbrid ja saame lõpliku tagastuskoodi — 8+4=12. Seega, vastavaid bitte kontrollides, saame erinevate seisundite teavet analüüsi käigus. Tagastuskoodide kohta on rohkem teavet jaotises "PVS-Studio tagastuskoodid (Linux / macOS)" dokumendis.Visual Studio / MSBuild / .NET Core projektide kontrollimine käsurealt PVS-Studio abil".

Antud juhul huvitavad meid kõik tagastuskoodid, kus esineb 8.

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

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

On aeg lisada merge request'i analüüs. Enne seda valmistame skripti jaoks koha ette. Meil on vajalik, et see käivitataks ainult siis, kui toimub merge request. Näeb välja selline:

merge:
  script:
  only:
  - merge_requests

Liigume skripti juurde. Olen silmitsi seisnud sellega, et virtuaalmasin ei tea midagi " origin/master". Seega aitame tal natuke:

  - git fetch origin

Nüüd saame harude vahe 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. Edasi anname eelnevalt saadud .txt faili. Ja nagu täieliku analüüsi puhul vaatame tagastuskoodid:

  - 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 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

Küsimus on ainult logi konverteerimise lisamises pärast kõigi skriptide töötamist. Kasutame märgendit after_script ja utiliiti plog-converter:

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

Utiliit plog-converter — see on avatud lähtekoodiga projekt, mida kasutatakse tõrkearuande analüsaatori erinevateks vormideks, näiteks HTML. Täiendav teave utiliidi kohta on toodud jaotises "Plog Converter Utility" asjakohane dokumentatsiooni osa.

Muide, kui soovite mugavalt töötada .json aruande kohaliku IDE-st, siis pakun meie plugin IDE Rider. Üksikasjalik teave selle kasutamise kohta on kirjeldatud vastavas dokumendis.

Mugavuse huvides on 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

Niipea, kui kõik failid on juurde lisatud, vajutame Commit changes. Et veenduda, et kõik on õigesti, läheme CI/CD -> Torud -> Käimas. Avaneb virtuaalmasina aken, mille lõpus peaks olema järgmine:

Merge requestide analüüs GitLabis kasutades PVS-Studio C# jaoks
Nägime Töö õnnestus – täiesti hästi, nüüd saame tehtut testida.

Töö näidised

Töönäidise näitamiseks loome lihtsa projekti (millel on master) mitu faili. Peale seda muudame teises harus ainult ühte faili ja proovime teha merge requesti.

Vaatame kahte juhtumit: kui muudetud fail sisaldab viga ja kui ei. Alguses reegel veaga.

Eeldame, et master haru failis Program.cs, mis ei sisalda vigu, ja teises haru on arendaja lisanud vigase koodi ja soovib teha merge requesti. Milline vead see on, pole nii oluline, peamine on see, et see on olemas. Näiteks unustas ta operaatori throw (jah, nii tehakse vigu):

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

Vaadakem analüüsi tulemust vea näite kohta. Samuti, et veenduda, et analüüsiti ainult ühte faili, lisasin lipu -r pvs-studio-dotneti käivitamisreal:

Merge requestide analüüs GitLabis kasutades PVS-Studio C# jaoks
Näeme, et analüsaator leidis vea ja ei lubanud harude ühendamist.

Kontrollime vaba veaga näidet. Parandame koodi:

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

Merge requesti analüüsi tulemused:

Merge requestide analüüs GitLabis kasutades PVS-Studio C# jaoks
Nagu me näeme, vigu ei leitud ja ülesande täitmine õnnestus, mida me soovisime kontrollida.

Kokkuvõte

Halva koodi filtreerimine enne harude ühendamist — see on väga mugav ja meeldiv. Seetõttu, kui kasutate CI/CD, proovige integreerida staatiline analüsaator kontrollimiseks. Erakordselt lihtne selle rakendamine.

Aitäh tähelepanu eest.

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

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster