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

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:

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

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 .
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 .
For at analysatoren skal fungere, trengs en lisensnÞkkel. Du kan fÄ en prÞve lisens pÄ .
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.

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.slnSiden 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 updateLegger 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-dotnetAktivering 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.slnFor 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.

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:

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; fiReturkkodar 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.".
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_requestsLa 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 originNÄ fÄr vi forskjellen mellom grenene og lagrer resultatet i txt fil:
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txtHvor $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; fiDet 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_requestsDet 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.jsonVerktĂžy â 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" .
Forresten, hvis du Þnsker en praktisk mÄte Ä jobbe med .json-rapporten lokalt fra IDE, sÄ anbefaler jeg vÄr for IDE Rider. Bruken er beskrevet mer detaljert i .
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.jsonNÄ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:

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

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:

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.
Hvis du Þnsker Ä dele denne artikkelen med en engelsksprÄklig publikum, ber jeg deg bruke lenken til oversettelsen: Nikolay Mironov. .
Kilde: habr.com
