Analýza požadavků na sloučení v GitLab pomocí PVS-Studio pro C#

Analýza požadavků na sloučení v GitLab pomocí PVS-Studio pro C#
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í.

Studio PVS je nástroj pro odhalování chyb a potenciálních zranitelností ve zdrojovém kódu programů napsaných v C, C++, C# a Java. Funguje na 64bitových systémech na Windows, Linux a macOS. Dokáže analyzovat kód určený pro 32bitové, 64bitové a vestavěné platformy ARM.

Mimochodem, vydali jsme PVS-Studio 7.08, ve kterém jsme udělali spoustu věcí zajímavý. Například:

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

Analýza požadavků na sloučení v GitLab pomocí PVS-Studio pro C#
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:

Analýza požadavků na sloučení v GitLab pomocí PVS-Studio pro C#
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. zde.

GitLab

GitLab je open source webový nástroj životního cyklu DevOps, který poskytuje systém správy úložiště kódu pro Git s vlastní wiki, systémem sledování chyb, kanálem CI/CD a dalšími funkcemi.

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 Článek moje kolegyně.

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:

Analýza požadavků na sloučení v GitLab pomocí PVS-Studio pro C#
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 popsané v příslušném dokumentu.

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 odpovídající část dokumentace.

Aby analyzátor fungoval, potřebuje licenční klíč. Zkušební licenci můžete získat na stránka ke stažení analyzátoru.

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.

Analýza požadavků na sloučení v GitLab pomocí PVS-Studio pro C#
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.

Analýza požadavků na sloučení v GitLab pomocí PVS-Studio pro C#
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í:

Analýza požadavků na sloučení v GitLab pomocí PVS-Studio pro 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.Kontrola projektů Visual Studio / MSBuild / .NET Core z příkazového řádku pomocí PVS-Studio".

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 plog-konvertor je projekt s otevřeným zdrojovým kódem, který se používá k převodu hlášení chyb analyzátoru do různých forem, jako je HTML. Podrobnější popis nástroje naleznete v podsekci "Plog Converter Utility". odpovídající část dokumentace.

Mimochodem, pokud chcete pohodlně pracovat se sestavou .json lokálně z IDE, pak doporučuji naše Plugin pro IDE Rider. Jeho použití je podrobněji popsáno v příslušný dokument.

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

Analýza požadavků na sloučení v GitLab pomocí PVS-Studio pro 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, tak špatně):

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:

Analýza požadavků na sloučení v GitLab pomocí PVS-Studio pro C#
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í:

Analýza požadavků na sloučení v GitLab pomocí PVS-Studio pro C#
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.

Analýza požadavků na sloučení v GitLab pomocí PVS-Studio pro C#
Pokud chcete tento článek sdílet s anglicky mluvícím publikem, použijte prosím odkaz na překlad: Nikolay Mironov. Analýza požadavků na sloučení v GitLab pomocí PVS-Studio pro C#.

Zdroj: www.habr.com

Přidat komentář