Nahigugma sa GitLab ug nagdumot sa mga bug? Gusto nga mapauswag ang kalidad sa imong source code? Unya mianhi ka sa hustong dapit. Karon isulti namon kanimo kung giunsa ang pag-configure sa PVS-Studio C# analyzer aron masusi ang mga hangyo sa paghiusa. Pagbaton og unicorn mood ug malipayong pagbasa sa tanan.
Pinaagi sa dalan, gipagawas namon ang PVS-Studio 7.08, diin daghang mga butang ang among nahimo
- C # analyzer alang sa Linux ug macOS;
- plugin alang sa Rider;
- bag-ong file checking mode.
Pagsusi sa lista sa file mode
Kaniadto, aron masusi ang pipila ka mga file, kinahanglan nga ipasa ang usa ka .xml nga adunay usa ka lista sa mga file sa tig-analisar. Apan tungod kay kini dili kaayo kombenyente, among gidugang ang abilidad sa pagbalhin sa .txt, nga naghimo sa kinabuhi nga yano kaayo.
Aron masusi ang piho nga mga file, kinahanglan nimong ipiho ang bandila --sourceFiles (-f) ug ibalhin ang .txt nga adunay lista sa mga file. Murag mao ni:
pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.json
Kung interesado ka sa pag-set up sa commit checking o pull requests, mahimo usab nimo kana gamit kini nga mode. Ang kalainan mao ang pagkuha sa usa ka lista sa mga file aron analisahon ug magdepende kung unsang mga sistema ang imong gigamit.
Ang prinsipyo sa pagsusi sa usa ka hangyo sa paghiusa
Ang panguna nga esensya sa tseke mao ang pagsiguro nga ang mga problema nga nakit-an sa analisador sa panahon sa paghiusa dili mahulog sa agalon sanga. Dili usab namo gusto nga analisahon ang tibuok proyekto matag higayon. Dugang pa, kung maghiusa sa mga sanga, kami adunay usa ka lista sa nabag-o nga mga file. Busa, gisugyot nako ang pagdugang usa ka pagsusi sa hangyo sa paghiusa.
Mao kini ang hitsura sa usa ka hangyo sa paghiusa sa wala pa ipatuman ang usa ka static analyzer:
Kana mao, ang tanan nga mga sayup nga naa sa sanga mga kausaban, mobalhin sa master branch. Tungod kay dili namo gusto kini, among gidugang ang pagtuki, ug karon ang diagram ingon niini:
Pagtuki pagbag-o2 ug, kung walay mga kasaypanan, among dawaton ang hangyo sa paghiusa, kung dili, among isalikway kini.
Pinaagi sa dalan, kung interesado ka sa pag-analisar sa mga commit ug pagbitad sa mga hangyo alang sa C / C ++, mahimo nimong basahon ang bahin niini
GitLab
Sa dili ka pa magsugod sa pag-analisar sa mga hangyo sa paghiusa, kinahanglan nimo nga magparehistro ug mag-upload sa imong proyekto. Kung wala ka mahibal-an kung giunsa kini buhaton, gisugyot ko
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅. Ang pamaagi sa pagpahimutang sa palibot nga gihulagway sa ubos usa sa mga posible. Ang tumong mao ang pagpakita sa mga lakang sa pagpahimutang sa palibot nga gikinahanglan alang sa pagtuki ug paglansad sa analisador. Tingali sa imong kaso mas maayo nga ibulag ang mga yugto sa pag-andam sa kalikopan (pagdugang mga repository, pag-install sa usa ka analista) ug pagtuki: pananglitan, pag-andam sa mga imahe sa Docker nga adunay kinahanglan nga palibot ug paggamit niini, o uban pang pamaagi.
Aron mas masabtan kung unsa ang mahitabo karon, gisugyot nako nga tan-awon ang mosunod nga diagram:
Ang analista nagkinahanglan sa .NET Core SDK 3 sa pag-operate, mao nga sa dili pa i-install ang analyzer kinahanglan nimo nga idugang ang mga Microsoft repository diin ang mga dependency nga gikinahanglan alang sa analyzer i-install. Pagdugang mga repositoryo sa Microsoft alang sa lainlaing mga distribusyon sa Linux
Aron ma-install ang PVS-Studio pinaagi sa manager sa package, kinahanglan usab nimo nga idugang ang mga repositoryo sa PVS-Studio. Ang pagdugang sa mga repository alang sa lainlaing mga pag-apod-apod gihulagway sa mas detalyado sa
Ang analista nanginahanglan usa ka yawe sa lisensya aron makalihok. Makuha nimo ang lisensya sa pagsulay sa
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅. Palihug timan-i nga ang gihulagway nga paagi sa operasyon (pagtuki sa mga hangyo sa paghiusa) nanginahanglan usa ka lisensya sa Enterprise. Busa, kung gusto nimong sulayan kini nga paagi sa operasyon, ayaw kalimti nga ipakita sa uma nga "Mensahe" nga kinahanglan nimo ang lisensya sa Enterprise.
Kung mahitabo ang usa ka hangyo sa paghiusa, nan kinahanglan ra namon nga analisahon ang lista sa nabag-o nga mga file, kung dili, analisahon namon ang tanan nga mga file. Human sa pagtuki, kinahanglan natong i-convert ang mga troso ngadto sa format nga atong gikinahanglan.
Karon, nga adunay algorithm sa trabaho sa atubangan sa imong mga mata, mahimo ka magpadayon sa pagsulat sa usa ka script. Aron mahimo kini, kinahanglan nimo nga usbon ang file .gitlab-ci.yml o, kung wala kini, buhata kini. Aron mahimo kini, kinahanglan nimo nga i-klik ang ngalan sa imong proyekto -> I-set up ang CI/CD.
Karon andam na kami sa pagsulat sa script. Isulat una nato ang code nga mag-install sa analisador ug mosulod sa lisensya:
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
Tungod kay ang pag-instalar ug pagpaaktibo kinahanglan mahitabo sa wala pa ang tanan nga uban pang mga script, naggamit kami usa ka espesyal nga label before_script. Tugoti ako nga ipasabut kini nga tipik.
Pag-andam sa pag-instalar sa analisador:
- 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
Pagdugang sa mga repositoryo ug analista sa 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
Pagpaaktibo sa lisensya:
- pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
$PVS_NAME - Username.
$PVS_KEY - yawe sa produkto.
Pagbawi sa mga dependency sa proyekto kung diin $CI_PROJECT_DIR β bug-os nga dalan sa direktoryo sa proyekto:
- dotnet restore "$CI_PROJECT_DIR"/Path/To/Solution.sln
Para sa husto nga pagtuki, ang proyekto kinahanglang matukod nga malampuson, ug ang mga dependency niini kinahanglang ibalik (pananglitan, ang gikinahanglan nga mga pakete sa NuGet kinahanglang ma-download).
Mahimo nimong itakda ang mga variable sa palibot nga adunay kasayuran sa lisensya pinaagi sa pag-klik setting, ug pagkahuman - sa CI/CD.
Sa bintana nga nagbukas, pangitaa ang butang Mga variables, i-klik ang buton sa tuo Expand ug idugang ang mga variable. Ang resulta kinahanglan nga tan-awon sama niini:
Karon mahimo ka magpadayon sa pag-analisar. Una, magdugang ta og script para sa kompleto nga pagtuki. Ngadto sa bandera -t atong ipasa ang dalan ngadto sa solusyon sa bandila -o isulat ang dalan sa file diin ang mga resulta sa pagtuki isulat. Interesado usab kami sa return code. Sa kini nga kaso, interesado kami sa paghunong sa operasyon kung ang code sa pagbalik adunay kasayuran nga ang mga pasidaan gihatag sa panahon sa pag-analisar. Mao kini ang hitsura niini nga tipik:
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
Ang mga code sa pagbalik nagtrabaho sa prinsipyo sa usa ka gamay nga maskara. Pananglitan, kung ang mga pasidaan gi-isyu ingon usa ka sangputanan sa pag-analisar, nan ang pagbalik code mahimong katumbas sa 8. Kung ang lisensya matapos sa sulod sa usa ka bulan, nan ang pagbalik code mahimong katumbas sa 4. Kung ang mga sayup nakit-an sa panahon sa pag-analisar, ug ang lisensya matapos sa sulod sa usa ka bulan, ang pagbalik sa code, ang duha nga mga kantidad isulat: idugang ang mga numero ug makuha ang katapusan nga code sa pagbalik - 8 + 4 = 12. Sa ingon, pinaagi sa pagsusi sa katugbang nga mga piraso, ang kasayuran bahin sa lainlaing mga estado mahimong makuha sa panahon sa pagtuki. Ang mga return code gihulagway sa mas detalyado sa "pvs-studio-dotnet (Linux / macOS) Return Codes" nga seksyon sa dokumento "
Sa kini nga kaso, interesado kami sa tanan nga mga code sa pagbalik kung diin makita ang 8.
- exit_code=$((($exit_code & 8)/8))
Makadawat kami og 1 kung ang code sa pagbalik adunay gamay nga numero nga among interesado, kung dili makadawat kami 0.
Panahon na aron idugang ang pag-analisar sa hangyo sa paghiusa. Sa dili pa nato kini buhaton, mag-andam kita og dapit alang sa script. Kinahanglan namon kini nga ipatuman lamang kung adunay mahitabo nga hangyo sa paghiusa. Murag mao ni:
merge:
script:
only:
- merge_requests
Mopadayon kita sa script mismo. Nag-atubang ako sa kamatuoran nga ang virtual machine walaβy nahibal-an bahin sa bisan unsa gigikanan/agalon. Busa tabangan ta siya gamay:
- git fetch origin
Karon atong makuha ang kalainan tali sa mga sanga ug i-save ang resulta txt file:
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
Diin $CI_COMMIT_SHA β hash sa katapusang commit.
Sunod, magsugod kami sa pag-analisar sa lista sa mga file gamit ang bandila -f. Among gibalhin ang nadawat nga .txt file ngadto niini. Aw, pinaagi sa pagtandi sa bug-os nga pag-analisar, gitan-aw namon ang mga code sa pagbalik:
- 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
Ang kompleto nga script alang sa pagsusi sa usa ka hangyo sa paghiusa mahimong sama niini:
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
Ang nahabilin mao ang pagdugang sa pagbag-o sa log pagkahuman naproseso ang tanan nga mga script. Gigamit namon ang label pagkahuman_script ug utility tigbalhin-balhin:
after_script:
- plog-converter -t html -o eLog ./PVS-Studio.json
Gamit
Pinaagi sa dalan, kung gusto nimo nga dali nga magtrabaho kauban ang .json nga mga taho sa lokal gikan sa IDE, unya gisugyot ko ang among
Alang sa kasayon, ania kini .gitlab-ci.yml sa bug-os nga:
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
Kung nadugang na nimo ang tanan sa file, pag-klik Ipasalig ang mga pagbag-o. Aron makita nga husto ang tanan, adto sa CI / CD -> Pipelines -> pagdagan. Ang usa ka bintana sa virtual machine maablihan, sa katapusan nga kinahanglan adunay mga musunud:
Nakita Milampos si Job - kalampusan, ang tanan maayo. Karon mahimo nimong sulayan kung unsa ang imong nahimo.
Mga pananglitan sa trabaho
Alang sa usa ka pananglitan sa trabaho, maghimo kita usa ka yano nga proyekto (sa agalon) nga adunay daghang mga file. Pagkahuman niana, sa lain nga sanga usbon namon ang usa ra ka file ug sulayan nga maghimo usa ka hangyo sa paghiusa.
Atong tagdon ang duha ka mga kaso: kung ang giusab nga file adunay sulud ug kung wala. Una, usa ka pananglitan nga adunay sayup.
Ingnon ta nga adunay file sa master branch Program.cs, nga walay mga sayop, apan sa laing sanga ang developer midugang sa sayop nga code ug gusto sa paghimo sa usa ka merge request. Unsa nga matang sa sayop nga iyang nahimo dili kaayo importante, ang nag-unang butang mao nga kini anaa. Pananglitan, ang operator nakalimot paglabay (Oo,
void MyAwesomeMethod(String name)
{
if (name == null)
new ArgumentNullException(....);
// do something
....
}
Atong tan-awon ang resulta sa pag-analisar sa usa ka pananglitan nga adunay usa ka sayup. Aron masiguro usab nga usa ra ka file ang na-parse, gidugang nako ang bandila -r sa linya sa paglusad sa pvs-studio-dotnet:
Nakita namon nga ang analista nakit-an ang usa ka sayup ug wala gitugotan ang paghiusa sa mga sanga.
Atong susihon ang pananglitan nga walay sayup. Pagtul-id sa code:
void MyAwesomeMethod(String name)
{
if (name == null)
throw new ArgumentNullException(....);
// do something
....
}
Paghiusa sa mga resulta sa pagtuki sa hangyo:
Sama sa among nakita, walaβy nakit-an nga mga sayup, ug malampuson ang pagpatuman sa buluhaton, nga mao ang gusto namon susihon.
konklusyon
Ang pagtangtang sa dili maayo nga code sa dili pa maghiusa sa mga sanga labi ka kombenyente ug makapahimuot. Busa kung mogamit ka ug CI/CD, sulayi pag-embed ang usa ka static analyzer aron masusi. Dugang pa, kini gihimo sa yano nga paagi.
Salamat sa imong pagtagad.
Kung gusto nimong ipaambit kini nga artikulo sa usa ka tigpaminaw nga nagsultig English, palihug gamita ang link sa paghubad: Nikolay Mironov.
Source: www.habr.com