Analys av merge request:er i GitLab med hjÀlp av PVS-Studio för C#

Analys av merge-begÀrningar i GitLab med PVS-Studio för C#
Älskar du GitLab och avskyr du fel? Vill du förbĂ€ttra kvaliteten pĂ„ din kĂ€llkod? DĂ„ har du kommit rĂ€tt. Idag berĂ€ttar vi hur man konfigurerar C#-analysatorn PVS-Studio för att kontrollera merge-begĂ€rningar. Alla önskas en magisk stĂ€mning och trevlig lĂ€sning.

PVS-Studio — Ă€r ett verktyg för att identifiera fel och potentiella sĂ„rbarheter i kĂ€llkoden för program skrivna pĂ„ C, C++, C# och Java. Det fungerar i 64-bitars system pĂ„ Windows, Linux och macOS. Det kan analysera kod avsedd för 32-bitars, 64-bitars och inbyggda ARM-plattformar.

För övrigt har vi slÀppt PVS-Studio 7.08, dÀr vi har gjort mycket. intressant.Juniper (MX/QFX/ACX)

  • C#-analysatorn för Linux och macOS;
  • plugin för Rider;
  • nytt lĂ€ge för filkontroll.

FilkontrolllÀge

Tidigare var det nödvÀndigt att överföra en .xml med en lista över filer för att kontrollera specifika filer. Men eftersom det inte Àr sÀrskilt bekvÀmt, har vi lagt till möjligheten att överföra .txt, vilket gör livet mycket enklare.

För att kontrollera specifika filer mĂ„ste man ange flaggan —sourceFiles (-f) och överföra en .txt med en lista över filer. Det ser ut sĂ„ hĂ€r:

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

Om du Àr intresserad av att stÀlla in kontroll av commits eller pull requests kan du ocksÄ göra det med detta lÀge. Skillnaden ligger i hur du fÄr listan över filer att analysera och beror pÄ vilka system du anvÀnder.

Principen för kontroll av merge-begÀrningar

Huvudsyftet med kontrollen Àr att problem som upptÀckts av analysatorn inte ska hamna i master grenen vid sammanslagning. Vi vill inte heller analysera hela projektet varje gÄng. Speciellt eftersom vi vid sammanslagning av grenar har en lista över Àndrade filer. DÀrför föreslÄr jag att vi lÀgger till kontroll av merge-begÀrningar.

SÄ hÀr ser en merge-begÀran ut före införandet av den statiska analysatorn:

Analys av merge-begÀrningar i GitLab med PVS-Studio för C#
Det vill sÀga alla fel som fanns i grenen changeskommer att överföras till huvudgrenen. Eftersom vi inte vill ha det sÄ, lÀgger vi till analys, och nu ser schemat ut sÄ hÀr:

Analys av merge-begÀrningar i GitLab med PVS-Studio för C#
Vi analyserar changes2 och om det inte finns nÄgra fel accepterar vi merge-begÀran, annars avvisar vi den.

För övrigt, om du Àr intresserad av analys av commits och pull requests för C/C++, kan du lÀsa om det hÀr. hÀr.

GitLab

GitLab — ett webbaserat DevOps-livscykelverktyg med öppen kĂ€llkod som erbjuder ett kĂ€llkodshanteringssystem för Git med en egen wiki, system för buggrapportering, CI/CD-pipeline och andra funktioner.

Innan vi pÄbörjar analysen av merge request:er mÄste du registrera dig och ladda upp ditt projekt. Om du inte vet hur du gör detta kan jag föreslÄ artikeln min kollega.

AnmÀrkning. Metoden som beskrivs nedan för att stÀlla in miljön Àr en av mÄnga möjliga. MÄlet Àr att visa stegen för att stÀlla in den nödvÀndiga miljön för analys och starta analyzern. I ditt fall kan det vara mer optimalt att dela upp stegen för att förbereda miljön (lÀgga till repositoryn, installera analyzern) och analys: till exempel förberedelse av Docker-bilder med nödvÀndig miljö och deras anvÀndning eller nÄgon annan metod.

För att mer tydligt förstÄ vad som kommer att hÀnda, föreslÄr jag att vi ser pÄ följande schema:

Analys av merge-begÀrningar i GitLab med PVS-Studio för C#
För att analyzern ska fungera krÀvs .NET Core SDK 3, sÄ innan vi installerar analyzern mÄste vi lÀgga till Microsoft-repositoryn dÀr nödvÀndiga beroenden för analyzern kommer att installeras. TillÀgg av Microsoft-repositoryn för olika Linux-distributioner beskrivs i den tillhörande dokumentationen..

För att installera PVS-Studio via paketförvaltaren mÄste vi ocksÄ lÀgga till PVS-Studio-repositoryn. TillÀgg av repositoryn för olika distributioner beskrivs mer ingÄende i den relevanta delen av dokumentationen..

För att analyzern ska fungera krÀvs en licensnyckel. Du kan fÄ en provlicens pÄ nedladdningssidan för analyzern..

AnmÀrkning. Observera att för den beskrivna driftsÀttningsmetoden (analys av merge requests) krÀvs en Enterprise-licens. SÄ om du vill prova denna driftsÀttningsmetod, kom ihÄg att ange att du behöver just en Enterprise-licens i fÀltet "Meddelande".

Om det sker en merge request behöver vi bara analysera listan över Àndrade filer, annars analyserar vi alla filer. Efter analysen mÄste vi konvertera loggarna till det format vi behöver.

Nu, med arbetsalgoritmen i Ätanke, kan vi börja skriva skriptet. För att göra detta mÄste vi Àndra filen .gitlab-ci.yml eller, om den inte finns, skapa den. För att skapa den klickar du pÄ namnet pÄ ditt projekt -> StÀll in CI/CD.

Analys av merge-begÀrningar i GitLab med PVS-Studio för C#
Nu Àr vi redo att börja skriva skriptet. LÄt oss först skriva koden som kommer att installera analyzern och ange licensen:

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

Eftersom installationen och aktiveringen ska ske före alla andra skript anvÀnder vi en speciell mÀrkning before_script. Jag ska förklara denna sektion lite mer.

Förberedelse för att installera analysatorn:

  - 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

LĂ€gg till PVS-Studio- och analysator-repositorier:

  - 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

Aktivering av licens:

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY

$PVS_NAME — anvĂ€ndarnamn.

$PVS_KEY — produktnyckel.

ÅterstĂ€llning av projektberoenden dĂ€r $CI_PROJECT_DIR – fullstĂ€ndig vĂ€g till projektkatalogen:

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

För att korrekt kunna analysera mÄste projektet byggas utan fel och dess beroenden mÄste vara ÄterstÀllda (till exempel mÄste de nödvÀndiga NuGet-paketen laddas ner).

Du kan stÀlla in miljövariabler som innehÄller licensinformation genom att klicka pÄ InstÀllning, och sedan pÄ CI / CD.

Analys av merge-begÀrningar i GitLab med PVS-Studio för C#
I det öppna fönstret hittar vi punkten Variabler, klicka till höger pÄ knappen Expandera och lÀgg till variabler. Det borde resultera i följande:

Analys av merge-begÀrningar i GitLab med PVS-Studio för C#
Nu kan vi gÄ vidare till analysen. Först lÀgger vi till skriptet för en fullstÀndig analys. I flaggan -t anger vi vÀgen till lösningen, i flaggan -o anger vi vÀgen till filen dÀr analysresultaten ska skrivas. Vi Àr ocksÄ intresserade av returkoden. I det hÀr fallet Àr vi intresserade av att processen stoppas nÀr returkoden indikerar att varningar gavs under analysen. SÄ hÀr ser denna sektion ut:

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

Returkoder fungerar enligt principen för bitmaskar. Till exempel, om varningar utfĂ€rdas som resultat av analysen kommer returkoden att vara 8. Om licensen löper ut inom en mĂ„nad kommer returkoden att vara 4. Om analysen upptĂ€cker fel och licensen dessutom löper ut inom en mĂ„nad, kommer bĂ„da vĂ€rdena att inkluderas i returkoden: vi adderar siffrorna och fĂ„r den slutliga returkoden — 8+4=12. Genom att kontrollera de relevanta bitarna kan vi fĂ„ information om olika tillstĂ„nd under analysen. Returkoderna beskrivs mer ingĂ„ende i avsnittet "Returkoder för pvs-studio-dotnet (Linux / macOS)" i dokumentet "Kontroll av Visual Studio / MSBuild / .NET Core-projekt frĂ„n kommandoraden med hjĂ€lp av PVS-Studio".

I det hÀr fallet Àr vi intresserade av alla returkoder som innehÄller 8.

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

Vi fÄr 1 nÀr returkoden innehÄller den bit av nummer som intresserar oss, annars fÄr vi 0.

Det Àr dags att lÀgga till analys av merge request. Innan vi gör det förbereder vi plats för skriptet. Vi behöver att det bara körs nÀr en merge request görs. Det ser ut sÄ hÀr:

merge:
  script:
  only:
  - merge_requests

LÄt oss gÄ vidare till sjÀlva skriptet. Jag stötte pÄ att den virtuella maskinen inte vet nÄgot om origin/master. DÀrför hjÀlper vi den lite:

  - git fetch origin

Nu ska vi fÄ skillnaden mellan grenarna och spara resultatet i txt fil:

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

DĂ€r $CI_COMMIT_SHA – hash för den senaste commiten.

DÀrefter kör vi analysen av filerna, med hjÀlp av flaggan -f. Vi skickar in den tidigare erhÄllna .txt-filen. Och pÄ samma sÀtt som med den fullstÀndiga analysen kontrollerar vi returkoderna:

  - 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

Det fullstÀndiga skriptet för att kontrollera merge request ser ut sÄ hÀr:

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

Det ÄterstÄr bara att lÀgga till konvertering av loggen efter att alla skript har körts. AnvÀnd etiketten after_script och verktyget plog-converter:

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

Verktyg plog-converter — ett open source-projekt som anvĂ€nds för att konvertera felrapporten frĂ„n analysatorn till olika format, till exempel HTML. En mer detaljerad beskrivning av verktyget finns i avsnittet "Plog Converter Utility" den motsvarande avsnittet i dokumentationen.

För övrigt, om du vill arbeta bekvÀmt med .json-rapporten lokalt frÄn IDE, föreslÄr jag vÄr plugin för IDE Rider. En mer detaljerad anvÀndning beskrivs i det motsvarande dokumentet.

För bekvÀmlighetens skull hÀr Àr .gitlab-ci.yml hela:

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

SÄ snart vi lagt till allt i filen, klickar vi pÄ Commit changes. För att se att allt Àr korrekt, gÄr vi in i CI/CD -> Pipeline -> Running. Ett fönster för den virtuella maskinen öppnas dÀr det vid slutet ska stÄ följande:

Analys av merge-begÀrningar i GitLab med PVS-Studio för C#
Vi sĂ„g Job succeeded – framgĂ„ng, allt Ă€r utmĂ€rkt. Nu kan vi testa det som gjorts.

Exempel pÄ arbete

Som ett arbets exempel kommer vi att skapa ett enkelt projekt (i master) dÀr det kommer att finnas flera filer. Efter detta Àndrar vi endast en fil i en annan gren och försöker göra en merge-begÀran.

Vi övervÀger tvÄ fall: nÀr den Àndrade filen innehÄller ett fel och nÀr den inte gör det. Först exemplet med ett fel.

Anta att det i master-grenen finns en fil Program.cs, som inte innehĂ„ller nĂ„gra fel, men i en annan gren har utvecklaren lagt till felaktig kod och vill göra en merge-begĂ€ran. Vilket fel han har gjort spelar mindre roll – det viktiga Ă€r att det finns. Till exempel glömde han operatorn throw (ja, sĂ„ gör man misstag):

void MyAwesomeMethod(String name)
{
  if (name == null)
    new ArgumentNullException(....);
  // gör nÄgot
  ....
}

LÄt oss titta pÄ resultatet av analysen av exemplet med fel. För att ocksÄ försÀkra oss om att endast en fil analyserades har jag lagt till flaggan -r i kommandoraden för pvs-studio-dotnet:

Analys av merge-begÀrningar i GitLab med PVS-Studio för C#
Vi ser att analysatorn har hittat ett fel och inte tillÄtit en sammanslagning av grenarna.

Vi kontrollerar exemplet utan fel. Koden korrigeras:

void MyAwesomeMethod(String name)
{
  if (name == null)
    throw new ArgumentNullException(....);
  // gör nÄgot
  ....
}

Resultat av analysen av merge-begÀran:

Analys av merge-begÀrningar i GitLab med PVS-Studio för C#
Som vi ser har inga fel hittats och uppgiften har genomförts framgÄngsrikt, vilket vi ville kontrollera.

Slutsats

Att filtrera bort dÄlig kod före sammanslagning av grenar Àr mycket bekvÀmt och trevligt. SÄ om du anvÀnder CI/CD, försök integrera en statisk analysator för kontroll. Dessutom görs det ganska enkelt.

Tack för uppmÀrksamheten.

Analys av merge-begÀrningar i GitLab med PVS-Studio för C#
Om du vill dela den hÀr artikeln med en engelsktalande publik, vÀnligen anvÀnd lÀnken till översÀttningen: Nikolay Mironov. Analys av merge-begÀrningar i GitLab med PVS-Studio för C#.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster