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.
Omong-omong, kami merilis PVS-Studio 7.08, di mana kami melakukan banyak hal
- 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:
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:
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
GitLab
Sebelum Anda mulai menganalisis permintaan penggabungan, Anda perlu mendaftar dan mengunggah proyek Anda. Jika Anda tidak tahu cara melakukan ini, saya sarankan
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:
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
Untuk menginstal PVS-Studio melalui manajer paket, Anda juga perlu menambahkan repositori PVS-Studio. Menambahkan repositori untuk distribusi yang berbeda dijelaskan lebih detail di
Penganalisis memerlukan kunci lisensi untuk beroperasi. Anda bisa mendapatkan lisensi uji coba di
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.
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.
Di jendela yang terbuka, temukan item tersebut Variabel, klik tombol di sebelah kanan Lihat lebih lanjut dan menambahkan variabel. Hasilnya akan terlihat seperti ini:
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 "
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
Π°
Omong-omong, jika Anda ingin bekerja dengan nyaman dengan laporan .json secara lokal dari IDE, saya sarankan laporan kami
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:
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,
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:
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:
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.
Jika Anda ingin membagikan artikel ini kepada audiens berbahasa Inggris, silakan gunakan tautan terjemahan: Nikolay Mironov.
Sumber: www.habr.com