Analisis panjalukan gabungan ing GitLab nggunakake PVS-Studio kanggo C#

Analisis panjalukan gabungan ing GitLab nggunakake PVS-Studio kanggo C#
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.

PVS Studio minangka alat kanggo ngenali kesalahan lan kerentanan potensial ing kode sumber program sing ditulis ing C, C ++, C # lan Jawa. Bisa digunakake ing sistem 64-bit ing Windows, Linux lan macOS. Bisa nganalisa kode sing dirancang kanggo platform ARM 32-bit, 64-bit lan embedded.

Miturut cara, kita ngeculake PVS-Studio 7.08, ing ngendi kita nindakake akeh perkara menarik. Contone:

  • 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:

Analisis panjalukan gabungan ing GitLab nggunakake PVS-Studio kanggo C#
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:

Analisis panjalukan gabungan ing GitLab nggunakake PVS-Studio kanggo C#
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 kene.

GitLab

GitLab minangka alat siklus urip DevOps basis web mbukak sing nyedhiyakake sistem manajemen repositori kode kanggo Git kanthi wiki dhewe, sistem pelacakan masalah, pipa CI/CD lan fitur liyane.

Sadurunge miwiti nganalisa panjalukan gabungan, sampeyan kudu ndhaptar lan ngunggah proyek sampeyan. Yen sampeyan ora ngerti carane nindakake iki, aku menehi saran artikel kancaku.

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:

Analisis panjalukan gabungan ing GitLab nggunakake PVS-Studio kanggo C#
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 diterangake ing dokumen sing cocog.

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 bagean sing relevan saka dokumentasi.

Analisa mbutuhake kunci lisensi supaya bisa digunakake. Sampeyan bisa njaluk lisensi nyoba ing kaca download analyzer.

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.

Analisis panjalukan gabungan ing GitLab nggunakake PVS-Studio kanggo C#
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.

Analisis panjalukan gabungan ing GitLab nggunakake PVS-Studio kanggo C#
Ing jendhela sing mbukak, goleki item kasebut Variabel, klik tombol ing sisih tengen Ngambakne lan nambah variabel. Asil kudu katon kaya iki:

Analisis panjalukan gabungan ing GitLab nggunakake PVS-Studio kanggo C#
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 "Priksa proyek Visual Studio / MSBuild / .NET Core saka baris printah nggunakake PVS-Studio".

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 plug-converter minangka proyek open source sing digunakake kanggo ngowahi laporan kesalahan parser menyang macem-macem formulir, kayata HTML. Katrangan sing luwih rinci babagan utilitas diwenehi ing bagean "Plog Converter Utility" bagean sing relevan saka dokumentasi.

Miturut cara, yen sampeyan pengin gampang nggarap .json laporan lokal saka IDE, banjur aku suggest kita plugin kanggo IDE Rider. Panggunaan kasebut diterangake kanthi luwih rinci ing dokumen sing relevan.

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:

Analisis panjalukan gabungan ing GitLab nggunakake PVS-Studio kanggo C#
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, dadi salah):

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:

Analisis panjalukan gabungan ing GitLab nggunakake PVS-Studio kanggo C#
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:

Analisis panjalukan gabungan ing GitLab nggunakake PVS-Studio kanggo C#
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Γ©.

Analisis panjalukan gabungan ing GitLab nggunakake PVS-Studio kanggo C#
Yen sampeyan pengin nuduhake artikel iki karo pamirsa sing nganggo basa Inggris, gunakake tautan terjemahan: Nikolay Mironov. Analisis panjalukan gabungan ing GitLab nggunakake PVS-Studio kanggo C#.

Source: www.habr.com

Add a comment