Ji GitLab hez dikin û ji xeletiyan nefret dikin? Dixwazin kalîteya koda çavkaniya xwe baştir bikin? Wê hingê hûn hatine cîhê rast. Îro em ê ji we re vebêjin ka meriv çawa analîzkera PVS-Studio C# mîheng dike da ku daxwazên hevgirtinê kontrol bike. Ji her kesî re dilxweşiyek unikorn û xwendina dilxweş be.
Bi awayê, me PVS-Studio 7.08 derxist, ku tê de me gelek tişt kir
- Analyzer C# ji bo Linux û macOS;
- pêveka ji bo Rider;
- moda kontrolkirina lîsteya pelê ya nû.
Moda kontrolkirina lîsteya pelan
Berê, ji bo kontrolkirina hin pelan, pêdivî bû ku .xml bi navnîşek pelan re ji analîzer re derbas bibe. Lê ji ber ku ev ne pir hêsan e, me şiyana veguheztina .txt zêde kiriye, ku jiyanê pir hêsan dike.
Ji bo ku hûn pelên taybetî kontrol bikin, divê hûn ala diyar bikin --sourceFiles (-f) û .txt bi lîsteya pelan veguherînin. Ev wisa xuya dike:
pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.json
Ger hûn bala we dikişînin ku hûn serlêdanên kontrolê an jî kişandinê saz bikin, hûn dikarin vê yekê jî bi karanîna vê modê bikin. Cûdahî dê di wergirtina navnîşek pelan de be ku hûn analîz bikin û dê bi kîjan pergalên ku hûn bikar tînin ve girêdayî be.
Prensîba kontrolkirina daxwazek hevgirtinê
Ya bingehîn a kontrolê ev e ku meriv pê ewle bibe ku pirsgirêkên ku di dema yekbûnê de ji hêla analîstê ve têne kifş kirin nekevin nav mamoste gûlî. Em jî naxwazin her carê tevahiya projeyê analîz bikin. Digel vê yekê, dema ku şaxên hev dikin, navnîşek pelên guhertî me hene. Ji ber vê yekê, ez pêşniyar dikim ku kontrolek daxwaza yekbûnê lê zêde bike.
Berî ku analîzkerek statîk bicîh bîne, daxwazek hevgirtinê bi vî rengî xuya dike:
Ango hemû xeletiyên ku di şaxê de bûn guhertin, dê derbasî şaxa masterê bibe. Ji ber ku em ê vê yekê naxwazin, em analîzê zêde dikin, û naha diagram wiha xuya dike:
Em analîz dikin guhertin2 û, heke xeletî tune bin, em daxwaza yekbûnê qebûl dikin, wekî din em wê red dikin.
Bi awayê, heke hûn bala we dikişînin ku li ser pêkanînan analîz bikin û daxwazên ji bo C/C++ bikişînin, wê hingê hûn dikarin li ser wê bixwînin.
GitLab
Berî ku hûn dest bi analîzkirina daxwazên hevgirtinê bikin, hûn hewce ne ku projeya xwe tomar bikin û bar bikin. Heke hûn nizanin ka meriv çawa vê yekê dike, wê hingê ez pêşniyar dikim
bingotin. Rêbaza sazkirina jîngehê ku li jêr hatî destnîşan kirin yek ji wan mimkun e. Armanc ev e ku gavên ji bo sazkirina hawîrdora ku ji bo analîzê û destpêkirina analîzkerê hewce ne nîşan bide. Dibe ku di doza we de çêtir be ku hûn qonaxên amadekirina jîngehê (zêdekirina depoyan, sazkirina analîzerek) û analîzê ji hev veqetînin: Mînakî, amadekirina wêneyên Docker bi hawîrdora pêwîst û karanîna wan, an rêbazek din.
Ji bo baştir fêm bikin ka dê çi bibe, ez pêşniyar dikim ku li diyagrama jêrîn binêrim:
Analîzker ji bo xebitandina .NET Core SDK 3 hewce dike, ji ber vê yekê berî ku analîzker saz bikin hûn hewce ne ku depoyên Microsoft-ê yên ku pêgirêdanên ku ji bo analîzkerê hewce ne werin saz kirin lê zêde bikin. Zêdekirina depoyên Microsoft-ê ji bo belavkirinên cihêreng ên Linux
Ji bo ku PVS-Studio bi navgîniya rêveberê pakêtê saz bikin, hûn ê jî hewce bikin ku depoyên PVS-Studio zêde bikin. Zêdekirina depoyan ji bo belavkirinên cihêreng bi hûrgulî di nav de tête diyar kirin
Analîzker ji bo xebitandinê mifteyek lîsansê hewce dike. Hûn dikarin li ser destûrnameyek ceribandinê bistînin
bingotin. Ji kerema xwe not bikin ku moda xebitandinê ya diyarkirî (analîzkirina daxwazên hevgirtinê) destûrnameyek Enterprise hewce dike. Ji ber vê yekê, heke hûn dixwazin vê awayê xebitandinê biceribînin, ji bîr nekin ku di qada "Peyam" de destnîşan bikin ku hûn hewceyê destûrnameyek Enterprise ne.
Ger daxwazek hevgirtinê çêbibe, wê hingê em tenê hewce ne ku navnîşa pelên guhertî analîz bikin, wekî din em hemî pelan analîz bikin. Piştî analîzê, pêdivî ye ku em têketin bi forma ku em hewce ne veguherînin.
Naha, ku algorîtmaya xebatê li ber çavên we hebe, hûn dikarin derbasî nivîsandina senaryoyekê bibin. Ji bo vê yekê, hûn hewce ne ku pelê biguherînin .gitlab-ci.yml an jî, heke tune be, wê biafirîne. Ji bo afirandina wê, divê hûn li ser navê projeya xwe bikirtînin -> CI/CD saz bikin.
Niha em ji bo nivîsandina senaryoyê amade ne. Ka em pêşî koda ku dê analîzker saz bike binivîsin û destûrnameyê binivîsin:
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
Ji ber ku sazkirin û aktîvkirin divê berî hemî nivîsarên din pêk were, em etîketek taybetî bikar tînin before_script. Ez vê perçeyê hinekî rave bikim.
Amadekirina sazkirina analîzkerê:
- 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
Zêdekirina depo û analîzerê PVS-Studio:
- 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
Çalakkirina Lîsansê:
- pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
$PVS_NAME - Navê bikarhêner.
$PVS_KEY - mifteya hilberê.
Vegerandina girêdanên projeyê li ku derê $CI_PROJECT_DIR - riya tevahî ya pelrêça projeyê:
- dotnet restore "$CI_PROJECT_DIR"/Path/To/Solution.sln
Ji bo analîza rast, pêdivî ye ku proje bi serfirazî were çêkirin, û girêdanên wê bêne vegerandin (mînakî, pêdivî ye ku pakêtên NuGet-ê yên pêwîst werin dakêşandin).
Hûn dikarin bi tikandina guhêrbarên jîngehê yên ku agahdariya lîsansê vedihewînin destnîşan bikin mîhengê, û piştî - ser CI/CD.
Di pencereya ku vedibe de, babetekê bibînin guherbarên, bişkojka li aliyê rastê bitikîne Firehkirin û guherbaran lê zêde bike. Divê encam wiha xuya bike:
Niha hûn dikarin li ser analîzê biçin. Pêşîn, em ji bo analîzek bêkêmasî skrîptek lê zêde bikin. Li ala -t em rêya çareseriya alê derbas bikin -o riya pelê ku dê encamên analîzê tê de bêne nivîsandin binivîse. Em jî bi koda vegerê re eleqedar in. Di vê rewşê de, em eleqedar in ku operasyon bisekine dema ku koda vegerê agahdariya ku di dema analîzê de hişyarî hatine dayîn vedihewîne. Ev parçe dişibe vê:
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
Kodên vegerê li ser prensîba maskek piçûk dixebitin. Mînakî, heke di encama analîzê de hişyarî hatin dayîn, wê hingê koda vegerê dê bibe 8. Heke destûr di nav mehekê de biqede, wê hingê koda vegerê dê bibe 4. Heke di dema analîzê de xeletî hatin dîtin. û lîsans di nav mehekê de qediya, kod vedigere, dê her du nirx werin nivîsandin: jimareyan li hev zêde bikin û koda vegerê ya dawîn bistînin - 8+4=12. Bi vî rengî, bi kontrolkirina bitsên têkildar, di dema analîzê de agahdarî di derbarê rewşên cihêreng de têne wergirtin. Kodên vegerê di beşa "pvs-studio-dotnet (Linux / macOS) Kodên Vegerê" de bi hûrgulî têne vegotin.
Di vê rewşê de, em li hemî kodên vegerê yên ku 8 xuya dibin eleqedar in.
- exit_code=$((($exit_code & 8)/8))
Dema ku koda vegerê bit hejmara ku em jê re eleqedar in hebe, em ê 1 bistînin, wekî din em ê 0 bistînin.
Wext e ku meriv analîza daxwaza hevgirtinê zêde bike. Berî ku em vî karî bikin, werin em cîhek ji bo senaryoyê amade bikin. Em hewce ne ku ew tenê gava ku daxwazek hevgirtinê çêbibe were darve kirin. Ev wisa xuya dike:
merge:
script:
only:
- merge_requests
Ka em herin ser senaryoyê bixwe. Ez bi vê rastiyê re rû bi rû bûm ku makîneya virtual tiştek pê nizane eslê/master. Ji ber vê yekê em hinekî alîkariya wê bikin:
- git fetch origin
Naha em cûdahiya di navbera şaxan de digirin û encamê tê de tomar dikin txt dosî:
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
Derê $CI_COMMIT_SHA - hash ji commit dawî.
Dûv re, em dest bi analîzkirina navnîşa pelan bi karanîna ala dikin -f. Em pela .txt ya ku berê hatî wergirtin veguhezînin wê. Welê, bi analogî digel analîza tevahî, em li kodên vegerê dinêrin:
- 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
Skrîpta bêkêmasî ya ji bo kontrolkirina daxwazek hevgirtinê dê wiha xuya bike:
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
Tiştê ku dimîne ev e ku meriv veguheztina têketinê lê zêde bike piştî ku hemî nivîsar hatin pêvajo kirin. Em labelê bikar tînin after_script û bikêrhatî plog-converter:
after_script:
- plog-converter -t html -o eLog ./PVS-Studio.json
Utility
Bi awayê, heke hûn dixwazin bi rehetî bi raporên .json ên herêmî yên ji IDE re bixebitin, wê hingê ez pêşniyar dikim
Ji bo rehetiyê, li vir e .gitlab-ci.yml bi tevahî:
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
Piştî ku we her tişt li pelê zêde kir, li ser bikirtînin Guhertinan pêk bînin. Ji bo ku hûn bibînin ku her tişt rast e, biçin CI / CD -> Pipeline -> bi bez. Dê pencereyek makîneya virtual vebe, ku di dawiya wê de divê jêrîn hebe:
birrek Kar bi ser ket - Serkeftin, her tişt baş e. Niha hûn dikarin tiştên ku we kirine biceribînin.
Mînakên xebatê
Ji bo mînakek xebatê, werin em projeyek hêsan biafirînin (di mamoste) ku dê çend pelan tê de hebe. Piştî wê, di şaxek din de em ê tenê pelek biguhezînin û hewl bidin ku daxwaznameyek hevgirtinê bikin.
Ka em du rewşan binirxînin: gava pelê hatî guherandin xeletiyek heye û kengê na. Pêşîn, mînakek bi xeletiyek.
Em bibêjin di şaxa masterê de dosyayek heye Program.cs, ku xeletî tê de tune, lê di şaxek din de pêşdebir kodek xelet lê zêde kir û dixwaze daxwazek yekbûnê bike. Kîjan xeletiya wî kiriye ne ew çend girîng e, ya sereke ew e ku ew heye. Mînakî, operator ji bîr kir avêtin (Erê,
void MyAwesomeMethod(String name)
{
if (name == null)
new ArgumentNullException(....);
// do something
....
}
Ka em li encama analîzkirina mînakek bi xeletî binêrin. Di heman demê de ji bo ku ez piştrast bikim ku tenê pelek hate pars kirin, min al lê zêde kir -r ji bo xeta destpêkirina pvs-studio-dotnet:
Em dibînin ku analîzator xeletiyek dît û destûr neda yekbûna şaxan.
Ka em nimûneyê bêyî xeletî kontrol bikin. Rastkirina kodê:
void MyAwesomeMethod(String name)
{
if (name == null)
throw new ArgumentNullException(....);
// do something
....
}
Encamên analîza daxwaza yekgirtinê:
Wekî ku em dibînin, tu xelet nehatin dîtin, û pêkanîna peywirê serketî bû, ya ku me dixwest em kontrol bikin ev e.
encamê
Berê hevgirtina şaxan, koda xirab derxistin pir rehet û xweş e. Ji ber vê yekê heke hûn CI/CD bikar tînin, biceribînin ku analîzerek statîk bixin da ku kontrol bikin. Digel vê yekê, ev bi hêsanî tê kirin.
Spas ji bo baldariya te.
Heke hûn dixwazin vê gotarê bi temaşevanên îngilîzîaxêv re parve bikin, ji kerema xwe lînka wergerê bikar bînin: Nikolay Mironov.
Source: www.habr.com