Analisis permintaan gabungan dalam GitLab menggunakan PVS-Studio untuk C#

Analisis permintaan gabungan dalam GitLab menggunakan PVS-Studio untuk C#
Suka GitLab dan benci pepijat? Ingin meningkatkan kualiti kod sumber anda? Kemudian anda telah datang ke tempat yang betul. Hari ini kami akan memberitahu anda cara mengkonfigurasi penganalisis PVS-Studio C# untuk menyemak permintaan gabungan. Mempunyai mood unicorn dan selamat membaca kepada semua orang.

PVS-Studio ialah alat untuk mengenal pasti ralat dan potensi kelemahan dalam kod sumber program yang ditulis dalam C, C++, C# dan Java. Berfungsi pada sistem 64-bit pada Windows, Linux dan macOS. Boleh menganalisis kod yang direka untuk platform ARM 32-bit, 64-bit dan terbenam.

Ngomong-ngomong, kami mengeluarkan PVS-Studio 7.08, di mana kami melakukan banyak perkara menarik. Sebagai contoh:

  • Penganalisis C# untuk Linux dan macOS;
  • pemalam untuk Rider;
  • mod semakan senarai fail baharu.

Mod semakan senarai fail

Sebelum ini, untuk menyemak fail tertentu, adalah perlu untuk menghantar .xml dengan senarai fail kepada penganalisis. Tetapi oleh kerana ini tidak begitu mudah, kami telah menambahkan keupayaan untuk memindahkan .txt, yang menjadikan hidup sangat mudah.

Untuk menyemak fail tertentu, anda mesti menentukan bendera --sourceFiles (-f) dan pindahkan .txt dengan senarai fail. Ia kelihatan seperti ini:

pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.json

Jika anda berminat untuk menyediakan semakan komit atau permintaan tarik, anda juga boleh melakukannya menggunakan mod ini. Perbezaannya adalah dalam mendapatkan senarai fail untuk dianalisis dan bergantung pada sistem yang anda gunakan.

Prinsip menyemak permintaan gabungan

Intipati utama semakan adalah untuk memastikan bahawa masalah yang dikesan oleh penganalisis semasa penggabungan tidak jatuh ke dalam master cawangan. Kami juga tidak mahu menganalisis keseluruhan projek setiap kali. Lebih-lebih lagi, apabila menggabungkan cawangan, kami mempunyai senarai fail yang diubah. Oleh itu, saya cadangkan menambah semakan permintaan gabungan.

Beginilah rupa permintaan gabungan sebelum melaksanakan penganalisis statik:

Analisis permintaan gabungan dalam GitLab menggunakan PVS-Studio untuk C#
Iaitu, semua kesilapan yang ada dalam cawangan perubahan, akan berpindah ke cawangan induk. Oleh kerana kami tidak mahu ini, kami menambah analisis, dan kini rajah kelihatan seperti ini:

Analisis permintaan gabungan dalam GitLab menggunakan PVS-Studio untuk C#
Kami menganalisis perubahan2 dan, jika tiada ralat, kami menerima permintaan gabungan, jika tidak, kami menolaknya.

Ngomong-ngomong, jika anda berminat untuk menganalisis komit dan tarik permintaan untuk C/C++, maka anda boleh membaca tentangnya di sini.

GitLab

GitLab ialah alat kitar hayat DevOps berasaskan web sumber terbuka yang menyediakan sistem pengurusan repositori kod untuk Git dengan wikinya sendiri, sistem penjejakan isu, saluran paip CI/CD dan ciri lain.

Sebelum anda mula menganalisis permintaan gabungan, anda perlu mendaftar dan memuat naik projek anda. Jika anda tidak tahu bagaimana untuk melakukan ini, maka saya cadangkan artikel rakan sekerja saya.

Nota. Kaedah menyediakan persekitaran yang diterangkan di bawah adalah salah satu kaedah yang mungkin. Matlamatnya adalah untuk menunjukkan langkah-langkah untuk menyediakan persekitaran yang diperlukan untuk analisis dan melancarkan penganalisis. Mungkin dalam kes anda adalah lebih optimum untuk memisahkan peringkat penyediaan persekitaran (menambah repositori, memasang penganalisis) dan analisis: contohnya, menyediakan imej Docker dengan persekitaran yang diperlukan dan menggunakannya, atau kaedah lain.

Untuk lebih memahami apa yang akan berlaku sekarang, saya cadangkan melihat rajah berikut:

Analisis permintaan gabungan dalam GitLab menggunakan PVS-Studio untuk C#
Penganalisis memerlukan .NET Core SDK 3 untuk berfungsi, jadi sebelum memasang penganalisis, anda perlu menambah repositori Microsoft dari mana kebergantungan yang diperlukan untuk penganalisis akan dipasang. Menambah repositori Microsoft untuk pelbagai pengedaran Linux diterangkan dalam dokumen yang berkaitan.

Untuk memasang PVS-Studio melalui pengurus pakej, anda juga perlu menambah repositori PVS-Studio. Menambah repositori untuk pengedaran berbeza diterangkan dengan lebih terperinci dalam bahagian dokumentasi yang berkaitan.

Penganalisis memerlukan kunci lesen untuk beroperasi. Anda boleh mendapatkan lesen percubaan di halaman muat turun penganalisis.

Nota. Sila ambil perhatian bahawa mod operasi yang diterangkan (analisis permintaan gabungan) memerlukan lesen Perusahaan. Oleh itu, jika anda ingin mencuba mod operasi ini, jangan lupa untuk menunjukkan dalam medan "Mesej" bahawa anda memerlukan lesen Perusahaan.

Jika permintaan penggabungan berlaku, maka kami hanya perlu menganalisis senarai fail yang diubah, jika tidak, kami menganalisis semua fail. Selepas analisis, kita perlu menukar log ke dalam format yang kita perlukan.

Kini, dengan mempunyai algoritma kerja di hadapan mata anda, anda boleh terus menulis skrip. Untuk melakukan ini, anda perlu menukar fail .gitlab-ci.yml atau, jika ia tidak wujud, ciptakannya. Untuk menciptanya, anda perlu klik pada nama projek anda -> Sediakan CI/CD.

Analisis permintaan gabungan dalam GitLab menggunakan PVS-Studio untuk C#
Sekarang kami sudah bersedia untuk menulis skrip. Mari mula-mula tulis kod yang akan memasang penganalisis dan masukkan lesen:

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

Memandangkan pemasangan dan pengaktifan mesti berlaku sebelum semua skrip lain, kami menggunakan label khas sebelum_skrip. Biar saya terangkan sedikit serpihan ini.

Bersedia untuk memasang penganalisis:

  - 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

Menambah repositori dan penganalisis 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

Pengaktifan lesen:

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY

$PVS_NAME - Nama pengguna.

$PVS_KEY - kunci produk.

Memulihkan kebergantungan projek di mana $CI_PROJECT_DIR – laluan penuh ke direktori projek:

  - dotnet restore "$CI_PROJECT_DIR"/Path/To/Solution.sln

Untuk analisis yang betul, projek mesti berjaya dibina, dan kebergantungannya mesti dipulihkan (contohnya, pakej NuGet yang diperlukan mesti dimuat turun).

Anda boleh menetapkan pembolehubah persekitaran yang mengandungi maklumat lesen dengan mengklik Menetapkan, dan selepas - pada CI/CD.

Analisis permintaan gabungan dalam GitLab menggunakan PVS-Studio untuk C#
Dalam tetingkap yang terbuka, cari item tersebut Pembolehubah, klik pada butang di sebelah kanan Mengembangkan dan menambah pembolehubah. Hasilnya sepatutnya kelihatan seperti ini:

Analisis permintaan gabungan dalam GitLab menggunakan PVS-Studio untuk C#
Sekarang anda boleh beralih kepada analisis. Mula-mula, mari tambah skrip untuk analisis lengkap. Ke bendera -t kita lulus jalan ke penyelesaian kepada bendera -o tulis laluan ke fail di mana keputusan analisis akan ditulis. Kami juga berminat dengan kod pulangan. Dalam kes ini, kami berminat untuk menghentikan operasi apabila kod pemulangan mengandungi maklumat bahawa amaran telah dikeluarkan semasa analisis. Inilah rupa serpihan ini:

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

Kod pengembalian berfungsi berdasarkan prinsip topeng sedikit. Sebagai contoh, jika amaran telah dikeluarkan hasil daripada analisis, maka kod pemulangan akan bersamaan dengan 8. Jika lesen tamat tempoh dalam masa sebulan, maka kod pemulangan akan sama dengan 4. Jika ralat dikesan semasa analisis, dan lesen tamat tempoh dalam masa sebulan, kod pulangan, kedua-dua nilai akan ditulis: tambah nombor bersama-sama dan dapatkan kod pulangan akhir - 8+4=12. Oleh itu, dengan menyemak bit yang sepadan, maklumat tentang pelbagai keadaan boleh diperoleh semasa analisis. Kod pemulangan diterangkan dengan lebih terperinci dalam bahagian "pvs-studio-dotnet (Linux / macOS) Pemulangan Kod" dokumen "Menyemak projek Visual Studio / MSBuild / .NET Core daripada baris arahan menggunakan PVS-Studio".

Dalam kes ini, kami berminat dengan semua kod pulangan di mana 8 muncul.

  - exit_code=$((($exit_code & 8)/8))

Kami akan menerima 1 apabila kod pulangan mengandungi sedikit nombor yang kami minati, jika tidak, kami akan menerima 0.

Sudah tiba masanya untuk menambah analisis permintaan gabungan. Sebelum melakukan ini, mari kita sediakan tempat untuk skrip. Kami memerlukannya untuk dilaksanakan hanya apabila permintaan gabungan berlaku. Ia kelihatan seperti ini:

merge:
  script:
  only:
  - merge_requests

Mari kita beralih kepada skrip itu sendiri. Saya berhadapan dengan hakikat bahawa mesin maya tidak tahu apa-apa asal / tuan. Jadi mari kita bantu dia sedikit:

  - git fetch origin

Sekarang kita mendapat perbezaan antara cawangan dan menyimpan hasilnya txt fail:

  - git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt

Π“Π΄Π΅ $CI_COMMIT_SHA – cincang komit terakhir.

Seterusnya, kami mula menganalisis senarai fail menggunakan bendera -f. Kami memindahkan fail .txt yang diterima sebelum ini kepadanya. Nah, dengan analogi dengan analisis penuh, kita melihat kod pulangan:

  - 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 untuk menyemak permintaan gabungan akan kelihatan seperti ini:

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

Yang tinggal hanyalah menambah penukaran log selepas semua skrip telah diproses. Kami menggunakan label selepas_skrip dan utiliti plog-converter:

after_script:
  - plog-converter -t html -o eLog ./PVS-Studio.json

Utiliti plog-converter ialah projek sumber terbuka yang digunakan untuk menukar laporan ralat penghurai kepada pelbagai bentuk, seperti HTML. Penerangan yang lebih terperinci tentang utiliti diberikan dalam subseksyen "Utiliti Penukar Plog" bahagian dokumentasi yang berkaitan.

Dengan cara ini, jika anda ingin bekerja dengan mudah dengan laporan .json secara tempatan daripada IDE, maka saya mencadangkan kami plugin untuk IDE Rider. Penggunaannya diterangkan dengan lebih terperinci dalam dokumen berkaitan.

Untuk kemudahan, ini dia .gitlab-ci.yml sepenuhnya:

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

Sebaik sahaja anda telah menambah segala-galanya pada fail, klik pada Lakukan perubahan. Untuk melihat bahawa semuanya betul, pergi ke CI / CD -> Talian Paip -> Berlari. Tetingkap mesin maya akan dibuka, pada penghujungnya mesti ada yang berikut:

Analisis permintaan gabungan dalam GitLab menggunakan PVS-Studio untuk C#
melihat Ayub berjaya - kejayaan, semuanya baik-baik saja. Sekarang anda boleh menguji apa yang telah anda lakukan.

Contoh kerja

Untuk contoh kerja, mari buat projek mudah (dalam master) yang akan mengandungi beberapa fail. Selepas itu, di cawangan lain kami akan menukar hanya satu fail dan cuba membuat permintaan gabungan.

Mari kita pertimbangkan dua kes: apabila fail yang diubah suai mengandungi ralat dan apabila ia tidak. Pertama, contoh dengan ralat.

Katakan terdapat fail dalam cawangan induk Program.cs, yang tidak mengandungi ralat, tetapi dalam cawangan lain pembangun menambahkan kod yang salah dan ingin membuat permintaan gabungan. Kesilapan apa yang dia lakukan tidak begitu penting, yang utama adalah ia wujud. Sebagai contoh, operator terlupa membuang (Ya, sangat salah):

void MyAwesomeMethod(String name)
{
  if (name == null)
    new ArgumentNullException(....);
  // do something
  ....
}

Mari kita lihat hasil menganalisis contoh dengan ralat. Juga untuk memastikan hanya satu fail dihuraikan, saya menambah bendera -r ke baris pelancaran pvs-studio-dotnet:

Analisis permintaan gabungan dalam GitLab menggunakan PVS-Studio untuk C#
Kami melihat bahawa penganalisis mendapati ralat dan tidak membenarkan penggabungan cawangan.

Mari kita semak contoh tanpa ralat. Membetulkan kod:

void MyAwesomeMethod(String name)
{
  if (name == null)
    throw new ArgumentNullException(....);
  // do something
  ....
}

Hasil analisis permintaan gabungan:

Analisis permintaan gabungan dalam GitLab menggunakan PVS-Studio untuk C#
Seperti yang kita dapat lihat, tiada ralat ditemui, dan pelaksanaan tugas berjaya, itulah yang kami ingin periksa.

Kesimpulan

Membuang kod buruk sebelum menggabungkan cawangan adalah sangat mudah dan menyenangkan. Jadi jika anda menggunakan CI/CD, cuba sematkan penganalisis statik untuk menyemak. Lebih-lebih lagi, ini dilakukan dengan mudah.

Terima kasih atas perhatian anda.

Analisis permintaan gabungan dalam GitLab menggunakan PVS-Studio untuk C#
Jika anda ingin berkongsi artikel ini dengan penonton berbahasa Inggeris, sila gunakan pautan terjemahan: Nikolay Mironov. Analisis permintaan gabungan dalam GitLab menggunakan PVS-Studio untuk C#.

Sumber: www.habr.com

Tambah komen