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.
Mimochodom, vydali sme PVS-Studio 7.08, v ktorom sme urobili veľa vecí
- 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:
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:
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ť
GitLab
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
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:
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
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
Na fungovanie analyzátora je potrebný licenčný kľúč. Skúšobnú licenciu môžete získať na
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.
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.
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:
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“
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ť
Mimochodom, ak chcete pohodlne pracovať s prehľadmi .json lokálne z IDE, potom navrhujem naše
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é:
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,
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:
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:
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ť.
Ak chcete tento článok zdieľať s anglicky hovoriacim publikom, použite odkaz na preklad: Nikolay Mironov.
Zdroj: hab.com