Analyse av merge requests i GitLab ved hjelp av PVS-Studio for C#

Analyse av merge request'er i GitLab ved hjelp av PVS-Studio for C#
Elsker du GitLab og hater feil? Vil du forbedre kvaliteten pÄ kildekoden? Da har du kommet til rett sted. I dag skal vi fortelle hvordan du setter opp C#-analysatoren PVS-Studio for Ä sjekke merge request'er. Ønsker alle et enestÄende humÞr og god lesning.

PVS-Studio - er et verktÞy for Ä avdekke feil og potensielle sÄrbarheter i kildekoden til programmer skrevet i sprÄk som C, C++, C# og Java. Det fungerer pÄ 64-biters systemer med Windows, Linux og macOS. Kan analysere kode beregnet for 32-biters, 64-biters og innebygde ARM-plattformer.

Forresten, vi har sluppet PVS-Studio 7.08, der vi har gjort mye spennende. interessante ting. For eksempel:

  • C#-analysator for Linux og macOS;
  • plugin for Rider;
  • ny modus for Ă„ sjekke filoversikter.

Modus for sjekk av filListe

Tidligere for Ä sjekke bestemte filer mÄtte man overlevere en .xml med filene til analysatoren. Men siden dette ikke er sÄ praktisk, har vi lagt til muligheten til Ä overlevere en .txt, noe som forenkler livet betydelig.

For Ă„ sjekke bestemte filer mĂ„ du spesifisere flagget —sourceFiles (for streaming av logger) og) og overlevere en .txt med filoversikten. Det ser slik ut:

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

Hvis du er interessert i Ä sette opp sjekk av commits eller pull requests, kan du ogsÄ gjÞre dette ved Ä bruke denne modusen. Forskjellen vil ligge i hvordan filoversikten for analysen hentes og avhenge av hvilke systemer du bruker.

Prinsippet for Ă„ sjekke merge request

Hovedpoenget med sjekken er at problemene som analysatoren avdekker, ikke havner i master grenen nÄr det slÄs sammen. Vi Þnsker heller ikke Ä analysere prosjektet i sin helhet hver gang. Dessuten har vi en liste over endrede filer ved sammenslÄing av grener. Derfor foreslÄr jeg Ä legge til sjekk pÄ merge request.

Slik ser en merge request ut fĂžr den statiske analysatoren er implementert:

Analyse av merge request'er i GitLab ved hjelp av PVS-Studio for C#
Det vil si at alle feil som var i grenen endringer, vil gÄ til mastergrenen. Siden vi ikke Þnsker dette, legger vi til analyser, og nÄ ser ordningen slik ut:

Analyse av merge request'er i GitLab ved hjelp av PVS-Studio for C#
Vi analyserer changes2 og hvis det ikke er feil, aksepterer vi merge request'en, ellers avviser vi den.

Forresten, hvis du er interessert i analyse av commits og pull request'er for C/C++, kan du lese om dette her.

GitLab

GitLab - et DevOps livssyklus webverktÞy med Äpen kildekode, som representerer et system for kilderepositorier for Git med egen wiki, feilsÞking system, CI/CD pipeline og andre funksjoner.

FÞr vi begynner med implementeringen av analysen av merge requests, mÄ du registrere deg og laste opp prosjektet ditt. Hvis du ikke vet hvordan du gjÞr dette, foreslÄr jeg artikkelen min kollega.

Merk. Metoden for Ä konfigurere miljÞet som beskrives videre, er en av mulighetene. MÄlet er Ä vise trinnene for Ä konfigurere det nÞdvendige miljÞet for analysen og kjÞre analysatoren. Det kan hende at det er mer optimalt i ditt tilfelle Ä dele forberedelsesfasene av miljÞet (legge til depoter, installere analysatoren) og analysen: for eksempel forberede Docker-bilder med nÞdvendig miljÞ og bruke dem eller en annen metode.

For bedre Ä forstÄ hva som nÄ vil skje, foreslÄr jeg at vi ser pÄ fÞlgende skjema:

Analyse av merge request'er i GitLab ved hjelp av PVS-Studio for C#
For at analysatoren skal fungere, kreves .NET Core SDK 3, sÄ fÞr installasjon av analysatoren mÄ du legge til Microsoft-depotene som de nÞdvendige avhengighetene for analysatoren skal installeres fra. Legg til Microsoft-depotene for forskjellige Linux-distribusjoner er beskrevet i det aktuelle dokumentet.

For Ä installere PVS-Studio via pakkeadministratoren mÄ du ogsÄ legge til PVS-Studio-depotene. Legg til depotene for de forskjellige distribusjonene er beskrevet mer detaljert i den aktuelle delen av dokumentasjonen.

For at analysatoren skal fungere, trengs en lisensnÞkkel. Du kan fÄ en prÞve lisens pÄ nedlastingssiden for analysatoren.

Merk. VÊr oppmerksom pÄ at for den beskrevne driftsmodusen (analyse av merge requests) kreves en Enterprise-lisens. SÄ hvis du Þnsker Ä prÞve denne driftsmodusen, mÄ du huske Ä angi at du trenger nettopp en Enterprise-lisens i "Melding"-feltet.

NÄr det skjer en merge request, mÄ vi bare analysere listen over endrede filer, ellers analyserer vi alle filene. Etter analysen mÄ vi konvertere loggene til det formatet vi trenger.

NÄ som vi har algoritmen foran oss, kan vi begynne Ä skrive skriptet. For Ä gjÞre dette, mÄ vi endre filen .gitlab-ci.yml eller, hvis den ikke eksisterer, opprette den. For Ä opprette den mÄ du klikke pÄ navnet pÄ prosjektet ditt -> Set up CI/CD.

Analyse av merge request'er i GitLab ved hjelp av PVS-Studio for C#
NĂ„ er vi klare til Ă„ skrive skriptet. La oss fĂžrst skrive koden som installerer analysatoren og legger inn lisensen:

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

Siden installasjonen og aktiveringen mÄ skje fÞr alle andre skript, bruker vi en spesiell etikett before_script. La meg forklare denne delen.

Forberedelse for installasjonen av analysatoren:

  - 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

Legger til PVS-Studio-repositorier og analysatoren:

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

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY

$PVS_NAME — brukernavn.

$PVS_KEY — produktnþkkel.

Gjenoppretting av prosjektavhengigheter der $CI_PROJECT_DIR – den fullstendige banen til prosjektkatalogen:

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

For korrekt analyse mÄ prosjektet bygges vellykket, og dets avhengigheter mÄ vÊre gjenopprettet (for eksempel mÄ nÞdvendige NuGet-pakker lastes ned).

For Ă„ angi miljĂžvariabler som inneholder lisensinformasjon, kan du klikke pĂ„ Setting, og deretter — pĂ„ CI / CD.

Analyse av merge request'er i GitLab ved hjelp av PVS-Studio for C#
I det Äpne vinduet finner vi alternativet Variabler, og deretter klikker vi pÄ knappen Expand og legger til variablene. Resultatet skal bli som fÞlger:

Analyse av merge request'er i GitLab ved hjelp av PVS-Studio for C#
NÄ kan vi gÄ videre til analysen. FÞrst legger vi til skriptet for full analyse. I flagget -t overfÞrer vi banen til lÞsningen, i flagget -o angir vi banen til filen der analyse-resultatene skal lagres. Vi er ogsÄ interessert i returkode. I dette tilfellet vil vi at jobben skal stopper nÄr returkoden indikerer at det under analysen ble gitt advarsler. Slik ser denne delen 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

Returkkodar fungerer pÄ prinsippet om bitmaske. For eksempel, hvis analysen har gitt advarsler, blir returkkoden lik 8. Hvis lisensen utlÞper i lÞpet av en mÄned, blir returkkoden lik 4. Hvis analysen derimot oppdager feil, og lisensen utlÞper i lÞpet av en mÄned, vil begge verdiene bli skrevet inn i returkkoden: summer tallene sammen og vi fÄr den totale returkkoden - 8+4=12. Dermed kan vi ved Ä sjekke de relevante bitene hente informasjon om forskjellige tilstander under analysen. Returkkodene er mer detaljert beskrevet i seksjonen "Returkkoder pvs-studio-dotnet (Linux / macOS)" i dokumentet.Sjekk av Visual Studio / MSBuild / .NET Core prosjekter fra kommandolinjen ved hjelp av PVS-Studio.".

I dette tilfellet er vi interessert i alle returkoder som inneholder 8.

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

Vi fÄr 1 nÄr returkkoden inneholder den biten av tallet vi er interessert i, ellers fÄr vi 0.

Det er pÄ tide Ä legge til analysen av merge request. FÞr vi gjÞr dette, forbereder vi et sted for skriptet. Vi trenger at det kun kjÞres nÄr en merge request skjer. Det ser slik ut:

merge:
  script:
  only:
  - merge_requests

La oss gÄ til selve skriptet. Jeg har mÞtt pÄ at den virtuelle maskinen ikke vet noe om origin/master. Derfor hjelper vi den litt:

  - git fetch origin

NÄ fÄr vi forskjellen mellom grenene og lagrer resultatet i txt fil:

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

Hvor $CI_COMMIT_SHA – hash for den siste commiten.

Deretter kjÞrer vi analysen av filene, ved Ä bruke flagget for streaming av logger) og. Vi sender den tidligere oppnÄdde .txt-filen. Og pÄ lignende mÄte, med full analysen, ser vi returkodene:

  - 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 komplette skriptet for Ă„ sjekke merge requests vil se slik ut:

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 gjenstÄr bare Ä legge til konvertering av loggen etter at alle skriptene er kjÞrt. Vi bruker merket after_script og verktÞyet plog-converter:

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

VerktĂžy plog-converter — er et open source-prosjekt som brukes til Ă„ konvertere feilmeldingsrapporter fra analyseverktĂžyet til ulike former, for eksempel HTML. En mer detaljert beskrivelse av verktĂžyet finnes i seksjonen "Plog Converter-verktĂžy" tilsvarende dokumentasjonsseksjon.

Forresten, hvis du Þnsker en praktisk mÄte Ä jobbe med .json-rapporten lokalt fra IDE, sÄ anbefaler jeg vÄr plugin for IDE Rider. Bruken er beskrevet mer detaljert i den aktuelle dokumentasjonen.

For enkelhets skyld er her .gitlab-ci.yml i sin helhet:

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

NÄr alt er lagt til i filen, klikker vi pÄ Commit changes. For Ä sjekke at alt er korrekt, gÄr vi til CI/CD -> Pipelines -> Running. Et vindu med den virtuelle maskinen Äpnes, hvor du til slutt bÞr se fÞlgende:

Analyse av merge request'er i GitLab ved hjelp av PVS-Studio for C#
Vi sĂ„ Job succeeded – suksess, alt er flott. NĂ„ kan vi teste det vi har gjort.

Eksempler pÄ arbeid

Som et eksempel pÄ arbeid skal vi lage et enkelt prosjekt (i master) hvor det vil vÊre flere filer. Deretter vil vi i en annen gren kun endre én fil og prÞve Ä lage en merge request.

La oss vurdere to tilfeller: nÄr den endrede filen inneholder en feil, og nÄr den ikke gjÞr det. FÞrst et eksempel med en feil.

Anta at det i master-grenen er en fil Program.cs, som ikke inneholder feil, men i en annen gren har utvikleren lagt til feil kode og Ăžnsker Ă„ lage en merge request. Hvilken nĂžyaktig feil han har gjort – er ikke sĂ„ viktig, det viktigste er at det finnes en. For eksempel glemte han operatoren throw (ja, slik kan man feile):

void MyAwesomeMethod(String name)
{
  if (name == null)
    new ArgumentNullException(....);
  // gjĂžr noe
  ....
}

La oss se pÄ resultatet av analysen av eksempelet med en feil. For Ä vÊre sikker pÄ at bare én fil ble analysert, la jeg til flagget -r i oppstartstrengen for pvs-studio-dotnet:

Analyse av merge request'er i GitLab ved hjelp av PVS-Studio for C#
Vi ser at analysatoren fant en feil og ikke lot merge-grenene gjennomfĂžres.

La oss sjekke eksemplet uten feil. Vi retter koden:

void MyAwesomeMethod(String name)
{
  if (name == null)
    throw new ArgumentNullException(....);
  // gjĂžr noe
  ....
}

Resultatene av analysen av merge request:

Analyse av merge request'er i GitLab ved hjelp av PVS-Studio for C#
Som vi ser, ble det ikke funnet noen feil, og oppgaven ble utfĂžrt vellykket, noe vi Ăžnsket Ă„ verifisere.

Konklusjon

Å filtrere ut dĂ„rlig kode fĂžr sammenfletting av grener er bĂ„de praktisk og behagelig. SĂ„ hvis du bruker CI/CD, bĂžr du vurdere Ă„ integrere en statisk analyseverktĂžy for sjekking. Det er dessuten ganske enkelt Ă„ fĂ„ til.

Takk for oppmerksomheten.

Analyse av merge request'er i GitLab ved hjelp av PVS-Studio for C#
Hvis du Þnsker Ä dele denne artikkelen med en engelsksprÄklig publikum, ber jeg deg bruke lenken til oversettelsen: Nikolay Mironov. Analysis of merge requests in GitLab using PVS-Studio for C#.

Kilde: habr.com

KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere | ProHoster