Máte rádi GitLab a nesnášíte chyby? Chcete zlepšit kvalitu svého zdrojového kódu? Pak jste na správném místě. Dnes vám řekneme, jak nakonfigurovat analyzátor PVS-Studio C# pro kontrolu požadavků na sloučení. Na zdraví všem a příjemné čtení.
Mimochodem, vydali jsme PVS-Studio 7.08, ve kterém jsme udělali spoustu věcí
- C# analyzátor pro Linux a macOS;
- plugin pro Rider;
- nový režim kontroly seznamu souborů.
Režim kontroly seznamu souborů
Dříve bylo pro kontrolu určitých souborů nutné předat analyzátoru soubor .xml se seznamem souborů. Ale protože to není příliš pohodlné, přidali jsme možnost přenosu .txt, což výrazně zjednodušuje život.
Chcete-li zkontrolovat určité soubory, musíte zadat příznak --zdrojové soubory (-f) a předejte .txt se seznamem souborů. Vypadá to takto:
pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.json
Pokud máte zájem nastavit kontroly odevzdání nebo žádosti o stažení, můžete tak učinit také pomocí tohoto režimu. Rozdíl bude v získání seznamu souborů pro analýzu a bude záviset na tom, jaké systémy používáte.
Princip kontroly žádosti o sloučení
Hlavní podstatou kontroly je zajistit, aby problémy zjištěné analyzátorem nespadaly do sloučení mistr větev. Také nechceme pokaždé analyzovat celý projekt. Navíc při slučování větví máme seznam změněných souborů. Proto navrhuji přidat kontrolu žádosti o sloučení.
Takto vypadá žádost o sloučení před zavedením statického analyzátoru:
Tedy všechny chyby, které ve větvi byly změny, se přesune do hlavní větve. Protože to nechceme, přidáme analýzu a obvod nyní vypadá takto:
Analyzujeme změny2 a pokud nejsou žádné chyby, žádost o sloučení přijmeme, jinak ji zamítneme.
Mimochodem, pokud máte zájem analyzovat commity a pull requesty pro C/C++, pak si o tom můžete přečíst.
GitLab
Než budete pokračovat v implementaci analýzy žádostí o sloučení, musíte se zaregistrovat a nahrát svůj projekt. Pokud nevíte, jak to udělat, doporučuji
Poznámka. Níže popsaný způsob nastavení prostředí je jedním z možných. Cílem je ukázat kroky pro nastavení prostředí nutného pro analýzu a spuštění analyzátoru. Možná by ve vašem případě bylo optimálnější oddělit fáze přípravy prostředí (přidávání úložišť, instalace analyzátoru) a analýzy: například příprava obrazů Dockeru s potřebným prostředím a jejich použití nebo jiným způsobem.
Abyste lépe porozuměli tomu, co se nyní stane, doporučuji podívat se na následující diagram:
Analyzátor ke svému fungování vyžaduje .NET Core SDK 3, takže před instalací analyzátoru je třeba přidat repozitáře společnosti Microsoft, ze kterých se nainstalují závislosti potřebné pro analyzátor. Přidání repozitářů Microsoftu pro různé distribuce Linuxu
Chcete-li nainstalovat PVS-Studio prostřednictvím správce balíčků, budete také muset přidat úložiště PVS-Studio. Přidávání úložišť pro různé distribuce je podrobněji popsáno v
Aby analyzátor fungoval, potřebuje licenční klíč. Zkušební licenci můžete získat na
Poznámka. Vezměte prosím na vědomí, že popsaný režim provozu (analýza požadavků na sloučení) vyžaduje Enterprise licenci. Pokud si tedy chcete tento režim provozu vyzkoušet, nezapomeňte v poli „Zpráva“ uvést, že potřebujete Enterprise licenci.
Pokud dojde k požadavku na sloučení, musíme analyzovat pouze seznam změněných souborů, jinak analyzujeme všechny soubory. Po analýze musíme převést protokoly do formátu, který potřebujeme.
Nyní, když máme před očima algoritmus práce, můžeme přistoupit k psaní scénáře. Chcete-li to provést, musíte změnit soubor .gitlab-ci.yml nebo pokud neexistuje, vytvořte jej. Chcete-li jej vytvořit, musíte kliknout na název vašeho projektu -> Nastavte CI/CD.
Nyní jsme připraveni napsat scénář. Nejprve napíšeme kód, který nainstaluje analyzátor, a zadejte licenci:
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
Protože instalace a aktivace musí proběhnout před všemi ostatními skripty, používáme speciální označení před_skriptem. Dovolte mi tuto část trochu vysvětlit.
Příprava na instalaci analyzátoru:
- 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
Přidání úložišť PVS-Studio a analyzátorů:
- 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
Aktivace licence:
- pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
$PVS_NAME - Uživatelské jméno.
$PVS_KEY - produktový klíč.
Kde obnovit závislosti projektu $CI_PROJECT_DIR – úplná cesta k adresáři projektu:
- dotnet restore "$CI_PROJECT_DIR"/Path/To/Solution.sln
Pro správnou analýzu musí být projekt úspěšně sestaven a musí být obnoveny jeho závislosti (například je třeba stáhnout potřebné balíčky NuGet).
Proměnné prostředí obsahující licenční informace můžete nastavit kliknutím na nastavenía poté CI/CD.
V okně, které se otevře, najděte položku Proměnné, klikněte pravým tlačítkem na tlačítko Rozšířit a přidat proměnné. Výsledek by měl být následující:
Nyní můžeme přejít k analýze. Nejprve přidáme skript pro kompletní analýzu. K vlajce -t předat cestu k řešení příznaku -o napište cestu k souboru, kam se budou zapisovat výsledky analýzy. Zajímá nás také návratový kód. V tomto případě máme zájem o zastavení práce, když návratový kód obsahuje informaci, že během analýzy byla vydána varování. Takto vypadá úryvek:
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 principu bitové masky. Pokud byla například v důsledku analýzy vydána varování, návratový kód bude 8. Pokud platnost licence vyprší do měsíce, návratový kód bude 4. Pokud byly během analýzy nalezeny chyby a licence také vyprší do měsíce, ve zpětném kódu budou zapsány obě hodnoty: sečtěte čísla a dostanete konečný návratový kód - 8 + 4 = 12. Kontrolou odpovídajících bitů je tedy možné získat informace o různých stavech během analýzy. Návratové kódy jsou podrobněji popsány v části dokumentu pvs-studio-dotnet (Linux / macOS) Návratové kódy.
V tomto případě nás zajímají všechny návratové kódy, kde se objeví 8.
- exit_code=$((($exit_code & 8)/8))
Dostaneme 1, když návratový kód obsahuje bit čísla, který nás zajímá, jinak dostaneme 0.
Je čas přidat analýzu žádosti o sloučení. Než to uděláme, připravme si místo pro scénář. Potřebujeme, aby byl proveden pouze tehdy, když dojde k požadavku na sloučení. Vypadá to takto:
merge:
script:
only:
- merge_requests
Přejděme k samotnému scénáři. Setkal jsem se s tím, že virtuální stroj o ničem neví původ/mistr. Tak jí trochu pomozme:
- git fetch origin
Nyní získáme rozdíl větví a výsledek uložíme txt soubor:
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
Kde $CI_COMMIT_SHA – hash posledního odevzdání.
Dále zahájíme analýzu seznamu souborů pomocí příznaku -f. Přeneseme do něj dříve přijatý soubor .txt. Analogicky s úplnou analýzou se podíváme 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 pro kontrolu žádosti o sloučení bude vypadat 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
Zbývá pouze přidat převod protokolu poté, co všechny skripty fungovaly. Použití štítku after_script a užitečnost plog-konvertor:
after_script:
- plog-converter -t html -o eLog ./PVS-Studio.json
Užitečnost
Mimochodem, pokud chcete pohodlně pracovat se sestavou .json lokálně z IDE, pak doporučuji naše
Pro pohodlí zde .gitlab-ci.yml Celý:
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
Jakmile bude vše přidáno do souboru, klikněte na provést změny. Chcete-li zjistit, zda je vše v pořádku, přejděte na CI / CD -> Potrubí -> Běh. Otevře se okno virtuálního stroje, na jehož konci by mělo být následující:
viděl Job uspěl - úspěch, vše v pořádku. Nyní můžete vyzkoušet, co jste dokázali.
Pracovní příklady
Pro příklad práce si vytvořte jednoduchý projekt (in mistr), který bude obsahovat několik souborů. Poté v další větvi změníme pouze jeden soubor a pokusíme se vytvořit žádost o sloučení.
Uvažujme dva případy: kdy upravený soubor obsahuje chybu a kdy ne. Nejprve příklad s chybou.
Řekněme, že v hlavní větvi je soubor Program.cs, který neobsahuje chyby a v jiné větvi přidal vývojář chybný kód a chce podat žádost o sloučení. Jakou chybu udělal, není tak důležité, hlavní je, že existuje. Například jsem zapomněl operátora hod (Ano,
void MyAwesomeMethod(String name)
{
if (name == null)
new ArgumentNullException(....);
// do something
....
}
Podívejme se na výsledek rozboru příkladu s chybou. Abych se ujistil, že byl analyzován pouze jeden soubor, přidal jsem příznak -r na startovní čáru pvs-studio-dotnet:
Vidíme, že analyzátor našel chybu a neumožnil sloučení větví.
Podívejme se na příklad bez chyby. Oprava kódu:
void MyAwesomeMethod(String name)
{
if (name == null)
throw new ArgumentNullException(....);
// do something
....
}
Výsledky analýzy žádosti o sloučení:
Jak vidíme, nebyly nalezeny žádné chyby a provedení úlohy bylo úspěšné, což jsme chtěli zkontrolovat.
Závěr
Odplevelení špatného kódu před sloučením větví je velmi pohodlné a příjemné. Pokud tedy používáte CI/CD, zkuste to zkontrolovat pomocí statického analyzátoru. Navíc je to docela snadné.
Děkuji vám za pozornost.
Pokud chcete tento článek sdílet s anglicky mluvícím publikem, použijte prosím odkaz na překlad: Nikolay Mironov.
Zdroj: www.habr.com