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

Menganalisis Permintaan Gabungan dalam GitLab dengan PVS-Studio untuk C#
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.

PVS-Studio — это инструмент для выявления ошибок и потенциальных уязвимостей в исходном коде программ, написанных на языках 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 menarik. 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.json

Jika 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:

Menganalisis Permintaan Gabungan dalam GitLab dengan PVS-Studio untuk C#
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:

Menganalisis Permintaan Gabungan dalam GitLab dengan 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 permintaan komit dan tarik untuk C/C++, anda boleh membaca tentangnya di sini.

GitLab

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 artikel 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:

Menganalisis Permintaan Gabungan dalam GitLab dengan PVS-Studio untuk C#
Для работы анализатору требуется .NET Core SDK 3, поэтому перед установкой анализатора нужно добавить репозитории Microsoft, из которых будут установлены необходимые для анализатора зависимости. Добавление репозиториев Microsoft для различных дистрибутивов Linux diterangkan dalam dokumen yang berkaitan.

Untuk memasang PVS-Studio melalui pengurus pakej, anda juga perlu menambah repositori PVS-Studio. Menambah repositori untuk pelbagai pengedaran 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.

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.

Menganalisis Permintaan Gabungan dalam GitLab dengan 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_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 update

Menambah 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-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 pelesenan dengan mengklik pada Menetapkan, dan seterusnya CI/CD.

Menganalisis Permintaan Gabungan dalam GitLab dengan PVS-Studio untuk C#
Dalam tetingkap yang terbuka, kami mencari item tersebut Pembolehubah, klik pada butang di sebelah kanan Mengembangkan dan tambah pembolehubah. Hasilnya sepatutnya kelihatan seperti ini:

Menganalisis Permintaan Gabungan dalam GitLab dengan PVS-Studio untuk C#
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)" документа "Menyemak Projek Teras Visual Studio / MSBuild / .NET daripada Barisan Perintah dengan PVS-Studio".

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_requests

Mari 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 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 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; 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 dijalankan. Kami akan 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 format, seperti HTML. Penerangan yang lebih terperinci tentang utiliti disediakan dalam subseksyen "Plog Converter Utility". bahagian dokumentasi yang berkaitan.

Dengan cara ini, jika anda ingin bekerja dengan mudah dengan laporan .json secara tempatan daripada IDE, saya cadangkan 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 perubahanUntuk memastikan semuanya betul, pergi ke CI / CD -> Talian Paip -> BerlariTetingkap mesin maya akan dibuka, pada penghujungnya anda akan melihat perkara berikut:

Menganalisis Permintaan Gabungan dalam GitLab dengan PVS-Studio untuk C#
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, mereka sangat salah):

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:

Menganalisis Permintaan Gabungan dalam GitLab dengan PVS-Studio untuk C#
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:

Menganalisis Permintaan Gabungan dalam GitLab dengan PVS-Studio untuk C#
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.

Menganalisis Permintaan Gabungan dalam GitLab dengan 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

Beli pengehosan yang boleh dipercayai untuk tapak dengan perlindungan DDoS, pelayan VPS VDS 🔥 Beli pengehosan laman web yang boleh dipercayai dengan perlindungan DDoS, pelayan VPS VDS | ProHoster