
Cinta GitLab sareng hate bug? Hoyong ningkatkeun kualitas kode sumber anjeun? Teras anjeun parantos sumping ka tempat anu leres. Dinten ieu kami bakal ngabejaan ka maneh kumaha ngonpigurasikeun PVS-Studio C # analyzer pikeun pariksa requests ngagabung. Gaduh wanda unicorn sareng bagja maca ka sadayana.
— nyaéta alat pikeun ngaidentipikasi kasalahan sareng poténsi kerentanan dina kode sumber program anu ditulis dina C, C++, C#, sareng Java. Alat ieu tiasa dianggo dina sistem 64-bit. Windows, Linux и macOSÉta tiasa nganalisis kode anu nargétkeun platform 32-bit, 64-bit, sareng platform ARM anu dipasang.
Ku jalan kitu, kami ngarilis PVS-Studio 7.08, dimana urang ngalakukeun seueur hal . Contona:
- Analis C# di handapeun Linux и macOS;
- plugin pikeun Rider;
- modeu mariksa daptar file anyar.
Modeu pariksa daptar file
Saméméhna, pikeun mariksa file nu tangtu, éta diperlukeun pikeun lulus hiji .xml kalawan daptar file ka analyzer nu. Tapi saprak ieu teu pisan merenah, kami geus ditambahkeun kamampuhan pikeun mindahkeun .txt, nu ngajadikeun hirup basajan pisan.
Dina raraga pariksa file husus, anjeun kudu nangtukeun bandéra --sourceFiles (-f) jeung mindahkeun .txt kalawan daptar file. Sigana mah kieu:
pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.jsonUpami anjeun kabetot dina nyetél commit checking atanapi pull requests, anjeun ogé tiasa ngalakukeun éta nganggo mode ieu. Bédanana nyaéta pikeun kéngingkeun daptar file pikeun dianalisis sareng bakal gumantung kana sistem naon anu anjeun anggo.
Prinsip mariksa pamundut gabungan
Hakekat utama pamariksaan nyaéta pikeun mastikeun yén masalah anu dideteksi ku analisa nalika ngahiji henteu digolongkeun kana ngawasaan dahan. Urang ogé teu hayang nganalisis sakabéh proyék unggal waktu. Sumawona, nalika ngahijikeun cabang, urang gaduh daptar file anu dirobih. Ku alatan éta, kuring nyarankeun nambahkeun cék pamundut gabungan.
Ieu mangrupikeun pamundut gabungan sateuacan nerapkeun analisa statik:

Nyaéta, sagala kasalahan anu aya dina cabang parobahan, bakal ngalih ka cabang master. Kusabab urang henteu hoyong ieu, urang tambahkeun analisa, sareng ayeuna diagramna sapertos kieu:

Nganalisis parobahan2 jeung, lamun euweuh kasalahan, urang nampi pamundut ngahiji, disebutkeun urang nampik eta.
Ku jalan kitu, upami anjeun resep nganalisa komitmen sareng narik paménta pikeun C / C ++, maka anjeun tiasa maca ngeunaan éta .
GitLab
mangrupakeun alat daur hirup DevOps basis web open source nu nyadiakeun sistem manajemen gudang kode pikeun Git kalawan wiki sorangan, sistem tracking isu, CI / CD pipeline sarta fitur sejenna.
Sateuacan anjeun ngawitan nganalisa pamundut gabungan, anjeun kedah ngadaptar sareng unggah proyék anjeun. Upami anjeun henteu terang kumaha ngalakukeun ieu, kuring nyarankeun batur sapagawean kuring.
nyarios. Metodeu nyetél lingkungan anu dijelaskeun di handap ieu mangrupikeun salah sahiji anu mungkin. Tujuanana nyaéta pikeun nunjukkeun léngkah-léngkah pikeun nyetél lingkungan anu dipikabutuh pikeun analisa sareng ngaluncurkeun analisa. Panginten dina kasus anjeun bakal langkung optimal pikeun misahkeun tahapan persiapan lingkungan (nambahkeun repositori, masang analisa) sareng analisa: contona, nyiapkeun gambar Docker sareng lingkungan anu diperyogikeun sareng ngagunakeunana, atanapi metode anu sanés.
Pikeun langkung ngartos naon anu bakal kajadian ayeuna, kuring nyarankeun ningali diagram ieu:

Analyzer ieu meryogikeun .NET Core SDK 3, janten sateuacan masang analyzer, anjeun kedah nambihan repositori Microsoft anu bakal dipasangkeun dependensi analyzer. Nambahkeun repositori Microsoft pikeun rupa-rupa distribusi Linux .
Pikeun masang PVS-Studio ngaliwatan manajer pakét, anjeun ogé kedah nambihan repositori PVS-Studio. Nambahkeun repositori pikeun distribusi anu béda dijelaskeun sacara langkung rinci dina .
Analis merlukeun konci lisénsi pikeun beroperasi. Anjeun tiasa kéngingkeun lisénsi percobaan di .
nyarios. Punten dicatet yén modeu operasi anu dijelaskeun (analisis pamundut gabungan) peryogi lisénsi Perusahaan. Kukituna, upami anjeun hoyong nyobian modeu operasi ieu, ulah hilap nunjukkeun dina widang "Pesen" yén anjeun peryogi lisénsi Perusahaan.
Upami aya pamundut gabungan, maka urang ngan ukur kedah nganalisis daptar file anu dirobih, upami henteu, urang nganalisis sadaya file. Saatos analisa, urang kedah ngarobih log kana format anu urang peryogikeun.
Ayeuna, gaduh algoritma damel sateuacan panon anjeun, anjeun tiasa teraskeun nyerat naskah. Jang ngalampahkeun ieu, anjeun kudu ngarobah file .gitlab-ci.yml atawa, lamun teu aya, nyieun eta. Pikeun nyiptakeunana, anjeun kedah klik nami proyék anjeun -> Nyetél CI/CD.

Ayeuna urang siap nulis naskah. Hayu urang mimiti nulis kode anu bakal masang analyzer jeung asupkeun lisénsi:
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.slnKusabab pamasangan sareng aktivasina kedah lumangsung sateuacan sadaya naskah sanés, kami nganggo labél khusus before_script. Hayu atuh ngajelaskeun fragmen ieu saeutik.
Nyiapkeun pikeun masang analyzer:
- 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 updateNambahkeun repositori sareng analisa 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-dotnetAktipkeun lisénsi:
- pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY$PVS_NAME - Ngaran pamaké.
$PVS_KEY - konci produk.
Recovering kagumantungan proyék dimana $CI_PROJECT_DIR - jalur pinuh ka diréktori proyék:
- dotnet restore "$CI_PROJECT_DIR"/Path/To/Solution.slnPikeun analisa anu leres, proyék éta kedah suksés diwangun, sareng kagumantunganana kedah dibalikeun deui (contona, pakét NuGet anu diperyogikeun kedah diunduh).
Anjeun tiasa nyetél variabel lingkungan anu ngandung inpormasi lisénsi ku ngaklik setelan, sarta sanggeus - on CI/CD.

Dina jandéla anu muka, panggihan itemna variabel, klik dina tombol di katuhu ngalebarkeun jeung nambahkeun variabel. Hasilna kedah sapertos kieu:

Ayeuna anjeun tiasa ngaléngkah ka analisis. Kahiji, hayu urang tambahkeun naskah pikeun analisis lengkep. Ka bandéra -t urang lulus jalur ka solusi pikeun bandéra -o nulis jalur ka file nu hasil analisis bakal ditulis. Urang ogé museurkeun kodeu balik. Dina hal ieu, urang museurkeun operasi eureun nalika kodeu balik ngandung émbaran nu warnings dikaluarkeun salila analisis. Ieu mangrupikeun fragmen ieu:
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; fiKodeu pangbalikan beroperasi dumasar kana prinsip bitmask. Contona, upami analisisna ngahasilkeun peringatan, kodeu pangbalikan bakal janten 8. Upami lisénsina kadaluwarsa dina sabulan, kodeu pangbalikan bakal janten 4. Upami analisis ngadeteksi kasalahan sareng lisénsina kadaluwarsa dina sabulan, kodeu pangbalikan bakal ngandung duanana nilai: tambahkeun angka-angka éta babarengan pikeun kéngingkeun kodeu pangbalikan ahir—8 + 4 = 12. Ku kituna, ku cara mariksa bit anu saluyu, anjeun tiasa kéngingkeun inpormasi ngeunaan rupa-rupa kaayaan salami analisis. Kodeu pangbalikan dijelaskeun langkung rinci dina bagian "Kodeu Pangbalikan pvs-studio-dotnet".Linux / macOS)" dokumén "".
Dina hal ieu, urang museurkeun sagala Konci balik dimana 8 némbongan.
- exit_code=$((($exit_code & 8)/8))Kami bakal nampi 1 nalika kodeu balik ngandung sakedik jumlah anu kami pikahoyong, upami henteu, kami bakal nampi 0.
Waktosna pikeun nambihan analisa pamundut gabungan. Sateuacan urang ngalakukeun ieu, hayu urang nyiapkeun tempat pikeun naskah. Urang peryogi eta pikeun dieksekusi ngan lamun hiji pamundut ngahiji lumangsung. Sigana mah kieu:
merge:
script:
only:
- merge_requestsHayu urang ngaléngkah ka naskah sorangan. Kuring ieu Nyanghareupan kanyataan yén mesin virtual teu nyaho nanaon tentang asal / master. Janten hayu urang ngabantosan anjeunna sakedik:
- git fetch originAyeuna urang kéngingkeun bédana antara cabang sareng simpen hasilna txt file:
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txtdi mana $CI_COMMIT_SHA - hash tina komitmen panungtungan.
Salajengna, urang mimitian analisa daptar file nganggo bandéra -f. Urang mindahkeun file .txt saméméhna narima kana eta. Nya, ku analogi sareng analisa lengkep, urang ningali kodeu balik:
- 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; fiSkrip lengkep pikeun mariksa pamundut gabungan bakal katingali sapertos kieu:
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_requestsSadaya anu tetep nyaéta pikeun nambihan konvérsi log saatos sadaya skrip parantos diolah. Kami nganggo labél after_script jeung utiliti plog-converter:
after_script:
- plog-converter -t html -o eLog ./PVS-Studio.jsonUtiliti mangrupa proyék open source nu dipaké pikeun ngarobah laporan kasalahan parser kana sagala rupa wangun, kayaning HTML. Katerangan anu langkung rinci ngeunaan utilitas dirumuskeun dina subseksi "Plog Converter Utility" .
Ku jalan kitu, lamun hayang merenah digawekeun ku .json ngalaporkeun lokal ti IDE, teras abdi nyarankeun urang pikeun IDE Rider. Pamakéan na dijelaskeun dina leuwih jéntré dina .
Pikeun genah, di dieu éta .gitlab-ci.yml lengkep:
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.jsonSakali anjeun geus ditambahkeun sagalana kana file, klik dina Komitmen parobahan. Pikeun ningali yén sadayana leres, angkat ka CI / CD -> Pipelines -> ngajalankeun. Jandéla mesin virtual bakal dibuka, anu tungtungna kedah aya kieu:

nempo Ayub suksés - sukses, sagalana geus rupa. Ayeuna anjeun tiasa nguji naon anu anjeun lakukeun.
Conto gawé
Pikeun conto gawé, hayu urang nyieun hiji proyék basajan (di ngawasaan) anu bakal ngandung sababaraha file. Saatos éta, dina cabang anu sanés urang ngan ukur ngarobih hiji file sareng nyobian ngadamel pamundut gabungan.
Hayu urang nganggap dua kasus: lamun file dirobah ngandung kasalahan sarta lamun henteu. Kahiji, conto jeung kasalahan.
Hayu urang nyebutkeun aya file dina cabang master Program.cs, nu teu ngandung kasalahan, tapi dina cabang séjén pamekar nu ditambahkeun kode erroneous sarta hayang nyieun pamundut ngahiji. Naon kasalahan anu anjeunna lakukeun henteu penting pisan, anu utama nyaéta yén éta aya. Contona, operator poho maledog (Enya, ):
void MyAwesomeMethod(String name)
{
if (name == null)
new ArgumentNullException(....);
// do something
....
}Hayu urang tingali hasil analisa conto sareng kasalahan. Ogé pikeun mastikeun yén ngan hiji file ieu parsed, Kuring ditambahkeun bandéra -r ka jalur peluncuran pvs-studio-dotnet:

Kami ningali yén analisa mendakan kasalahan sareng henteu ngijinkeun ngahijikeun cabang.
Hayu urang pariksa conto tanpa kasalahan. Koréksi kodeu:
void MyAwesomeMethod(String name)
{
if (name == null)
throw new ArgumentNullException(....);
// do something
....
}Hasil analisis pamundut gabungan:

Sakumaha anu urang tingali, teu aya kasalahan anu kapendak, sareng palaksanaan tugas suksés, anu kami hoyong pariksa.
kacindekan
Weeding kaluar kode goréng saméméh merging cabang pisan merenah tur pikaresepeun. Janten upami anjeun nganggo CI/CD, cobian pasang analisa statik pikeun pariksa. Leuwih ti éta, ieu dipigawé cukup basajan.
Hatur nuhun pikeun perhatian Anjeun.
Upami anjeun hoyong ngabagikeun tulisan ieu ka pamiarsa anu nyarios basa Inggris, mangga nganggo tautan tarjamahan: Nikolay Mironov. .
sumber: www.habr.com
