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.
Terloops, ons het PVS-Studio 7.08 vrygestel, waarin ons baie dinge gedoen het
- 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:
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:
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.
GitLab
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
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:
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
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
Die ontleder het 'n lisensiesleutel nodig om te werk. Jy kan 'n proeflisensie kry by
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.
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.
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:
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.
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
Terloops, as jy gerieflik met 'n .json-verslag plaaslik vanaf die IDE wil werk, dan stel ek voor ons
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:
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,
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:
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:
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.
As jy hierdie artikel met 'n Engelssprekende gehoor wil deel, gebruik asseblief die vertaalskakel: Nikolay Mironov.
Bron: will.com