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

Analisis permintaan penggabungan di GitLab menggunakan PVS-Studio untuk C#
Suka GitLab dan benci bug? Ingin meningkatkan kualitas kode sumber Anda? Maka Anda telah datang ke tempat yang tepat. Hari ini kami akan memberi tahu Anda cara mengonfigurasi penganalisis PVS-Studio C# untuk memeriksa permintaan penggabungan. Miliki suasana hati unicorn dan selamat membaca untuk semua orang.

PVS-Studio adalah alat untuk mengidentifikasi 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 yang dirancang untuk platform ARM 32-bit, 64-bit, dan tertanam.

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

  • Penganalisis C# untuk Linux dan macOS;
  • plugin untuk Pengendara;
  • mode pemeriksaan daftar file baru.

Mode pemeriksaan daftar file

Sebelumnya, untuk memeriksa file tertentu, .xml dengan daftar file harus diteruskan ke penganalisis. Namun karena ini sangat tidak nyaman, kami telah menambahkan kemampuan untuk mentransfer .txt, yang membuat hidup menjadi sangat sederhana.

Untuk memeriksa file tertentu, Anda harus menentukan tandanya --file sumber (-f) dan transfer .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 menyiapkan pemeriksaan komit atau permintaan penarikan, Anda juga dapat melakukannya menggunakan mode ini. Perbedaannya terletak pada mendapatkan daftar file untuk dianalisis dan bergantung pada sistem yang Anda gunakan.

Prinsip memeriksa permintaan penggabungan

Inti utama dari pemeriksaan ini adalah untuk memastikan bahwa masalah yang terdeteksi oleh penganalisis selama penggabungan tidak termasuk dalam menguasai cabang. Kami juga tidak ingin menganalisis keseluruhan proyek setiap saat. Selain itu, saat menggabungkan cabang, kami memiliki daftar file yang diubah. Oleh karena itu, saya sarankan menambahkan pemeriksaan permintaan penggabungan.

Ini adalah tampilan permintaan penggabungan sebelum mengimplementasikan penganalisis statis:

Analisis permintaan penggabungan di GitLab menggunakan PVS-Studio untuk C#
Artinya, semua kesalahan yang ada di cabang perubahan, akan pindah ke cabang master. Karena kami tidak menginginkan ini, kami menambahkan analisis, dan sekarang diagramnya terlihat seperti ini:

Analisis permintaan penggabungan di GitLab menggunakan PVS-Studio untuk C#
Menganalisa perubahan2 dan, jika tidak ada kesalahan, kami menerima permintaan penggabungan, jika tidak, kami menolaknya.

Omong-omong, jika Anda tertarik untuk menganalisis penerapan dan menarik permintaan untuk C/C++, Anda dapat membacanya di sini.

GitLab

GitLab adalah alat siklus hidup DevOps berbasis web sumber terbuka yang menyediakan sistem manajemen repositori kode untuk Git dengan wikinya sendiri, sistem pelacakan masalah, saluran CI/CD, dan fitur lainnya.

Sebelum Anda mulai menganalisis permintaan penggabungan, Anda perlu mendaftar dan mengunggah proyek Anda. Jika Anda tidak tahu cara melakukan ini, saya sarankan sebuah artikel kolega saya.

Catatan. Metode pengaturan lingkungan yang dijelaskan di bawah ini adalah salah satu metode yang mungkin. Tujuannya adalah untuk menunjukkan langkah-langkah menyiapkan lingkungan yang diperlukan untuk analisis dan meluncurkan 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:

Analisis permintaan penggabungan di GitLab menggunakan PVS-Studio untuk C#
Penganalisis memerlukan .NET Core SDK 3 untuk beroperasi, 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 manajer paket, Anda juga perlu menambahkan repositori PVS-Studio. Menambahkan repositori untuk distribusi yang berbeda dijelaskan lebih detail di bagian dokumentasi yang relevan.

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 Perusahaan.

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

Sekarang, dengan algoritma kerja di depan mata Anda, Anda dapat melanjutkan ke penulisan skrip. Untuk melakukan ini, Anda perlu mengubah file .gitlab-ci.yml atau, jika tidak ada, buatlah. Untuk membuatnya, Anda perlu mengklik nama proyek Anda -> Siapkan CI/CD.

Analisis permintaan penggabungan di GitLab menggunakan PVS-Studio untuk C#
Sekarang kita siap untuk menulis naskahnya. Pertama-tama mari kita tulis kode yang akan menginstal penganalisis dan memasukkan 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 dilakukan sebelum semua skrip lainnya, kami menggunakan label khusus sebelum_skrip. Izinkan saya menjelaskan sedikit bagian ini.

Persiapan 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

Menambahkan repositori dan penganalisa 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 belakang.

$PVS_KEY - kunci produk.

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

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

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

Anda dapat mengatur variabel lingkungan yang berisi informasi lisensi dengan mengklik Pengaturan, dan setelah - pada CI/CD.

Analisis permintaan penggabungan di GitLab menggunakan PVS-Studio untuk C#
Di jendela yang terbuka, temukan item tersebut Variabel, klik tombol di sebelah kanan Lihat lebih lanjut dan menambahkan variabel. Hasilnya akan terlihat seperti ini:

Analisis permintaan penggabungan di GitLab menggunakan PVS-Studio untuk C#
Sekarang Anda dapat melanjutkan ke analisis. Pertama, mari tambahkan skrip untuk analisis lengkap. Ke bendera -t kami melewati jalur menuju solusi bendera -o tulis path ke file tempat hasil analisis akan ditulis. Kami juga tertarik dengan kode pengembalian. Dalam hal ini, kami tertarik pada penghentian operasi ketika kode pengembalian berisi informasi bahwa peringatan dikeluarkan selama analisis. Seperti inilah tampilan fragmen 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 bekerja berdasarkan prinsip bit mask. Misalnya, jika peringatan dikeluarkan sebagai hasil analisis, maka kode pengembalian akan sama dengan 8. Jika lisensi habis masa berlakunya dalam waktu satu bulan, maka kode pengembalian akan sama dengan 4. Jika kesalahan terdeteksi selama analisis, dan lisensinya habis masa berlakunya dalam waktu satu bulan, kode kembali, kedua nilai akan ditulis: jumlahkan angka-angkanya dan dapatkan kode pengembalian akhir - 8+4=12. Jadi, dengan memeriksa bit yang sesuai, informasi tentang berbagai keadaan dapat diperoleh selama analisis. Kode pengembalian dijelaskan secara lebih rinci di bagian "pvs-studio-dotnet (Linux / macOS) Kode Pengembalian" pada dokumen "Memeriksa proyek Visual Studio/MSBuild/.NET Core dari baris perintah menggunakan PVS-Studio".

Dalam hal ini, kami tertarik pada semua kode pengembalian yang menampilkan 8.

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

Kami akan menerima 1 ketika kode pengembalian berisi bit nomor yang kami minati, jika tidak, kami akan menerima 0.

Saatnya menambahkan analisis permintaan penggabungan. Sebelum kita melakukan ini, mari kita siapkan tempat untuk naskahnya. Kami membutuhkannya untuk dieksekusi hanya ketika permintaan penggabungan terjadi. Ini terlihat seperti ini:

merge:
  script:
  only:
  - merge_requests

Mari beralih ke skrip itu sendiri. Saya dihadapkan pada kenyataan bahwa mesin virtual tidak tahu apa-apa asal/master. Jadi mari kita bantu dia sedikit:

  - git fetch origin

Sekarang kita mendapatkan perbedaan antara cabang dan menyimpan hasilnya txt mengajukan:

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

Π“Π΄Π΅ $CI_COMMIT_SHA – hash dari komit terakhir.

Selanjutnya, kita mulai menganalisis daftar file menggunakan flag -f. Kami mentransfer file .txt yang diterima sebelumnya ke sana. Nah, dengan analogi dengan analisis lengkap, kita 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

Script 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

Tinggal menambahkan konversi log setelah semua skrip diproses. Kami menggunakan labelnya setelah_skrip dan utilitas konverter plog:

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

Π° konverter plog adalah proyek sumber terbuka yang digunakan untuk mengubah laporan kesalahan parser ke dalam berbagai bentuk, seperti HTML. Penjelasan lebih rinci tentang utilitas ini diberikan di subbagian "Utilitas Konverter Plog" bagian dokumentasi yang relevan.

Omong-omong, jika Anda ingin bekerja dengan nyaman dengan laporan .json secara lokal dari IDE, saya sarankan laporan kami plugin untuk IDE Rider. Penggunaannya dijelaskan lebih rinci di dokumen yang relevan.

Untuk kenyamanan, 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

Setelah Anda menambahkan semuanya ke file, klik Komit perubahan. Untuk melihat apakah semuanya benar, buka CI / CD -> Jaringan pipa -> Running. Jendela mesin virtual akan terbuka, yang pada akhirnya akan muncul yang berikut:

Analisis permintaan penggabungan di GitLab menggunakan PVS-Studio untuk C#
gergaji Pekerjaan berhasil - sukses, semuanya baik-baik saja. Sekarang Anda dapat menguji apa yang telah Anda lakukan.

Contoh pekerjaan

Sebagai contoh pekerjaan, mari kita buat proyek sederhana (dalam menguasai) yang akan berisi beberapa file. Setelah itu, di cabang lain kita hanya akan mengubah satu file dan mencoba membuat permintaan penggabungan.

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

Katakanlah ada file di cabang master Program.cs, yang tidak mengandung kesalahan, tetapi di cabang lain pengembang menambahkan kode yang salah dan ingin membuat permintaan penggabungan. Kesalahan apa yang dia lakukan tidak begitu penting, yang penting kesalahan itu ada. Misalnya operatornya lupa melemparkan (Ya, jadi salah):

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

Mari kita lihat hasil analisis contoh yang error. Juga untuk memastikan bahwa hanya satu file yang diurai, saya menambahkan bendera -r ke jalur peluncuran pvs-studio-dotnet:

Analisis permintaan penggabungan di GitLab menggunakan PVS-Studio untuk C#
Kami melihat bahwa penganalisis menemukan kesalahan dan tidak mengizinkan penggabungan cabang.

Mari kita periksa contohnya tanpa kesalahan. Memperbaiki kode:

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

Hasil analisis permintaan penggabungan:

Analisis permintaan penggabungan di GitLab menggunakan PVS-Studio untuk C#
Seperti yang bisa kita lihat, tidak ada kesalahan yang ditemukan, dan pelaksanaan tugas berhasil, itulah yang ingin kami periksa.

Kesimpulan

Menyingkirkan kode buruk sebelum menggabungkan cabang sangat mudah dan menyenangkan. Jadi jika Anda menggunakan CI/CD, coba sematkan penganalisis statis untuk memeriksanya. Selain itu, hal ini dilakukan dengan cukup sederhana.

Terima kasih atas perhatian Anda.

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

Sumber: www.habr.com

Tambah komentar