Analisis pamundut gabungan di GitLab nganggo PVS-Studio pikeun C#

Analisis pamundut gabungan di GitLab nganggo PVS-Studio pikeun C#
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.

PVS Studio mangrupakeun alat pikeun ngaidentipikasi kasalahan sareng potensi kerentanan dina kode sumber program anu ditulis dina C, C ++, C # sareng Java. Gawéna dina sistem 64-bit dina Windows, Linux jeung macOS. Bisa nganalisis kodeu dirancang pikeun 32-bit, 64-bit jeung embedded platform ARM.

Ku jalan kitu, kami ngarilis PVS-Studio 7.08, dimana urang ngalakukeun seueur hal metot. Contona:

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

Analisis pamundut gabungan di GitLab nganggo PVS-Studio pikeun C#
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:

Analisis pamundut gabungan di GitLab nganggo PVS-Studio pikeun C#
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 di dieu.

GitLab

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

Analisis pamundut gabungan di GitLab nganggo PVS-Studio pikeun C#
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 dijelaskeun dina dokumén saluyu.

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 bagian relevan tina dokuméntasi.

Analis merlukeun konci lisénsi pikeun beroperasi. Anjeun tiasa kéngingkeun lisénsi percobaan di kaca download analyzer.

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.

Analisis pamundut gabungan di GitLab nganggo PVS-Studio pikeun C#
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.

Analisis pamundut gabungan di GitLab nganggo PVS-Studio pikeun C#
Dina jandéla anu muka, panggihan itemna variabel, klik dina tombol di katuhu ngalebarkeun jeung nambahkeun variabel. Hasilna kedah sapertos kieu:

Analisis pamundut gabungan di GitLab nganggo PVS-Studio pikeun C#
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 "Mariksa proyék Visual Studio / MSBuild / .NET Core tina garis paréntah ngagunakeun PVS-Studio".

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 plog-converter 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" bagian relevan tina dokuméntasi.

Ku jalan kitu, lamun hayang merenah digawekeun ku .json ngalaporkeun lokal ti IDE, teras abdi nyarankeun urang plugin pikeun IDE Rider. Pamakéan na dijelaskeun dina leuwih jéntré dina dokumén relevan.

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:

Analisis pamundut gabungan di GitLab nganggo PVS-Studio pikeun C#
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, jadi salah):

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:

Analisis pamundut gabungan di GitLab nganggo PVS-Studio pikeun C#
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:

Analisis pamundut gabungan di GitLab nganggo PVS-Studio pikeun C#
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.

Analisis pamundut gabungan di GitLab nganggo PVS-Studio pikeun C#
Upami anjeun hoyong ngabagikeun tulisan ieu ka pamiarsa anu nyarios basa Inggris, mangga nganggo tautan tarjamahan: Nikolay Mironov. Analisis pamundut gabungan di GitLab nganggo PVS-Studio pikeun C#.

sumber: www.habr.com

Tambahkeun komentar