Analýza žiadostí o zlúčenie v GitLab pomocou PVS-Studio pre C#

Analýza žiadostí o zlúčenie v GitLab pomocou PVS-Studio pre C#
Milujete GitLab a neznášate chyby? Chcete zlepšiť kvalitu zdrojového kódu? Potom ste na správnom mieste. Dnes vám povieme, ako nakonfigurovať analyzátor PVS-Studio C# na kontrolu žiadostí o zlúčenie. Majte náladu jednorožca a príjemné čítanie všetkým.

Štúdio PVS je nástroj na identifikáciu chýb a potenciálnych zraniteľností v zdrojovom kóde programov napísaných v C, C++, C# a Java. Funguje na 64-bitových systémoch na Windows, Linux a macOS. Dokáže analyzovať kód navrhnutý pre 32-bitové, 64-bitové a vstavané platformy ARM.

Mimochodom, vydali sme PVS-Studio 7.08, v ktorom sme urobili veľa vecí zaujímavé, Napríklad:

  • C# analyzátor pre Linux a macOS;
  • plugin pre Rider;
  • nový režim kontroly zoznamu súborov.

Režim kontroly zoznamu súborov

Predtým bolo na kontrolu určitých súborov potrebné odovzdať analyzátoru .xml so zoznamom súborov. Ale keďže to nie je príliš pohodlné, pridali sme možnosť prenášať .txt, vďaka čomu je život veľmi jednoduchý.

Ak chcete skontrolovať konkrétne súbory, musíte zadať príznak --sourceFiles (-f) a preneste .txt so zoznamom súborov. Vyzerá to takto:

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

Ak máte záujem o nastavenie kontroly odovzdania alebo požiadaviek na stiahnutie, môžete to urobiť aj pomocou tohto režimu. Rozdiel bude v získaní zoznamu súborov na analýzu a bude závisieť od toho, aké systémy používate.

Princíp kontroly žiadosti o zlúčenie

Hlavnou podstatou kontroly je zabezpečiť, aby problémy zistené analyzátorom počas zlučovania nespadali do majster pobočka. Tiež nechceme zakaždým analyzovať celý projekt. Navyše pri zlučovaní pobočiek máme zoznam zmenených súborov. Preto navrhujem pridať kontrolu žiadosti o zlúčenie.

Takto vyzerá žiadosť o zlúčenie pred implementáciou statického analyzátora:

Analýza žiadostí o zlúčenie v GitLab pomocou PVS-Studio pre C#
Teda všetky chyby, ktoré boli v brandži zmeny, sa presunie do hlavnej pobočky. Keďže by sme to nechceli, pridáme analýzu a diagram teraz vyzerá takto:

Analýza žiadostí o zlúčenie v GitLab pomocou PVS-Studio pre C#
Analyzujeme zmeny2 a ak sa nevyskytnú žiadne chyby, žiadosť o zlúčenie akceptujeme, inak ju zamietneme.

Mimochodom, ak máte záujem analyzovať commity a pull requesty pre C/C++, tak si o tom môžete prečítať tu.

GitLab

GitLab je open source webový nástroj životného cyklu DevOps, ktorý poskytuje systém správy úložiska kódu pre Git s vlastnou wiki, systémom sledovania problémov, kanálom CI/CD a ďalšími funkciami.

Skôr než začnete analyzovať žiadosti o zlúčenie, musíte sa zaregistrovať a odovzdať svoj projekt. Ak neviete, ako na to, odporúčam статью môj kolega.

Poznámka. Nižšie popísaný spôsob nastavenia prostredia je jedným z možných. Cieľom je ukázať kroky pre nastavenie prostredia potrebného na analýzu a spustenie analyzátora. Možno vo vašom prípade by bolo optimálnejšie oddeliť fázy prípravy prostredia (pridávanie úložísk, inštalácia analyzátora) a analýzu: napríklad príprava obrazov Docker s potrebným prostredím a ich použitie alebo iná metóda.

Aby ste lepšie pochopili, čo sa teraz stane, navrhujem pozrieť si nasledujúci diagram:

Analýza žiadostí o zlúčenie v GitLab pomocou PVS-Studio pre C#
Analyzátor vyžaduje na fungovanie .NET Core SDK 3, takže pred inštaláciou analyzátora musíte pridať úložiská spoločnosti Microsoft, z ktorých sa nainštalujú závislosti potrebné pre analyzátor. Pridanie repozitárov Microsoftu pre rôzne distribúcie Linuxu popísané v príslušnom dokumente.

Ak chcete nainštalovať PVS-Studio cez správcu balíkov, budete musieť pridať aj úložiská PVS-Studio. Pridávanie úložísk pre rôzne distribúcie je podrobnejšie popísané v príslušnej časti dokumentácie.

Na fungovanie analyzátora je potrebný licenčný kľúč. Skúšobnú licenciu môžete získať na stránka na stiahnutie analyzátora.

Poznámka. Upozorňujeme, že popísaný režim prevádzky (analýza žiadostí o zlúčenie) vyžaduje licenciu Enterprise. Preto, ak chcete vyskúšať tento režim prevádzky, nezabudnite v poli „Správa“ uviesť, že potrebujete licenciu Enterprise.

Ak dôjde k žiadosti o zlúčenie, musíme analyzovať iba zoznam zmenených súborov, inak analyzujeme všetky súbory. Po analýze musíme previesť protokoly do formátu, ktorý potrebujeme.

Teraz, keď máte pred očami algoritmus práce, môžete prejsť k písaniu skriptu. Ak to chcete urobiť, musíte zmeniť súbor .gitlab-ci.yml alebo ak neexistuje, vytvorte ho. Pre jeho vytvorenie je potrebné kliknúť na názov vášho projektu -> Nastavte CI/CD.

Analýza žiadostí o zlúčenie v GitLab pomocou PVS-Studio pre C#
Teraz sme pripravení napísať scenár. Najprv napíšme kód, ktorý nainštaluje analyzátor a zadajte licenciu:

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

Keďže inštalácia a aktivácia musí prebehnúť pred všetkými ostatnými skriptami, používame špeciálne označenie pred_skriptom. Dovoľte mi trochu vysvetliť tento fragment.

Príprava na inštaláciu analyzátora:

  - 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

Pridanie úložísk a analyzátora PVS-Studio:

  - 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

Aktivácia licencie:

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY

$PVS_NAME - Používateľské meno.

$ PVS_KEY - produktový kľúč.

Obnovenie závislostí projektu kde $CI_PROJECT_DIR – úplná cesta k adresáru projektu:

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

Pre správnu analýzu musí byť projekt úspešne zostavený a musia byť obnovené jeho závislosti (napríklad je potrebné stiahnuť potrebné balíčky NuGet).

Kliknutím môžete nastaviť premenné prostredia obsahujúce licenčné informácie Nastaveniea po - na CI/CD.

Analýza žiadostí o zlúčenie v GitLab pomocou PVS-Studio pre C#
V okne, ktoré sa otvorí, nájdite položku Premenné, kliknite na tlačidlo vpravo Rozšíriť a pridajte premenné. Výsledok by mal vyzerať takto:

Analýza žiadostí o zlúčenie v GitLab pomocou PVS-Studio pre C#
Teraz môžete prejsť k analýze. Najprv pridajme skript pre kompletnú analýzu. K vlajke -t cestu k riešeniu odovzdávame vlajke -o napíšte cestu k súboru, do ktorého sa budú zapisovať výsledky analýzy. Zaujíma nás aj návratový kód. V tomto prípade nás zaujíma, aby sa operácia zastavila, keď návratový kód obsahuje informáciu, že počas analýzy boli vydané varovania. Takto vyzerá tento 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

Návratové kódy fungujú na princípe bitovej masky. Napríklad, ak boli v dôsledku analýzy vydané varovania, návratový kód sa bude rovnať 8. Ak platnosť licencie vyprší do jedného mesiaca, návratový kód bude rovný 4. Ak sa počas analýzy zistia chyby, a licencia vyprší do mesiaca, vráti sa kód, zapíšu sa obe hodnoty: sčítajte čísla a získate konečný návratový kód - 8+4=12. Takže kontrolou zodpovedajúcich bitov možno počas analýzy získať informácie o rôznych stavoch. Návratové kódy sú podrobnejšie popísané v dokumente v časti „Pvs-studio-dotnet (Linux / macOS) Návratové kódy“Kontrola projektov Visual Studio / MSBuild / .NET Core z príkazového riadka pomocou PVS-Studio".

V tomto prípade nás zaujímajú všetky návratové kódy, kde sa objaví 8.

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

1 dostaneme, keď návratový kód obsahuje bit čísla, o ktoré máme záujem, inak dostaneme 0.

Je čas pridať analýzu žiadostí o zlúčenie. Predtým, ako to urobíme, pripravme si miesto pre scenár. Potrebujeme, aby sa vykonal iba vtedy, keď sa vyskytne žiadosť o zlúčenie. Vyzerá to takto:

merge:
  script:
  only:
  - merge_requests

Prejdime k samotnému scenáru. Stretol som sa s tým, že virtuálny stroj o ničom nevie pôvod/majster. Tak jej trochu pomôžme:

  - git fetch origin

Teraz dostaneme rozdiel medzi vetvami a výsledok uložíme txt súbor:

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

kde $CI_COMMIT_SHA – hash posledného odovzdania.

Ďalej začneme analyzovať zoznam súborov pomocou príznaku -f. Prenesieme do nej predtým prijatý súbor .txt. Analogicky s úplnou analýzou sa pozrieme na návratové kódy:

  - 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

Kompletný skript na kontrolu žiadosti o zlúčenie bude vyzerať takto:

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

Zostáva len pridať konverziu protokolu po spracovaní všetkých skriptov. Používame označenie po_skripte a užitočnosť plog-konvertor:

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

Užitočnosť plog-konvertor je projekt s otvoreným zdrojovým kódom, ktorý sa používa na konverziu chybových správ syntaktického analyzátora do rôznych foriem, ako je napríklad HTML. Podrobnejší popis pomôcky je uvedený v podsekcii „Plog Converter Utility“ príslušnej časti dokumentácie.

Mimochodom, ak chcete pohodlne pracovať s prehľadmi .json lokálne z IDE, potom navrhujem naše zapojiť pre IDE Rider. Jeho použitie je podrobnejšie popísané v príslušný dokument.

Pre pohodlie tu je .gitlab-ci.yml plne:

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

Po pridaní všetkého do súboru kliknite na Potvrdiť zmeny. Ak chcete vidieť, že je všetko správne, prejdite na CI / CD -> Potrubie -> Bezat. Otvorí sa okno virtuálneho počítača, na konci ktorého by malo byť nasledovné:

Analýza žiadostí o zlúčenie v GitLab pomocou PVS-Studio pre C#
videl Job uspel - úspech, všetko je v poriadku. Teraz môžete otestovať, čo ste urobili.

Príklady práce

Ako príklad práce si vytvorme jednoduchý projekt (v majster), ktorý bude obsahovať niekoľko súborov. Potom v ďalšej vetve zmeníme iba jeden súbor a pokúsime sa podať žiadosť o zlúčenie.

Zoberme si dva prípady: keď upravený súbor obsahuje chybu a keď nie. Najprv príklad s chybou.

Povedzme, že v hlavnej vetve je súbor Program.cs, ktorý neobsahuje chyby, ale v inej vetve vývojár pridal chybný kód a chce podať žiadosť o zlúčenie. Aký druh chyby urobil, nie je tak dôležité, hlavné je, že existuje. Operátor napríklad zabudol hod (Áno, tak nesprávne):

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

Pozrime sa na výsledok analýzy príkladu s chybou. Tiež som pridal príznak, aby som sa uistil, že bol analyzovaný iba jeden súbor -r na spúšťací riadok pvs-studio-dotnet:

Analýza žiadostí o zlúčenie v GitLab pomocou PVS-Studio pre C#
Vidíme, že analyzátor našiel chybu a neumožnil zlúčenie vetiev.

Pozrime sa na príklad bez chyby. Oprava kódu:

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

Výsledky analýzy žiadosti o zlúčenie:

Analýza žiadostí o zlúčenie v GitLab pomocou PVS-Studio pre C#
Ako vidíme, nenašli sa žiadne chyby a vykonanie úlohy bolo úspešné, čo sme chceli skontrolovať.

Záver

Odstránenie zlého kódu pred zlúčením pobočiek je veľmi pohodlné a príjemné. Ak teda používate CI/CD, skúste na kontrolu vložiť statický analyzátor. Navyše sa to robí celkom jednoducho.

Ďakujem vám za pozornosť.

Analýza žiadostí o zlúčenie v GitLab pomocou PVS-Studio pre C#
Ak chcete tento článok zdieľať s anglicky hovoriacim publikom, použite odkaz na preklad: Nikolay Mironov. Analýza žiadostí o zlúčenie v GitLab pomocou PVS-Studio pre C#.

Zdroj: hab.com

Pridať komentár