
Ă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.
â Ă€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. 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.jsonOm 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:

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:

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. .
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Ä 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:

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 .
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 .
För att analyzern ska fungera krÀvs en licensnyckel. Du kan fÄ en provlicens pÄ .
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.

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.slnEftersom 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 updateLĂ€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-dotnetAktivering 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.slnFö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.

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:

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; fiReturkoder 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 "".
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_requestsLÄ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 originNu ska vi fÄ skillnaden mellan grenarna och spara resultatet i txt fil:
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txtDĂ€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; fiDet 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_requestsDet Ä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.jsonVerktyg â 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" .
För övrigt, om du vill arbeta bekvÀmt med .json-rapporten lokalt frÄn IDE, föreslÄr jag vÄr för IDE Rider. En mer detaljerad anvÀndning beskrivs i .
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.jsonSÄ 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:

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, ):
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:

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:

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.
Om du vill dela den hÀr artikeln med en engelsktalande publik, vÀnligen anvÀnd lÀnken till översÀttningen: Nikolay Mironov. .
KĂ€lla: habr.com
