GitLab gustatzen zaizu eta akatsak gorrotatzen dituzu? Zure iturburu-kodearen kalitatea hobetu nahi duzu? Orduan leku egokira etorri zara. Gaur esango dizugu nola konfiguratu PVS-Studio C# analizatzailea bateratze-eskaerak egiaztatzeko. Izan unicorn aldartea eta irakurketa zoriontsua guztiontzat.
Bide batez, PVS-Studio 7.08 kaleratu genuen, eta bertan gauza asko egin genituen
- C# analizatzailea Linux eta macOSentzat;
- Rider-erako plugina;
- fitxategien zerrenda egiaztatzeko modu berria.
Fitxategien zerrenda egiaztatzeko modua
Aurretik, zenbait fitxategi egiaztatzeko, beharrezkoa zen .xml bat fitxategien zerrenda batekin pasatzea analizatzaileari. Baina hau oso erosoa ez denez, .txt transferitzeko gaitasuna gehitu dugu, eta horrek bizitza oso erraz egiten du.
Fitxategi zehatzak egiaztatzeko, bandera zehaztu behar duzu --sourceFiles (-f) eta transferitu .txt fitxategien zerrenda batekin. Honela dirudi:
pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.json
Konpromiso-egiaztapena edo tira-eskaerak konfiguratzea interesatzen bazaizu, hori ere egin dezakezu modu hau erabiliz. Desberdintasuna aztertu beharreko fitxategien zerrenda lortzean izango da eta erabiltzen ari zaren sistemaren araberakoa izango da.
Bateratze-eskaera egiaztatzeko printzipioa
Egiaztapenaren funtsa da analizatzaileak bateratzean detektatu dituen arazoak ez direla bermatzea master adarra. Guk ere ez dugu proiektu osoa aztertu nahi aldi bakoitzean. Gainera, adarrak batzean, aldatutako fitxategien zerrenda dugu. Horregatik, bateratze-eskaeraren egiaztapena gehitzea proposatzen dut.
Hona hemen bateratze-eskaerak analizatzaile estatiko bat ezarri aurretik:
Hau da, adarrean zeuden akats guztiak aldaketak, maisu-adarra joango da. Hau nahi ez dugunez, analisia gehitzen dugu, eta orain diagramak honela dauka:
Aztertzen dugu aldaketak2 eta, akatsik ez badago, bateratze-eskaera onartzen dugu, bestela baztertzen dugu.
Bide batez, C/C++-rako konpromisoak eta tira-eskaerak aztertzea interesatzen bazaizu, horri buruz irakur dezakezu
GitLab
Bateratze-eskaerak aztertzen hasi aurretik, zure proiektua erregistratu eta igo behar duzu. Hau nola egin ez badakizu, gomendatzen dizut
Kontuan izan. Jarraian azaltzen den ingurunea ezartzeko metodoa da posibleetako bat. Helburua analisia egiteko eta analizatzailea abiarazteko beharrezkoa den ingurunea ezartzeko urratsak erakustea da. Agian zure kasuan hobeagoa izango litzateke ingurunea prestatzeko faseak (biltegiak gehitzea, analizatzaile bat instalatzea) eta analisia bereiztea: adibidez, Docker irudiak beharrezko ingurunearekin prestatzea eta horiek erabiltzea, edo beste metodoren bat.
Orain gertatuko dena hobeto ulertzeko, diagrama hau ikustea gomendatzen dut:
Analizatzaileak .NET Core SDK 3 behar du funtzionatzeko, beraz, analizatzailea instalatu baino lehen Microsoft-en biltegiak gehitu behar dituzu analizatzaileak behar dituen mendekotasunak instalatuko diren. Microsoft biltegiak gehitzea Linux banaketa ezberdinetarako
PVS-Studio pakete-kudeatzailearen bidez instalatzeko, PVS-Studio biltegiak ere gehitu beharko dituzu. Banaketa desberdinetarako biltegiak gehitzea xehetasun gehiagorekin deskribatzen da
Analizatzaileak lizentzia-gako bat behar du funtzionatzeko. Proba lizentzia helbidean lor dezakezu
Kontuan izan. Kontuan izan deskribatutako funtzionamendu moduak (batze-eskaeren azterketa) Enterprise lizentzia behar duela. Beraz, funtzionamendu modu hau probatu nahi baduzu, ez ahaztu "Mezua" eremuan Enterprise lizentzia behar duzula adieraztea.
Bateratze eskaera bat gertatzen bada, aldatutako fitxategien zerrenda soilik aztertu beharko dugu, bestela fitxategi guztiak aztertuko ditugu. Azterketa egin ondoren, erregistroak behar dugun formatura bihurtu behar ditugu.
Orain, lanaren algoritmoa begien aurrean duzula, gidoi bat idaztera pasa zaitezke. Horretarako, fitxategia aldatu behar duzu .gitlab-ci.yml edo, existitzen ez bada, sortu. Sortzeko, zure proiektuaren izenaren gainean klik egin behar duzu -> Konfiguratu CI/CD.
Orain prest gaude gidoia idazteko. Idatz dezagun lehenik analizatzailea instalatuko duen kodea eta sartu lizentzia:
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
Instalazioa eta aktibazioa beste script guztien aurretik gertatu behar direnez, etiketa berezi bat erabiltzen dugu aurretik_gidoia. Azaldu dezadan zati hau pixka bat.
Analizatzailea instalatzeko prestatzen:
- 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
PVS-Studio biltegiak eta analizatzailea gehitzea:
- 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
Lizentzia aktibatzea:
- pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
$PVS_NAME - Erabiltzaile izena.
$PVS_KEY - produktuaren gakoa.
Proiektuaren menpekotasunak berreskuratzea non $CI_PROJECT_DIR β proiektuaren direktoriorako bide osoa:
- dotnet restore "$CI_PROJECT_DIR"/Path/To/Solution.sln
Azterketa zuzena egiteko, proiektua behar bezala eraiki behar da, eta bere mendekotasunak leheneratu behar dira (adibidez, beharrezko NuGet paketeak deskargatu behar dira).
Lizentzien informazioa duten ingurune-aldagaiak ezar ditzakezu klik eginez Entorno, eta ondoren - on CI/CD.
Irekitzen den leihoan, bilatu elementua Variables, egin klik eskuineko botoian Zabaldu eta aldagaiak gehitu. Emaitza honelakoa izan beharko litzateke:
Orain azterketara pasa zaitezke. Lehenik eta behin, gehi dezagun analisi osoa egiteko script bat. Banderara -t banderaren konponbiderako bidea pasatzen dugu -o idatzi analisiaren emaitzak idatziko diren fitxategirako bidea. Itzultzeko kodea ere interesatzen zaigu. Kasu honetan, eragiketa geldiaraztea interesatzen zaigu itzulera-kodeak analisian zehar abisuak eman direlako informazioa daukanean. Hau da zati hau nolakoa den:
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
Itzultze-kodeek bit maskararen printzipioan funtzionatzen dute. Esaterako, analisiaren ondorioz abisuak eman badira, itzultzeko kodea 8ren berdina izango da. Lizentzia hilabeteko epean iraungitzen bada, itzultzeko kodea 4ren berdina izango da. Analisian akatsak hauteman badira, eta hilabeteko epean lizentzia iraungitzen da, kodea itzultzen da, bi balioak idatziko dira: gehitu zenbakiak eta lortu azken itzulera kodea - 8+4=12. Horrela, dagozkien bitak egiaztatuz, hainbat egoerari buruzko informazioa lor daiteke analisian zehar. Itzultzeko kodeak xehetasun gehiagorekin deskribatzen dira dokumentuko "pvs-studio-dotnet (Linux / macOS) Itzultzeko kodeak" atalean "
Kasu honetan, 8 agertzen den itzulera-kode guztiak interesatzen zaizkigu.
- exit_code=$((($exit_code & 8)/8))
1 jasoko dugu itzulera-kodeak interesatzen zaigun zenbakiaren bit-a daukanean, bestela 0 jasoko dugu.
Batzeko eskaeraren azterketa gehitzeko garaia da. Hau egin baino lehen, presta dezagun gidoirako leku bat. Bateratze eskaera bat gertatzen denean bakarrik exekutatu behar dugu. Honela dirudi:
merge:
script:
only:
- merge_requests
Goazen gidoiari berari. Makina birtualak ezer ez dakiela aurrean nengoen jatorria/maisu. Beraz, lagundu diezaiogun pixka bat:
- git fetch origin
Orain adarren arteko aldea lortuko dugu eta emaitza gordeko dugu txt fitxategia:
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
non $CI_COMMIT_SHA β azken konpromisoaren hash.
Ondoren, bandera erabiliz fitxategien zerrenda aztertzen hasiko gara -f. Aurretik jasotako .txt fitxategia bertara transferitzen dugu. Beno, analisi osoarekin analogia eginez, itzultzeko kodeak aztertuko ditugu:
- 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
Batze-eskaera egiaztatzeko script osoa honela izango da:
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
Gertatzen dena da log bihurketa gehitzea script guztiak prozesatu ondoren. Etiketa erabiltzen dugu ondoren_gidoia eta erabilgarritasuna plog-bihurgailua:
after_script:
- plog-converter -t html -o eLog ./PVS-Studio.json
Erabilgarritasuna
Bide batez, IDEtik lokalean .json txostenekin eroso lan egin nahi baduzu, orduan gure gomendatzen dizut.
Erosotasunagatik, hona hemen .gitlab-ci.yml osorik:
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
Fitxategian guztia gehitu ondoren, egin klik Konprometitu aldaketak. Dena zuzena dela ikusteko, joan hona CI/CD -> hodiak -> carrera. Makina birtualaren leiho bat irekiko da, eta horren amaieran honako hau egon beharko litzateke:
zerra Lanek arrakasta izan zuen - arrakasta, dena ondo dago. Orain egin duzuna probatu dezakezu.
Lan-adibideak
Lanaren adibide baterako, sor dezagun proiektu sinple bat (in master) hainbat fitxategi edukiko dituena. Horren ostean, beste adar batean fitxategi bakarra aldatuko dugu eta bateratze eskaera egiten saiatuko gara.
Azter ditzagun bi kasu: aldatutako fitxategiak errore bat duenean eta noiz ez. Lehenik eta behin, errore bat duen adibide bat.
Demagun adarreko maisuan fitxategi bat dagoela Programa.cs, akatsik ez duena, baina beste adar batean garatzaileak kode okerra gehitu zuen eta bateratze eskaera egin nahi du. Zer nolako akatsa egin zuen ez da hain garrantzitsua, gauza nagusia existitzen dela da. Adibidez, operadoreak ahaztu egin du bota (Bai,
void MyAwesomeMethod(String name)
{
if (name == null)
new ArgumentNullException(....);
// do something
....
}
Ikus dezagun errore batekin adibide bat aztertzearen emaitza. Gainera, fitxategi bakarra analizatu zela ziurtatzeko, bandera gehitu nuen -r pvs-studio-dotnet abiarazte lerrora:
Ikusten dugu analizatzaileak errore bat aurkitu zuela eta ez zuela adarrak batzen onartzen.
Ikus dezagun adibidea errorerik gabe. Kodea zuzentzea:
void MyAwesomeMethod(String name)
{
if (name == null)
throw new ArgumentNullException(....);
// do something
....
}
Bateratu eskaeraren analisiaren emaitzak:
Ikus dezakegunez, ez da akatsik aurkitu, eta zereginen exekuzioa arrakastatsua izan da, hori da egiaztatu nahi genuena.
Ondorioa
Adarrak batu aurretik kode txarra kentzea oso erosoa eta atsegina da. Beraz, CI/CD erabiltzen ari bazara, saiatu analizatzaile estatiko bat txertatzen egiaztatzeko. Gainera, hau nahiko sinplea da.
Eskerrik asko zure arretagatik.
Artikulu hau ingelesez hitz egiten duen publiko batekin partekatu nahi baduzu, mesedez, erabili itzulpen esteka: Nikolay Mironov.
Iturria: www.habr.com