Tresna GitLab lan sengit bug? Pengin nambah kualitas kode sumber sampeyan? Banjur sampeyan wis teka ing Panggonan tengen. Dina iki kita bakal pitutur marang kowe carane ngatur PVS-Studio C# analyzer kanggo mriksa panjalukan gabungan. Nduwe swasana unicorn lan seneng maca kanggo kabeh wong.
Miturut cara, kita ngeculake PVS-Studio 7.08, ing ngendi kita nindakake akeh perkara
- C# analyzer kanggo Linux lan macOS;
- plugin kanggo Rider;
- mode mriksa dhaptar file anyar.
Mode mriksa dhaptar file
Sadurunge, kanggo mriksa file tartamtu, perlu kanggo ngirim .xml karo dhaptar file menyang analyzer. Nanging amarga iki ora trep banget, kita wis nambahake kemampuan kanggo nransfer .txt, sing ndadekake urip gampang banget.
Kanggo mriksa file tartamtu, sampeyan kudu nemtokake gendera --sourceFiles (-f) lan transfer .txt kanthi dhaptar file. Katon kaya mangkene:
pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.json
Yen sampeyan kasengsem ing nyetel commit checking utawa pull requests, sampeyan uga bisa nindakake kanthi nggunakake mode iki. Bentenipun bakal entuk dhaptar file kanggo dianalisis lan bakal gumantung ing sistem apa sing sampeyan gunakake.
Prinsip mriksa panjalukan gabungan
Inti utama mriksa yaiku kanggo mesthekake yen masalah sing dideteksi dening penganalisa sajrone penggabungan ora tiba ing Master cabang. Kita uga ora pengin nganalisa kabeh proyek saben wektu. Kajaba iku, nalika nggabungake cabang, kita duwe dhaptar file sing diganti. Mulane, aku saranake nambahake priksa panyuwunan gabungan.
Iki kaya panyuwunan gabungan sadurunge ngetrapake analisa statis:
Yaiku, kabeh kesalahan sing ana ing cabang kasebut malih, bakal pindhah menyang cabang master. Amarga kita ora pengin iki, kita nambah analisis, lan saiki diagram katon kaya iki:
Kita nganalisa owah-owahan2 lan, yen ora ana kasalahan, kita nampa panjalukan gabung, digunakake kita nolak.
Miturut cara, yen sampeyan kasengsem ing nganalisa commits lan narik panjalukan kanggo C/C ++, sampeyan bisa maca babagan
GitLab
Sadurunge miwiti nganalisa panjalukan gabungan, sampeyan kudu ndhaptar lan ngunggah proyek sampeyan. Yen sampeyan ora ngerti carane nindakake iki, aku menehi saran
komentar. Cara nyetel lingkungan sing diterangake ing ngisor iki minangka salah sawijining cara sing bisa ditindakake. Tujuane kanggo nuduhake langkah-langkah kanggo nyetel lingkungan sing dibutuhake kanggo analisis lan ngluncurake penganalisis. Mbok menawa ing kasus sampeyan bakal luwih optimal kanggo misahake orane tumrap sekolah saka preparation lingkungan (nambah repositori, nginstal analyzer) lan analisis: contone, nyiyapake gambar Docker karo lingkungan perlu lan nggunakake, utawa sawetara cara liyane.
Kanggo luwih ngerti apa sing bakal kelakon saiki, aku saranake ndeleng diagram ing ngisor iki:
Analisa mbutuhake .NET Core SDK 3 kanggo operate, supaya sadurunge nginstal analyzer sampeyan kudu nambah repositori Microsoft saka ngendi dependensi sing dibutuhake kanggo analyzer bakal diinstal. Nambahake repositori Microsoft kanggo macem-macem distribusi Linux
Kanggo nginstal PVS-Studio liwat manajer paket, sampeyan uga kudu nambah repositori PVS-Studio. Nambah repositori kanggo macem-macem distribusi diterangake kanthi luwih rinci ing
Analisa mbutuhake kunci lisensi supaya bisa digunakake. Sampeyan bisa njaluk lisensi nyoba ing
komentar. Elinga yen mode operasi sing diterangake (analisis panjalukan gabungan) mbutuhake lisensi Enterprise. Dadi, yen sampeyan pengin nyoba mode operasi iki, aja lali nuduhake ing kolom "Pesen" yen sampeyan butuh lisensi Enterprise.
Yen ana panjalukan gabungan, mula kita mung kudu nganalisa dhaptar file sing diganti, yen ora, kita nganalisa kabeh file. Sawise analisis, kita kudu ngowahi log menyang format sing dibutuhake.
Saiki, duwe algoritma kerja sadurunge mata, sampeyan bisa nerusake nulis skrip. Kanggo nindakake iki, sampeyan kudu ngganti file .gitlab-ci.yml utawa, yen ora ana, nggawe. Kanggo nggawe, sampeyan kudu ngeklik jeneng proyek sampeyan -> Nggawe CI/CD.
Saiki kita siap kanggo nulis skrip. Ayo pisanan nulis kode sing bakal nginstal analyzer lan ketik lisensi:
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
Wiwit instalasi lan aktivasi kudu kedadeyan sadurunge kabeh skrip liyane, kita nggunakake label khusus before_script. Ayo kula nerangake fragmen iki sethithik.
Nyiyapake kanggo nginstal 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
Nambahake repositori lan 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
Aktivasi lisensi:
- pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
$PVS_NAME - Jeneng panganggo.
$PVS_KEY - kunci produk.
Mbalekake dependensi proyek ngendi $CI_PROJECT_DIR - path lengkap menyang direktori proyek:
- dotnet restore "$CI_PROJECT_DIR"/Path/To/Solution.sln
Kanggo analisis sing bener, proyek kasebut kudu dibangun kanthi sukses, lan dependensi kasebut kudu dipulihake (contone, paket NuGet sing dibutuhake kudu didownload).
Sampeyan bisa nyetel variabel lingkungan sing ngemot informasi lisensi kanthi ngeklik setting, lan sawise - ing CI/CD.
Ing jendhela sing mbukak, goleki item kasebut Variabel, klik tombol ing sisih tengen Ngambakne lan nambah variabel. Asil kudu katon kaya iki:
Saiki sampeyan bisa nerusake menyang analisis. Pisanan, ayo nambah skrip kanggo analisis lengkap. Kanggo gendΓ©ra -t kita pass path menyang solusi kanggo flag -o nulis path menyang file ing ngendi asil analisis bakal ditulis. Kita uga kasengsem ing kode bali. Ing kasus iki, kita kasengsem ing operasi mandeg nalika kode bali ngemot informasi sing bebaya ditanggepi sak analisis. Iki minangka fragmen iki:
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
Kode bali dianggo ing prinsip topeng dicokot. Contone, yen bebaya ditanggepi minangka asil analisis, kode bali bakal padha karo 8. Yen lisensi kadaluwarsa sajrone sasi, kode bali bakal padha karo 4. Yen kesalahan dideteksi sajrone analisis, lan lisensi kadaluwarsa ing sasi, kode bali, loro nilai bakal ditulis: nambah nomer bebarengan lan njaluk kode bali final - 8+4=12. Mangkono, kanthi mriksa bit sing cocog, informasi babagan macem-macem negara bisa dipikolehi sajrone analisis. Kode bali diterangake kanthi luwih rinci ing bagean "pvs-studio-dotnet (Linux / macOS) Kode Return" ing dokumen kasebut "
Ing kasus iki, kita kasengsem ing kabeh kode bali ngendi 8 katon.
- exit_code=$((($exit_code & 8)/8))
Kita bakal nampa 1 nalika kode bali ngemot dicokot saka nomer kita kasengsem ing, digunakake kita bakal nampa 0.
Wektu kanggo nambah analisis panjalukan gabungan. Saderengipun nindakaken menika, sumangga dipunsiyapaken papan kangge damel naskah. Kita kudu dieksekusi mung nalika ana panyuwunan gabungan. Katon kaya mangkene:
merge:
script:
only:
- merge_requests
Ayo pindhah menyang script dhewe. Aku iki ngadhepi karo kasunyatan sing mesin virtual ora ngerti apa-apa bab asal / master. Dadi ayo nulungi dheweke:
- git fetch origin
Saiki kita entuk prabΓ©dan antarane cabang lan nyimpen asil ing txt berkas:
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
Ngendi $CI_COMMIT_SHA - hash saka komit pungkasan.
Sabanjure, kita miwiti nganalisa dhaptar file nggunakake gendera -f. Kita nransfer file .txt sing ditampa sadurunge. Ya, kanthi analogi karo analisis lengkap, kita ndeleng kode bali:
- 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 lengkap kanggo mriksa panjalukan gabungan bakal katon kaya iki:
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
Sing isih ana yaiku nambah konversi log sawise kabeh skrip wis diproses. Kita nggunakake label sawise_skrip lan sarana plug-converter:
after_script:
- plog-converter -t html -o eLog ./PVS-Studio.json
Utilitas
Miturut cara, yen sampeyan pengin gampang nggarap .json laporan lokal saka IDE, banjur aku suggest kita
Kanggo penak, kene .gitlab-ci.yml kanthi lengkap:
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
Sawise sampeyan wis nambahake kabeh menyang file, klik ing Nggawe owah-owahan. Kanggo ndeleng manawa kabeh wis bener, pindhah menyang CI / CD -> Pipa -> mlaku. Jendhela mesin virtual bakal mbukak, ing pungkasan kudu ana:
weruh Ayub kasil - sukses, kabeh apik. Saiki sampeyan bisa nyoba apa sing wis rampung.
Tuladha karya
Kanggo conto karya, ayo nggawe proyek sing prasaja (ing Master) sing bakal ngemot sawetara file. Sawise iku, ing cabang liyane kita bakal ngganti mung siji file lan nyoba nggawe panjalukan gabungan.
Ayo nimbang rong kasus: nalika file sing diowahi ngemot kesalahan lan nalika ora. Pisanan, conto karo kesalahan.
Ayo ngomong ana file ing cabang master Program.cs, sing ora ngemot kesalahan, nanging ing cabang liyane pangembang nambah kode sing salah lan pengin nggawe panjalukan gabungan. Kesalahan apa sing ditindakake dheweke ora pati penting, sing utama yaiku ana. Contone, operator kelalen uncalan (Ya,
void MyAwesomeMethod(String name)
{
if (name == null)
new ArgumentNullException(....);
// do something
....
}
Ayo ndeleng asil nganalisa conto kanthi kesalahan. Uga kanggo mesthekake yen mung siji file sing diurai, aku nambahake gendera -r menyang baris peluncuran pvs-studio-dotnet:
Kita weruh manawa analisa nemokake kesalahan lan ora ngidini gabung cabang.
Ayo dipriksa contone tanpa kesalahan. Mbenerake kode:
void MyAwesomeMethod(String name)
{
if (name == null)
throw new ArgumentNullException(....);
// do something
....
}
Hasil analisis panjalukan gabungan:
Kaya sing kita deleng, ora ana kesalahan sing ditemokake, lan eksekusi tugas sukses, yaiku sing pengin dipriksa.
kesimpulan
Weeding metu kode ala sadurunge nggabung cabang banget trep lan penake. Dadi yen sampeyan nggunakake CI/CD, coba sematake penganalisa statis kanggo mriksa. Menapa malih, iki rampung cukup prasaja.
Matur nuwun kanggo manungsa waΓ©.
Yen sampeyan pengin nuduhake artikel iki karo pamirsa sing nganggo basa Inggris, gunakake tautan terjemahan: Nikolay Mironov.
Source: www.habr.com