
Suka GitLab tetapi benci ralat? Ingin meningkatkan kualiti kod sumber anda? Kemudian anda telah datang ke tempat yang betul. Hari ini kami akan menerangkan cara mengkonfigurasi penganalisis C# PVS-Studio untuk menyemak permintaan gabungan. Mempunyai mood seperti unicorn dan nikmatilah.
— это инструмент для выявления ошибок и потенциальных уязвимостей в исходном коде программ, написанных на языках C, C++, C# и Java. Работает в 64-битных системах на Windows, Linux и macOS. Может анализировать код, предназначенный для 32-битных, 64-битных и встраиваемых ARM платформ.
Ngomong-ngomong, kami mengeluarkan PVS-Studio 7.08, di mana kami melakukan banyak perkara . Sebagai contoh:
- анализатор C# под Linux и macOS;
- pemalam untuk Rider;
- mod semakan senarai fail baharu.
Mod semakan senarai fail
Sebelum ini, untuk menyemak fail tertentu, anda perlu memberikan penganalisis fail .xml yang mengandungi senarai fail. Walau bagaimanapun, kerana ini tidak begitu mudah, kami telah menambahkan keupayaan untuk menghantar fail .txt, yang menjadikan perkara lebih mudah.
Untuk menyemak fail tertentu, anda perlu menentukan bendera —sourceFiles (-f) dan pindahkan fail .txt dengan senarai fail. Ia kelihatan seperti ini:
pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.jsonJika anda berminat untuk menyesuaikan semakan komit atau permintaan tarik, anda boleh melakukannya menggunakan mod ini juga. Perbezaannya adalah dalam senarai fail yang akan dianalisis dan ia bergantung pada sistem yang anda gunakan.
Prinsip pengesahan permintaan gabungan
Perkara utama semakan adalah untuk memastikan bahawa masalah yang dikesan oleh penganalisis tidak jatuh ke dalam gabungan master cawangan. Kami juga tidak mahu menganalisis keseluruhan projek setiap kali. Terutama kerana apabila menggabungkan cawangan, kami mempunyai senarai fail yang diubah. Oleh itu, saya mencadangkan menambah semakan permintaan gabungan.
Beginilah rupa permintaan gabungan sebelum melaksanakan penganalisis statik:

Iaitu, semua kesilapan yang ada dalam cawangan perubahan, akan dipindahkan ke cawangan induk. Oleh kerana kami tidak mahu ini, kami menambah analisis, dan kini rajah kelihatan seperti ini:

Kami menganalisis perubahan2 dan jika tiada ralat, kami menerima permintaan gabungan, jika tidak, kami menolaknya.
Ngomong-ngomong, jika anda berminat untuk menganalisis permintaan komit dan tarik untuk C/C++, anda boleh membaca tentangnya .
GitLab
— 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, saya cadangkan rakan sekerja saya.
NotaKaedah persediaan persekitaran yang diterangkan di bawah adalah satu pendekatan yang mungkin. Matlamatnya adalah untuk menunjukkan langkah-langkah untuk menyediakan persekitaran yang diperlukan untuk analisis dan menjalankan penganalisis. Mungkin, dalam kes anda, adalah lebih optimum untuk memisahkan langkah penyediaan persekitaran (menambah repositori, memasang penganalisis) dan analisis: contohnya, menyediakan imej Docker dengan persekitaran yang diperlukan dan menggunakannya, atau kaedah lain.
Untuk lebih memahami perkara yang akan berlaku, saya cadangkan anda melihat rajah berikut:

Для работы анализатору требуется .NET Core SDK 3, поэтому перед установкой анализатора нужно добавить репозитории Microsoft, из которых будут установлены необходимые для анализатора зависимости. Добавление репозиториев Microsoft для различных дистрибутивов Linux .
Untuk memasang PVS-Studio melalui pengurus pakej, anda juga perlu menambah repositori PVS-Studio. Menambah repositori untuk pelbagai pengedaran diterangkan dengan lebih terperinci dalam .
Penganalisis memerlukan kunci lesen untuk beroperasi. Anda boleh mendapatkan lesen percubaan di .
NotaSila ambil perhatian bahawa mod yang diterangkan (menganalisis permintaan gabungan) memerlukan lesen Perusahaan. Oleh itu, jika anda ingin mencuba mod ini, sila pastikan anda menyatakan dalam medan "Mesej" bahawa anda memerlukan lesen Perusahaan.
Jika permintaan gabungan berlaku, kami hanya perlu menganalisis senarai fail yang diubah suai; jika tidak, kami menganalisis semua fail. Selepas analisis, kita perlu menukar log kepada format yang diperlukan.
Memandangkan kita mempunyai algoritma yang berfungsi di hadapan kita, kita boleh terus menulis skrip. Untuk melakukan ini, kita perlu mengubah suai fail .gitlab-ci.yml Atau, jika ia tidak wujud, buat satu. Untuk menciptanya, klik pada nama projek anda -> Sediakan CI/CD.

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.slnMemandangkan pemasangan dan pengaktifan mesti berlaku sebelum semua skrip lain, kami menggunakan label khas sebelum_skripBiar saya terangkan sedikit serpihan ini.
Bersedia untuk pemasangan 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 updateMenambah repositori PVS-Studio dan penganalisis:
- 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-dotnetPengaktifan 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.slnUntuk 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 pelesenan dengan mengklik pada Menetapkan, dan seterusnya CI/CD.

Dalam tetingkap yang terbuka, kami mencari item tersebut Pembolehubah, klik pada butang di sebelah kanan Mengembangkan dan tambah pembolehubah. Hasilnya sepatutnya kelihatan seperti ini:

Sekarang kita boleh beralih kepada analisis. Mula-mula, mari tambah skrip untuk analisis penuh. Dalam bendera -t kita lulus jalan ke penyelesaian kepada bendera -o Kami memasuki laluan ke fail di mana keputusan analisis akan ditulis. Kami juga berminat dengan kod pulangan. Dalam kes ini, kami mahu analisis dihentikan apabila kod pulangan menunjukkan 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Коды возврата работают по принципу битовой маски. Например, если в результате анализа были выданы предупреждения, то код возврата будет равен 8. Если лицензия истечёт в течение месяца, то код возврата будет равен 4. Если же в ходе анализа были обнаружены ошибки, а также лицензия истекает в течение месяца, в код возврата будут записаны оба значения: складываем числа вместе и получаем итоговый код возврата — 8+4=12. Таким образом, проверяя соответствующие биты, можно получать информацию о различных состояниях во время анализа. Более подробно коды возврата описываются в разделе "Коды возврата pvs-studio-dotnet (Linux / macOS)" документа "".
Dalam kes ini, kami berminat dengan semua kod pulangan yang termasuk 8.
- exit_code=$((($exit_code & 8)/8))Kami mendapat 1 apabila kod pulangan mengandungi sedikit nombor yang kami minati, jika tidak, kami mendapat 0.
Sudah tiba masanya untuk menambah analisis permintaan gabungan. Sebelum itu, mari kita sediakan tempat untuk skrip. Kami mahu ia dijalankan hanya apabila permintaan gabungan berlaku. Ia kelihatan seperti ini:
merge:
script:
only:
- merge_requestsMari kita beralih kepada skrip itu sendiri. Saya menghadapi masalah yang mesin maya tidak tahu apa-apa asal / tuan. Jadi mari kita bantu dia sedikit:
- git fetch originSekarang 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 memulakan analisis senarai fail menggunakan bendera -fKami menghantar fail .txt yang diperoleh sebelum ini ke dalamnya. Dan, sama dengan analisis penuh, kami 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; fiSkrip 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_requestsYang tinggal hanyalah menambah penukaran log selepas semua skrip dijalankan. Kami akan menggunakan label selepas_skrip dan utiliti plog-converter:
after_script:
- plog-converter -t html -o eLog ./PVS-Studio.jsonUtiliti — ialah projek sumber terbuka yang digunakan untuk menukar laporan ralat penghurai kepada pelbagai format, seperti HTML. Penerangan yang lebih terperinci tentang utiliti disediakan dalam subseksyen "Plog Converter Utility". .
Dengan cara ini, jika anda ingin bekerja dengan mudah dengan laporan .json secara tempatan daripada IDE, saya cadangkan untuk IDE Rider. Penggunaannya diterangkan dengan lebih terperinci dalam .
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.jsonSebaik sahaja anda telah menambah segala-galanya pada fail, klik pada Lakukan perubahanUntuk memastikan semuanya betul, pergi ke CI / CD -> Talian Paip -> BerlariTetingkap mesin maya akan dibuka, pada penghujungnya anda akan melihat perkara berikut:

Kami nampak Ayub berjaya – Kejayaan, semuanya hebat. Sekarang kita boleh menguji apa yang telah kita lakukan.
Contoh kerja
Untuk menggambarkan 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: satu di mana fail yang diubah suai mengandungi ralat dan satu di mana ia tidak. Pertama, contoh dengan ralat.
Katakan terdapat fail dalam cawangan induk Program.cs, yang tidak mengandungi ralat dan dalam cawangan lain, pembangun menambahkan kod yang salah dan ingin membuat permintaan gabungan. Ralat yang tepat tidak begitu penting, perkara utama ialah ia wujud. Contohnya, mereka terlupa operator membuang (Ya, ):
void MyAwesomeMethod(String name)
{
if (name == null)
new ArgumentNullException(....);
// do something
....
}Mari lihat hasil analisis untuk contoh dengan ralat. Selain itu, untuk memastikan hanya satu fail dianalisis, saya menambah bendera -r dalam baris pelancaran pvs-studio-dotnet:

Kami melihat bahawa penganalisis mendapati ralat dan tidak membenarkan penggabungan cawangan.
Mari kita semak contoh tanpa ralat. Betulkan kod:
void MyAwesomeMethod(String name)
{
if (name == null)
throw new ArgumentNullException(....);
// do something
....
}Keputusan analisis permintaan gabungan:

Seperti yang kita dapat lihat, tiada ralat ditemui, dan tugas itu telah dilaksanakan dengan jayanya, itulah yang kami ingin periksa.
Kesimpulan
Membuang kod buruk sebelum menggabungkan cawangan adalah sangat mudah dan menyeronokkan. Jadi, jika anda menggunakan CI/CD, cuba integrasikan penganalisis statik untuk semakan. Terutama kerana ia agak mudah.
Terima kasih atas perhatian anda.
Jika anda ingin berkongsi artikel ini dengan penonton berbahasa Inggeris, sila gunakan pautan terjemahan: Nikolay Mironov. .
Sumber: www.habr.com
