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.
Ku jalan kitu, kami ngarilis PVS-Studio 7.08, dimana urang ngalakukeun seueur hal
- C # analyzer pikeun Linux Ubuntu jeung 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.json
Upami 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
Sateuacan anjeun ngawitan nganalisa pamundut gabungan, anjeun kedah ngadaptar sareng unggah proyék anjeun. Upami anjeun henteu terang kumaha ngalakukeun ieu, kuring nyarankeun
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 merlukeun .NET Core SDK 3 pikeun beroperasi, ku kituna saméméh masang analyzer Anjeun kudu nambahkeun repositories Microsoft ti mana gumantungna diperlukeun pikeun analyzer bakal dipasang. Nambahkeun repositori Microsoft pikeun sababaraha 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.sln
Kusabab 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 update
Nambahkeun 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-dotnet
Aktipkeun 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.sln
Pikeun 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; fi
Kodeu balik dianggo dina prinsip topeng bit. Salaku conto, upami peringatan dikaluarkeun salaku hasil tina analisa, kode uih deui bakal sami sareng 8. Upami lisénsi kadaluwarsa dina sabulan, kode uih deui bakal sami sareng 4. Upami kasalahan dideteksi nalika analisa, sareng lisénsina kadaluwarsa dina sabulan, kodeu balik, duanana nilai bakal ditulis: tambahkeun nomer babarengan sareng kéngingkeun kodeu balik final - 8+4=12. Ku kituna, ku mariksa bit pakait, informasi ngeunaan rupa-rupa kaayaan bisa diala salila analisis. Kodeu balik dijelaskeun sacara langkung rinci dina bagian "pvs-studio-dotnet (Linux / macOS) Kode Balik" dina 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_requests
Hayu 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 origin
Ayeuna urang kéngingkeun bédana antara cabang sareng simpen hasilna txt file:
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
di 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; fi
Skrip 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_requests
Sadaya 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.json
Utiliti
Ku jalan kitu, lamun hayang merenah digawekeun ku .json ngalaporkeun lokal ti IDE, teras abdi nyarankeun urang
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.json
Sakali 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