Analisis permintaan penggabungan di GitLab menggunakan PVS-Studio untuk C #

gambar1.png


Suka GitLab dan tidak suka bug? Ingin meningkatkan kualitas kode sumber Anda? Maka Anda telah datang ke tempat yang tepat. Hari ini kami akan memberi tahu Anda cara menyiapkan penganalisis PVS-Studio C # untuk memeriksa permintaan penggabungan. Semua suasana unicorn dan bacaan yang menyenangkan.



PVS-Studio adalah alat untuk mendeteksi kesalahan dan potensi kerentanan dalam kode sumber program yang ditulis dalam C, C ++, C # dan Java. Bekerja pada sistem 64-bit di Windows, Linux, dan macOS. Dapat menganalisis kode untuk platform ARM 32-bit, 64-bit dan tertanam.



Omong-omong, kami telah merilis PVS-Studio 7.08, di mana kami telah melakukan banyak hal menarik . Misalnya:



  • C # analyzer untuk Linux dan macOS;
  • plugin untuk Rider;
  • mode baru untuk memeriksa daftar file.


Mode pemeriksaan daftar file



Sebelumnya, untuk memeriksa file tertentu, perlu untuk meneruskan .xml dengan daftar file ke parser. Tetapi karena sangat tidak nyaman, kami menambahkan kemampuan untuk mentransfer .txt, yang membuat hidup sangat mudah.



Untuk memeriksa file tertentu, Anda perlu menentukan flag --sourceFiles ( -f ) dan meneruskan .txt dengan daftar file. Ini terlihat seperti ini:



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


Jika Anda tertarik untuk mengonfigurasi pemeriksaan untuk komit atau permintaan tarik, Anda juga dapat melakukannya menggunakan mode ini. Perbedaannya adalah mendapatkan daftar file untuk dianalisis dan bergantung pada sistem mana yang Anda gunakan.



Gabungkan prinsip verifikasi permintaan



Poin utama dari pemeriksaan ini adalah bahwa masalah yang terdeteksi oleh penganalisis tidak berakhir di cabang master selama penggabungan . Selain itu, kami tidak ingin menganalisis keseluruhan proyek setiap saat. Selain itu, saat menggabungkan cabang, kami memiliki daftar file yang diubah. Oleh karena itu, saya sarankan menambahkan tanda centang untuk permintaan penggabungan.



Seperti inilah tampilan permintaan penggabungan sebelum menerapkan penganalisis statis:



gambar2.png


Artinya, semua kesalahan yang ada di cabang perubahan akan masuk ke cabang master. Karena kami tidak menginginkannya, kami menambahkan analisis, dan sekarang diagramnya terlihat seperti ini:



image3.png


Kami menganalisis perubahan2 dan, jika tidak ada kesalahan, kami menerima permintaan penggabungan, jika tidak kami menolaknya.



Ngomong-ngomong, jika Anda tertarik untuk menganalisis commit dan pull request untuk C / C ++, Anda bisa membacanya di sini .



Gitlab



GitLab adalah alat siklus hidup DevOps berbasis web open source yang menyediakan sistem manajemen repositori kode untuk Git dengan wiki-nya sendiri, pelacak bug, pipeline CI / CD, dan banyak lagi.



Sebelum Anda mulai menerapkan analisis permintaan penggabungan, Anda perlu mendaftar dan mengunggah proyek Anda. Jika Anda tidak tahu bagaimana melakukan ini, maka saya menyarankan sebuah artikel oleh kolega saya.



Catatan... Metode pengaturan lingkungan yang dijelaskan di bawah ini adalah salah satu dari kemungkinan. Tujuannya adalah untuk menunjukkan langkah-langkah untuk menyiapkan lingkungan yang diperlukan untuk analisis dan menjalankan penganalisis. Mungkin, dalam kasus Anda, akan lebih optimal untuk memisahkan tahapan persiapan lingkungan (menambahkan repositori, menginstal penganalisis) dan analisis: misalnya, menyiapkan image Docker dengan lingkungan yang diperlukan dan menggunakannya, atau metode lain.



Untuk lebih memahami apa yang akan terjadi sekarang, saya sarankan untuk melihat diagram berikut:



image4.png


Penganalisis memerlukan .NET Core SDK 3 agar berfungsi, jadi sebelum menginstal penganalisis, Anda perlu menambahkan repositori Microsoft, tempat dependensi yang diperlukan untuk penganalisis akan diinstal. Menambahkan repositori Microsoft untuk berbagai distribusi Linux dijelaskan dalam dokumen terkait .



Untuk menginstal PVS-Studio melalui pengelola paket, Anda juga perlu menambahkan repositori PVS-Studio. Menambahkan repositori untuk distribusi yang berbeda dijelaskan lebih detail di bagian dokumentasi yang sesuai .



Penganalisis memerlukan kunci lisensi untuk beroperasi. Anda bisa mendapatkan lisensi uji coba di halaman unduh penganalisis .



Catatan... Harap dicatat bahwa mode operasi yang dijelaskan (analisis permintaan penggabungan) memerlukan lisensi Perusahaan. Oleh karena itu, jika Anda ingin mencoba mode operasi ini, jangan lupa untuk menunjukkan di kolom "Pesan" bahwa Anda memerlukan lisensi Enterprise.



Jika permintaan penggabungan terjadi, maka kami hanya perlu menganalisis daftar file yang diubah, jika tidak, kami menganalisis semua file. Setelah analisis, kita perlu mengubah log ke dalam format yang kita butuhkan.



Sekarang, setelah di depan mata Anda algoritme kerja, Anda dapat melanjutkan untuk menulis skrip. Untuk melakukan ini, Anda perlu memodifikasi file .gitlab-ci.yml atau, jika tidak, buatlah. Untuk membuatnya, Anda perlu mengklik nama proyek Anda -> Set up CI / CD .



image5.png


Sekarang kami siap untuk menulis skrip. Pertama-tama, tulis kode yang akan menginstal penganalisis dan masukkan lisensinya:



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


Karena instalasi dan aktivasi harus terjadi sebelum semua skrip lainnya, kami menggunakan tag before_script khusus . Saya akan menjelaskan sedikit penggalan ini.



Bersiap untuk menginstal 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


Menambahkan 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


Aktivasi lisensi:



  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY


$ PVS_NAME - nama pengguna.



$ PVS_KEY - kunci produk.



Memulihkan ketergantungan proyek, di mana $ CI_PROJECT_DIR adalah jalur lengkap ke direktori proyek:



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


Untuk analisis yang benar, proyek harus berhasil dibangun, dan ketergantungannya harus dipulihkan (misalnya, paket NuGet yang diperlukan harus dimuat).



Anda dapat menyetel variabel lingkungan yang berisi informasi lisensi dengan mengklik Pengaturan , lalu pada CI / CD .



image6.png


Di jendela yang terbuka, temukan item Variabel , di sebelah kanan, klik tombol Perluas dan tambahkan variabel. Hasilnya akan terlihat seperti ini:



image7.png


Sekarang Anda dapat melanjutkan ke analisis. Pertama, mari tambahkan skrip untuk analisis lengkap. Flag -t transfer path to solution, flag -o tulis lokasi file yang hasil analisisnya direkam. Kami juga tertarik dengan kode pengembalian. Dalam kasus ini, kami tertarik pada operasi yang dihentikan ketika kode pengembalian berisi informasi bahwa peringatan dikeluarkan selama analisis. Seperti inilah tampilan cuplikan 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


Kode pengembalian berfungsi seperti topeng bit. Misalnya, jika dari hasil analisis, peringatan dikeluarkan, maka kode pengembalian adalah 8. Jika lisensi kedaluwarsa dalam satu bulan, kode pengembalian adalah 4. Jika ditemukan kesalahan selama analisis, dan lisensi kedaluwarsa dalam waktu satu bulan, di kode return, kedua nilai akan ditulis: tambahkan angka-angka tersebut dan dapatkan kode pengembalian terakhir - 8 + 4 = 12. Jadi, dengan memeriksa bit yang sesuai, dimungkinkan untuk memperoleh informasi tentang berbagai status selama analisis. Kode pengembalian dijelaskan secara lebih rinci di bagian "kode pengembalian pvs-studio-dotnet (Linux / macOS)" dari dokumen " Memeriksa proyek Visual Studio / MSBuild / .NET Core dari baris perintah menggunakan PVS-Studio ".



Dalam hal ini, kami tertarik pada semua kode pengembalian,dimana 8 muncul.



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


Kita akan mendapatkan 1 ketika kode pengembalian berisi bit dari nomor yang kita minati, jika tidak kita akan mendapatkan 0.



Saatnya menambahkan parsing permintaan penggabungan. Sebelum melakukan ini, mari persiapkan tempat untuk naskah. Kami hanya membutuhkannya untuk dieksekusi ketika permintaan penggabungan terjadi. Ini terlihat seperti ini:



merge:
  script:
  only:
  - merge_requests


Mari beralih ke skrip itu sendiri. Saya menemukan fakta bahwa mesin virtual tidak tahu apa-apa tentang origin / master . Karena itu, kami sedikit membantunya:



  - git fetch origin


Sekarang mari kita dapatkan perbedaan antara cabang dan simpan hasilnya ke file txt :



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


Di mana $ CI_COMMIT_SHA adalah hash dari komit terakhir.



Selanjutnya, kami menjalankan analisis daftar file menggunakan -f flag . Kami mentransfer file .txt yang diterima sebelumnya ke sana. Nah, dengan analogi dengan analisis lengkap, kami melihat kode pengembalian:



  - 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 memeriksa permintaan penggabungan akan terlihat 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


Tetap hanya menambahkan konversi log setelah semua skrip berjalan. Kami menggunakan label after_script dan utilitas konverter- plog :



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


Utilitas plog-converter adalah proyek sumber terbuka yang digunakan untuk mengubah laporan kesalahan penganalisis ke dalam berbagai bentuk, seperti HTML. Penjelasan lebih rinci tentang utilitas ini diberikan di subbagian "Utilitas Konverter Plog" di bagian dokumentasi yang sesuai .



Omong-omong, jika Anda ingin bekerja dengan nyaman dengan laporan .json secara lokal dari IDE, maka saya sarankan plugin kami untuk IDE Rider. Penggunaannya dijelaskan lebih detail dalam dokumen terkait .



Untuk kenyamanan, inilah keseluruhan .gitlab-ci.yml :



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


Setelah semuanya ditambahkan ke file, klik Komit perubahan . Untuk melihat bahwa semuanya sudah benar, buka CI / CD -> Pipelines -> Running . Jendela mesin virtual akan terbuka, yang akhirnya adalah sebagai berikut:



image8.png


Kami melihat Ayub berhasil - sukses, semuanya baik-baik saja. Sekarang Anda dapat menguji apa yang telah Anda lakukan.



Contoh pekerjaan



Sebagai contoh pekerjaan, mari buat proyek sederhana (dalam master ) di mana akan ada beberapa file. Setelah itu, di cabang lain, kami hanya akan mengubah satu file dan mencoba membuat permintaan penggabungan.



Pertimbangkan dua kasus: ketika file yang dimodifikasi mengandung kesalahan dan ketika tidak. Pertama, contoh dengan kesalahan.



Katakanlah ada file Program.cs di cabang master , yang tidak mengandung kesalahan, dan di cabang lain, pengembang telah menambahkan kode yang salah dan ingin membuat permintaan penggabungan. Jenis kesalahan apa yang dia buat tidak begitu penting, yang utama adalah kesalahan itu ada. Misalnya, saya lupa operator lemparan (ya, mereka salah ):



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


Mari kita lihat hasil analisis contoh dengan kesalahan. Selain itu, untuk memastikan bahwa hanya satu file yang diurai, saya menambahkan -r flag ke baris startup pvs-studio-dotnet:



image9.png


Kami melihat bahwa penganalisis menemukan kesalahan dan tidak mengizinkan penggabungan cabang.



Memeriksa contoh tanpa kesalahan. Memperbaiki kode:



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


Hasil dari analisis permintaan penggabungan:



image10.png


Seperti yang bisa kita lihat, tidak ada kesalahan yang ditemukan, dan eksekusi tugas berhasil, yang ingin kami periksa.



Kesimpulan



Memfilter kode buruk sebelum menggabungkan cabang sangat nyaman dan menyenangkan. Oleh karena itu, jika Anda menggunakan CI / CD, coba buat di penganalisis statis untuk pengujian. Selain itu, ini dilakukan dengan cukup sederhana.



Terima kasih atas perhatian Anda.





Jika Anda ingin berbagi artikel ini dengan audiens berbahasa Inggris, silakan gunakan tautan terjemahan: Nikolay Mironov. Analisis permintaan penggabungan di GitLab menggunakan PVS-Studio untuk C # .



All Articles