Ontleding van samesmeltingsversoeke in GitLab met behulp van PVS-Studio vir C#

Ontleding van samesmeltingsversoeke in GitLab met behulp van PVS-Studio vir C#
Hou jy van GitLab en haat jy goggas? Wil jy die kwaliteit van jou bronkode verbeter? Dan het jy op die regte plek gekom. Vandag sal ons jou vertel hoe om die PVS-Studio C#-ontleder op te stel om samesmeltingsversoeke na te gaan. Voorspoed vir almal en lekker lees.

PVS-ateljee is 'n hulpmiddel vir die opsporing van foute en potensiële kwesbaarhede in die bronkode van programme geskryf in C, C++, C# en Java. Werk op 64-bis stelsels op Windows, Linux en macOS. Kan kode ontleed wat ontwerp is vir 32-bis, 64-bis en ingebedde ARM-platforms.

Terloops, ons het PVS-Studio 7.08 vrygestel, waarin ons baie dinge gedoen het interessant. Byvoorbeeld:

  • C#-ontleder vir Linux en macOS;
  • plugin vir Rider;
  • nuwe lêerlys kontroleermodus.

Lêerlyskontrolemodus

Voorheen, om sekere lêers na te gaan, was dit nodig om 'n .xml-lêer met 'n lys lêers na die ontleder deur te gee. Maar aangesien dit nie baie gerieflik is nie, het ons die vermoë bygevoeg om .txt oor te dra, wat die lewe aansienlik vergemaklik.

Om sekere lêers na te gaan, moet jy die vlag spesifiseer --bronlêers (-f) en gee .txt met 'n lys lêers deur. Dit lyk so:

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

As jy belangstel om commit-tjeks of trekversoeke op te stel, kan jy dit ook met hierdie modus doen. Die verskil sal wees in die verkryging van 'n lys lêers vir ontleding en sal afhang van watter stelsels jy gebruik.

Beginsel van samesmeltingsversoekkontrole

Die belangrikste essensie van die kontrole is om te verseker dat die probleme wat deur die ontleder opgespoor word, nie in die samesmelting val nie meester tak. Ons wil ook nie elke keer die hele projek ontleed nie. Verder, wanneer takke saamgevoeg word, het ons 'n lys van veranderde lêers. Daarom stel ek voor om 'n samesmeltingsversoekkontrole by te voeg.

Dit is hoe die samesmeltingsversoek lyk voor die bekendstelling van die statiese ontleder:

Ontleding van samesmeltingsversoeke in GitLab met behulp van PVS-Studio vir C#
Dit wil sê al die foute wat in die tak was veranderinge, sal na die meestertak skuif. Aangesien ons dit nie wil hê nie, voeg ons die analise by, en nou lyk die stroombaan so:

Ontleding van samesmeltingsversoeke in GitLab met behulp van PVS-Studio vir C#
Ons ontleed veranderinge 2 en, as daar geen foute is nie, aanvaar ons die samesmeltingsversoek, anders verwerp ons dit.

Terloops, as jy belangstel in die ontleding van commits en pull requests vir C/C++, dan kan jy daaroor lees. hier.

GitLab

GitLab is 'n oopbron DevOps-lewensikluswebhulpmiddel wat 'n kodebewaarplekbestuurstelsel vir Git bied met sy eie wiki, foutopsporingstelsel, CI/CD-pyplyn en ander kenmerke.

Voordat u voortgaan met die implementering van die ontleding van samesmeltingsversoeke, moet u registreer en u projek oplaai. As jy nie weet hoe om dit te doen nie, stel ek voor 'n artikel my kollega.

Let daarop. Die manier om die omgewing op te stel wat hieronder beskryf word, is een van die moontlikes. Die doel is om die stappe te wys vir die opstel van die omgewing wat nodig is vir ontleding en die bekendstelling van die ontleder. Miskien, in jou geval, sal dit meer optimaal wees om die stadiums van omgewingsvoorbereiding (byvoeging van bewaarplekke, installering van die ontleder) en analise te skei: byvoorbeeld die voorbereiding van Docker-beelde met die nodige omgewing en die gebruik daarvan, of op 'n ander manier.

Om beter te verstaan ​​wat nou gaan gebeur, stel ek voor om na die volgende diagram te kyk:

Ontleding van samesmeltingsversoeke in GitLab met behulp van PVS-Studio vir C#
Die ontleder vereis dat die .NET Core SDK 3 werk, dus voordat jy die ontleder installeer, moet jy die Microsoft-bewaarplekke byvoeg, waaruit die afhanklikhede wat nodig is vir die ontleder geïnstalleer sal word. Voeg Microsoft-bewaarplekke by vir verskeie Linux-verspreidings beskryf in die betrokke dokument.

Om PVS-Studio via die pakketbestuurder te installeer, sal jy ook die PVS-Studio-bewaarplekke moet byvoeg. Die byvoeging van bewaarplekke vir verskeie verspreidings word in meer besonderhede beskryf in ooreenstemmende afdeling van die dokumentasie.

Die ontleder het 'n lisensiesleutel nodig om te werk. Jy kan 'n proeflisensie kry by ontleder aflaai bladsy.

Let daarop. Neem asseblief kennis dat die beskryfde werkswyse (ontleding van samesmeltingsversoeke) 'n Enterprise-lisensie vereis. Daarom, as jy hierdie werkswyse wil probeer, in die "Boodskap"-veld, moenie vergeet om aan te dui dat jy 'n Enterprise-lisensie benodig nie.

As 'n samesmeltingsversoek plaasvind, moet ons slegs die lys veranderde lêers ontleed, anders ontleed ons alle lêers. Na ontleding moet ons die logboeke omskakel na die formaat wat ons benodig.

Nou, met die algoritme van werk voor ons oë, kan ons voortgaan om die skrif te skryf. Om dit te doen, moet jy die lêer verander .gitlab-ci.yml of, as dit nie bestaan ​​nie, skep dit. Om dit te skep, moet jy op die naam van jou projek klik -> Stel CI/CD op.

Ontleding van samesmeltingsversoeke in GitLab met behulp van PVS-Studio vir C#
Nou is ons gereed om die draaiboek te skryf. Kom ons skryf eers die kode wat die ontleder sal installeer en voer die lisensie in:

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

Aangesien installasie en aktivering voor alle ander skrifte moet plaasvind, gebruik ons ​​'n spesiale etiket voor_skrif. Kom ek verduidelik hierdie deel 'n bietjie.

Berei voor om die ontleder te installeer:

  - 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

Voeg PVS-Studio en ontlederbewaarplekke by:

  - 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

Lisensie aktivering:

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY

$PVS_NAME - Gebruikersnaam.

$PVS_KEY - produk sleutel.

Herstel projek afhanklikhede waar $CI_PROJECT_DIR - volledige pad na die projekgids:

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

Vir korrekte ontleding moet die projek suksesvol bou, en sy afhanklikhede moet herstel word (byvoorbeeld, die nodige NuGet-pakkette moet afgelaai word).

U kan omgewingsveranderlikes instel wat lisensie-inligting bevat deur op te klik Die opstel, en na-aan CI/CD.

Ontleding van samesmeltingsversoeke in GitLab met behulp van PVS-Studio vir C#
Soek die item in die venster wat oopmaak Veranderlikes, klik met die rechtermuisknop op die knoppie Uit te brei en voeg veranderlikes by. Die resultaat moet die volgende wees:

Ontleding van samesmeltingsversoeke in GitLab met behulp van PVS-Studio vir C#
Nou kan ons oorgaan na die ontleding. Kom ons voeg eers 'n skrif by vir 'n volledige ontleding. Na die vlag -t slaag die pad na oplossing na die vlag -o skryf die pad na die lêer waar die ontledingsresultate geskryf sal word. Ons stel ook belang in die terugsendingkode. In hierdie geval is ons geïnteresseerd om die werk te stop wanneer die terugkeerkode inligting bevat dat waarskuwings tydens die ontleding uitgereik is. Hier is hoe die brokkie lyk:

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

Retourkodes werk op die beginsel van 'n bietjie masker. Byvoorbeeld, as as gevolg van die ontleding waarskuwings uitgereik is, sal die terugsendingkode 8 wees. As die lisensie binne 'n maand verval, sal die terugsendingkode 4 wees. As foute tydens die ontleding gevind is, en die lisensie ook verval binne 'n maand, in die kode-opgawe, sal beide waardes geskryf word: tel die getalle bymekaar en kry die finale terugkeerkode - 8 + 4 = 12. Dus, deur die ooreenstemmende bisse na te gaan, is dit moontlik om inligting oor verskeie toestande tydens analise te verkry. Retourkodes word in meer besonderhede beskryf in die pvs-studio-dotnet (Linux / macOS) Retourkodes afdeling van die dokument.Kontroleer Visual Studio / MSBuild / .NET Core-projekte vanaf die opdragreël deur PVS-Studio te gebruik".

In hierdie geval stel ons belang in alle terugkeerkodes waar 8 verskyn.

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

Ons sal 1 kry wanneer die terugkeerkode die bietjie van die nommer bevat waarin ons belangstel, anders kry ons 0.

Dit is tyd om die samesmeltingsversoekontleding by te voeg. Voordat ons dit doen, laat ons 'n plek vir die draaiboek voorberei. Ons het nodig dat dit slegs uitgevoer word wanneer 'n samesmeltingversoek plaasvind. Dit lyk so:

merge:
  script:
  only:
  - merge_requests

Kom ons gaan aan na die skrif self. Ek het die feit teëgekom waarvan die virtuele masjien niks weet nie oorsprong/meester. So kom ons help haar 'n bietjie:

  - git fetch origin

Nou kry ons die verskil van die takke en stoor die resultaat in txt lêer:

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

waar $CI_COMMIT_SHA – hash van die laaste commit.

Vervolgens begin ons die ontleding van die lys lêers met behulp van die vlag -f. Ons dra die voorheen ontvangde .txt-lêer oor na dit. Wel, in analogie met die volledige ontleding, kyk ons ​​na die terugkeerkodes:

  - 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

Die volledige skrip om die samesmeltingsversoek na te gaan sal soos volg lyk:

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

Dit bly net om die log-omskakeling by te voeg nadat al die skrifte gewerk het. Die gebruik van die etiket na_skrif en nut plog-omskakelaar:

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

Nuts plog-omskakelaar is 'n oopbronprojek wat gebruik word om die ontlederfoutverslag in verskeie vorme soos HTML om te skakel. Vir 'n meer gedetailleerde beskrywing van die nut, sien die "Plog Converter Utility" subafdeling. ooreenstemmende afdeling van die dokumentasie.

Terloops, as jy gerieflik met 'n .json-verslag plaaslik vanaf die IDE wil werk, dan stel ek voor ons plugin vir IDE Rider. Die gebruik daarvan word in meer besonderhede beskryf in relevante dokument.

Vir gerief hier .gitlab-ci.yml hele:

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

Sodra alles by die lêer gevoeg is, klik op Verbind veranderinge. Om te sien of alles korrek is, gaan na CI / CD -> Pypleidings -> Running. Die virtuele masjienvenster sal oopmaak, aan die einde daarvan moet die volgende wees:

Ontleding van samesmeltingsversoeke in GitLab met behulp van PVS-Studio vir C#
gesien het Job het daarin geslaag - sukses, alles is reg. Nou kan jy toets wat jy gedoen het.

Werk voorbeelde

Vir 'n voorbeeld van werk, kom ons skep 'n eenvoudige projek (in meester) wat verskeie lêers sal bevat. Daarna, in 'n ander tak, sal ons slegs een lêer verander en probeer om 'n samesmeltingsversoek te maak.

Kom ons kyk na twee gevalle: wanneer die gewysigde lêer 'n fout bevat en wanneer dit nie. Eerstens 'n voorbeeld met 'n fout.

Kom ons sê daar is 'n lêer in die meestertak Program.cs, wat nie foute bevat nie, en in 'n ander tak het die ontwikkelaar foutiewe kode bygevoeg en wil 'n samesmeltingsversoek doen. Watter soort fout hy gemaak het is nie so belangrik nie, die hoofsaak is dat dit bestaan. Ek het byvoorbeeld die operateur vergeet gooi (Ja, so verkeerd):

void MyAwesomeMethod(String name)
{
  if (name == null)
    new ArgumentNullException(....);
  // do something
  ....
}

Kom ons kyk na die resultaat van die ontleding van 'n voorbeeld met 'n fout. Om seker te maak net een lêer is ontleed, het ek ook die vlag bygevoeg -r na die pvs-studio-dotnet-beginlyn:

Ontleding van samesmeltingsversoeke in GitLab met behulp van PVS-Studio vir C#
Ons sien dat die ontleder 'n fout gevind het en nie toegelaat het dat die takke saamgevoeg word nie.

Kom ons kyk na die voorbeeld sonder foute. Regstelling van die kode:

void MyAwesomeMethod(String name)
{
  if (name == null)
    throw new ArgumentNullException(....);
  // do something
  ....
}

Resultate van samesmeltingsversoekontleding:

Ontleding van samesmeltingsversoeke in GitLab met behulp van PVS-Studio vir C#
Soos ons kan sien, is geen foute gevind nie, en die uitvoering van die taak was suksesvol, dit is wat ons wou kontroleer.

Gevolgtrekking

Om slegte kode uit te roei voordat takke saamgevoeg word, is baie gerieflik en aangenaam. As jy dus CI/CD gebruik, probeer om 'n statiese ontleder in te sluit om dit na te gaan. Boonop word dit baie eenvoudig gedoen.

Dankie vir jou aandag.

Ontleding van samesmeltingsversoeke in GitLab met behulp van PVS-Studio vir C#
As jy hierdie artikel met 'n Engelssprekende gehoor wil deel, gebruik asseblief die vertaalskakel: Nikolay Mironov. Ontleding van samesmeltingsversoeke in GitLab met behulp van PVS-Studio vir C#.

Bron: will.com

Voeg 'n opmerking