Анализ на merge request'овС в GitLab с PVS-Studio за C#

Анализ Π½Π° merge request'ΠΎΠ²Π΅ Π² GitLab с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio Π·Π° C#
ΠžΠ±ΠΈΡ‡Π°Ρ‚Π΅ GitLab ΠΈ Π½Π΅ ΠΎΠ±ΠΈΡ‡Π°Ρ‚Π΅ Π³Ρ€Π΅ΡˆΠΊΠΈ? Π˜ΡΠΊΠ°Ρ‚Π΅ Π΄Π° ΠΏΠΎΠ²ΠΈΡˆΠΈΡ‚Π΅ качСството Π½Π° изходния ΠΊΠΎΠ΄? Π’ΠΎΠ³Π°Π²Π° стС Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎΡ‚ΠΎ място. ДнСс Ρ‰Π΅ Ρ€Π°Π·ΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠ°ΠΊ Π΄Π° настроитС C# Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° PVS-Studio Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° merge request'ΠΎΠ²Π΅. На всички ТСлая Π΄ΠΎΠ±Ρ€ΠΎ настроСниС ΠΈ приятно Ρ‡Π΅Ρ‚Π΅Π½Π΅.

PVS-Studio Π΅ инструмСнт Π·Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π°Π½Π΅ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΈ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»Π½ΠΈ уязвимости Π² изходния ΠΊΠΎΠ΄ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ, написани Π½Π° C, C++, C# ΠΈ Java. Π Π°Π±ΠΎΡ‚ΠΈ Π½Π° 64-Π±ΠΈΡ‚Π½ΠΈ систСми ΠΏΠΎΠ΄ Windows, Linux ΠΈ macOS. МоТС Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π° ΠΊΠΎΠ΄, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Π·Π° 32-Π±ΠΈΡ‚Π½ΠΈ, 64-Π±ΠΈΡ‚Π½ΠΈ ΠΈ Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈ ARM ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΈ.

ΠœΠ΅ΠΆΠ΄Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΡ‚ΠΎ, ΠΈΠΌΠ°ΠΌΠ΅ Π½ΠΎΠ²Π° вСрсия Π½Π° PVS-Studio 7.08, Π² която Π½Π°ΠΏΡ€Π°Π²ΠΈΡ…ΠΌΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ нововъвСдСния интСрСсни Π½Π΅Ρ‰Π°. НапримСр:

  • C# Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π·Π° Linux ΠΈ macOS;
  • плъгин Π·Π° Rider;
  • Π½ΠΎΠ² Ρ€Π΅ΠΆΠΈΠΌ Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° списък с Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅.

Π Π΅ΠΆΠΈΠΌ Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° списък с Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅

По-Ρ€Π°Π½ΠΎ, Π·Π° Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, Ρ‚Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° ΠΏΡ€Π΅Π΄Π°Π΄Π΅Ρ‚Π΅ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° .xml с списъка Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅. Но Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Ρ‚ΠΎΠ²Π° Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Π΄ΠΎΠ±Π°Π²ΠΈΡ…ΠΌΠ΅ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅ Π½Π° .txt, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ улСснява ΠΆΠΈΠ²ΠΎΡ‚Π°.

Π—Π° Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, трябва Π΄Π° ΡƒΠΊΠ°ΠΆΠ΅Ρ‚Π΅ Ρ„Π»Π°Π³Π° --sourceFiles (-f) ΠΈ Π΄Π° ΠΏΡ€Π΅Π΄Π°Π΄Π΅Ρ‚Π΅ .txt с списъка Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅. Π’ΠΎΠ²Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ слСдния Π½Π°Ρ‡ΠΈΠ½:

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

Ако Π²ΠΈ интСрСсува Π΄Π° настроитС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈ ΠΈΠ»ΠΈ pull requests, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Ρ‚ΠΎΠ²Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Ρ‚ΠΎΠ·ΠΈ Ρ€Π΅ΠΆΠΈΠΌ. Π Π°Π·Π»ΠΈΠΊΠ°Ρ‚Π° Ρ‰Π΅ бъдС Π² ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° списък с Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π·Π° Π°Π½Π°Π»ΠΈΠ· ΠΈ зависи ΠΎΡ‚ систСмитС, ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° merge request

ΠžΡΠ½ΠΎΠ²Π½Π°Ρ‚Π° Ρ†Π΅Π» Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°Ρ‚Π° Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈΡ‚Π΅, ΠΎΡ‚ΠΊΡ€ΠΈΡ‚ΠΈ ΠΎΡ‚ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, Π΄Π° Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π½Π°Ρ‚ Π² master ΠΊΠ»ΠΎΠ½. Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Π½Π΅ искамС всСки ΠΏΡŠΡ‚ Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° изцяло. Π’Π΅ΠΌ ΠΏΠΎΠ²Π΅Ρ‡Π΅, Ρ‡Π΅ ΠΏΡ€ΠΈ сливанС Π½Π° ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅Ρ‚Π΅ ΠΈΠΌΠ°ΠΌΠ΅ списък с ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅. Π—Π°Ρ‚ΠΎΠ²Π° ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΠΌ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° merge request.

Π’Π°ΠΊΠ° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° merge request ΠΏΡ€Π΅Π΄ΠΈ внСдряванС Π½Π° статичния Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€:

Анализ Π½Π° merge request'ΠΎΠ²Π΅ Π² GitLab с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio Π·Π° C#
ВоСст всички Π³Ρ€Π΅ΡˆΠΊΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π±ΠΈΠ»ΠΈ Π² ΠΊΠ»ΠΎΠ½Π° changes, Ρ‰Π΅ ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Ρ‚ Π² главния ΠΊΠ»ΠΎΠ½. ПонСТС Π½Π΅ ΠΆΠ΅Π»Π°Π΅ΠΌ Ρ‚ΠΎΠ²Π°, добавямС Π°Π½Π°Π»ΠΈΠ·, ΠΈ сСга схСмата ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ слСдния Π½Π°Ρ‡ΠΈΠ½:

Анализ Π½Π° merge request'ΠΎΠ²Π΅ Π² GitLab с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio Π·Π° C#
АнализиранС Π½Π° changes2 ΠΈ, Π°ΠΊΠΎ няма Π³Ρ€Π΅ΡˆΠΊΠΈ, ΠΏΡ€ΠΈΠ΅ΠΌΠ°ΠΌΠ΅ merge request, Π° Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π΅Π½ случай Π³ΠΎ ΠΎΡ‚Ρ…Π²ΡŠΡ€Π»ΡΠΌΠ΅.

ΠœΠ΅ΠΆΠ΄Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΡ‚ΠΎ, Π°ΠΊΠΎ Π²ΠΈ интСрСсува Π°Π½Π°Π»ΠΈΠ· Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈ ΠΈ pull request'ΠΎΠ²Π΅ Π·Π° C/C++, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ Π·Π° Π½Π΅Π³ΠΎ Ρ‚ΡƒΠΊ..

GitLab

GitLab β€” инструмСнт Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ТизнСния Π½Π° DevOps с ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄, прСдставляващ систСма Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ΄ΠΎΠ²ΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π·Π° Git с Π²Π³Ρ€Π°Π΄Π΅Π½Π° ΡƒΠΈΠΊΠΈ, систСма Π·Π° прослСдяванС Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ, CI/CD ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ΠŸΡ€Π΅Π΄ΠΈ Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ с Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° merge request-ΠΈΡ‚Π΅, Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° сС рСгистриратС ΠΈ Π΄Π° ΠΊΠ°Ρ‡ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° си. Ако Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅ ΠΊΠ°ΠΊ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΠΌ статия ΠΊΠΎΠ»Π΅Π³Π°Ρ‚Π° ΠΌΠΈ.

Π—Π°Π±Π΅Π»Π΅ΠΆΠΊΠ°. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π΅Π½ΠΈΡΡ‚ ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ Π½Π°Ρ‡ΠΈΠ½ Π·Π° настройка Π½Π° срСда Π΅ Π΅Π΄ΠΈΠ½ ΠΎΡ‚ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΈΡ‚Π΅. Π¦Π΅Π»Ρ‚Π° Π΅ Π΄Π° сС ΠΏΠΎΠΊΠ°ΠΆΠ°Ρ‚ ΡΡ‚ΡŠΠΏΠΊΠΈΡ‚Π΅ Π·Π° настройка Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ°Ρ‚Π° срСда Π·Π° Π°Π½Π°Π»ΠΈΠ· ΠΈ стартиранС Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°. Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅ Π² случая Π²ΠΈ ΠΏΠΎ-ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»Π½ΠΎ Π΄Π° бъдС раздСлянСто Π½Π° Π΅Ρ‚Π°ΠΏΠΈΡ‚Π΅ Π½Π° ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π½Π° срСдата (добавянС Π½Π° Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ, инсталиранС Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°) ΠΈ Π°Π½Π°Π»ΠΈΠ·: Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π½Π° Docker ΠΎΠ±Ρ€Π°Π·ΠΈ с Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ°Ρ‚Π° срСда ΠΈ тяхното ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ ΠΈΠ»ΠΈ някакъв Π΄Ρ€ΡƒΠ³ ΠΌΠ΅Ρ‚ΠΎΠ΄.

Π—Π° ΠΏΠΎ-ясно Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ ΠΊΠ°ΠΊΠ²ΠΎ Ρ‰Π΅ сС случва сСга, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΠΌ Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅Ρ‚Π΅ слСдната схСма:

Анализ Π½Π° merge request'ΠΎΠ²Π΅ Π² GitLab с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio Π·Π° C#
ΠΠ½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΡŠΡ‚ изисква .NET Core SDK 3, Π·Π°Ρ‚ΠΎΠ²Π° ΠΏΡ€Π΅Π΄ΠΈ инсталацията Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈΡ‚Π΅ Π½Π° Microsoft, ΠΎΡ‚ ΠΊΠΎΠΈΡ‚ΠΎ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ инсталирани Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈΡ‚Π΅ зависимости Π·Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°. ДобавянСто Π½Π° Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Π½Π° Microsoft Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ дистрибуции Π½Π° Linux Π΅ описано Π² ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚.

Π—Π° инсталиранС Π½Π° PVS-Studio Ρ‡Ρ€Π΅Π· ΠΏΠ°ΠΊΠ΅Ρ‚Π΅Π½ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡŠΡ€ ΡΡŠΡ‰ΠΎ Ρ‰Π΅ бъдС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈΡ‚Π΅ Π½Π° PVS-Studio. ДобавянСто Π½Π° Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ дистрибуции Π΅ ΠΏΠΎ-ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ описано Π² ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ Ρ€Π°Π·Π΄Π΅Π» Π½Π° докумСнтацията.

Π—Π° Ρ€Π°Π±ΠΎΡ‚Π° Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ Π»ΠΈΡ†Π΅Π½Π·Π΅Π½ ΠΊΠ»ΡŽΡ‡. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ±Π΅Π½ Π»ΠΈΡ†Π΅Π½Π· Π½Π° страницата Π·Π° изтСглянС Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°.

Π—Π°Π±Π΅Π»Π΅ΠΆΠΊΠ°. ΠžΠ±ΡŠΡ€Π½Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Π΅ Π·Π° описания Ρ€Π΅ΠΆΠΈΠΌ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° (Π°Π½Π°Π»ΠΈΠ· Π½Π° merge requests) Π΅ Π½ΡƒΠΆΠ½Π° Enterprise лицСнзия. Π—Π°Ρ‚ΠΎΠ²Π°, Π°ΠΊΠΎ ΠΆΠ΅Π»Π°Π΅Ρ‚Π΅ Π΄Π° ΠΏΡ€ΠΎΠ±Π²Π°Ρ‚Π΅ Ρ‚ΠΎΠ·ΠΈ Ρ€Π΅ΠΆΠΈΠΌ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°, Π² ΠΏΠΎΠ»Π΅Ρ‚ΠΎ "Π‘ΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅" Π½Π΅ забравяйтС Π΄Π° посочитС, Ρ‡Π΅ Π²ΠΈ Π΅ Π½ΡƒΠΆΠ½Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Enterprise лицСнзия.

Ако сС случи merge request, Ρ‰Π΅ Π½ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ Π°Π½Π°Π»ΠΈΠ· само Π½Π° списъка с ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, Π° Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π΅Π½ случай Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ всички Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅. Π‘Π»Π΅Π΄ Π°Π½Π°Π»ΠΈΠ·Π° Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€Π°ΠΌΠ΅ Π»ΠΎΠ³ΠΎΠ²Π΅Ρ‚Π΅ Π² нСобходимия Ρ„ΠΎΡ€ΠΌΠ°Ρ‚.

Π‘Π΅Π³Π°, ΠΈΠΌΠ°ΠΉΠΊΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌΠ° Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΡ€Π΅Π΄ ΠΎΡ‡ΠΈΡ‚Π΅ си, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡ€ΠΈΡΡ‚ΡŠΠΏΠΈΠΌ към написванСто Π½Π° скрипта. Π—Π° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ, Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΠΌ Ρ„Π°ΠΉΠ»Π° .gitlab-ci.yml ΠΈΠ»ΠΈ, Π°ΠΊΠΎ Π³ΠΎ няма, Π΄Π° създадСм. Π—Π° Π½Π΅Π³ΠΎΠ²ΠΎΡ‚ΠΎ създаванС натиснСтС Π½Π° ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° си -> НастройтС CI/CD.

Анализ Π½Π° merge request'ΠΎΠ²Π΅ Π² GitLab с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio Π·Π° C#
Π‘Π΅Π³Π° смС Π³ΠΎΡ‚ΠΎΠ²ΠΈ Π΄Π° напишСм скрипта. НСка ΠΏΡŠΡ€Π²ΠΎ напишСм ΠΊΠΎΠ΄, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ инсталира Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΈ Ρ‰Π΅ въвСдС Π»ΠΈΡ†Π΅Π½Π·Π°:

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

Въй ΠΊΠ°Ρ‚ΠΎ инсталиранСто ΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ трябва Π΄Π° сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ°Ρ‚ ΠΏΡ€Π΅Π΄ΠΈ всички останали скриптовС, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ спСциалСн Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚ before_script. НСка обясня Ρ‚ΠΎΠ·ΠΈ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚.

ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π·Π° инсталиранСто Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°:

  - 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

ДобавянС Π½Π° Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈΡ‚Π΅ Π½Π° 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

АктивиранС Π½Π° Π»ΠΈΡ†Π΅Π½Π·Π°:

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY

$PVS_NAME β€” потрСбитСлско ΠΈΠΌΠ΅.

$PVS_KEY β€” ΠΊΠ»ΡŽΡ‡ Π·Π° ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°.

Π’ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ Π½Π° зависимоститС Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ $CI_PROJECT_DIR – пълСн ΠΏΡŠΡ‚ Π΄ΠΎ дирСкторията Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

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

Π—Π° ΠΊΠΎΡ€Π΅ΠΊΡ‚Π΅Π½ Π°Π½Π°Π»ΠΈΠ· ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΡŠΡ‚ трябва Π΄Π° сС ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈ зависимоститС ΠΌΡƒ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²Π΅Π½ΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈΡ‚Π΅ NuGet ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ трябва Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΈΠ·Ρ‚Π΅Π³Π»Π΅Π½ΠΈ).

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π·Π°Π΄Π°Π΄Π΅Ρ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° срСдата, ΠΊΠΎΠΈΡ‚ΠΎ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‚ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΎΠ½Π½Π° информация, ΠΊΠ°Ρ‚ΠΎ ΠΊΠ»ΠΈΠΊΠ½Π΅Ρ‚Π΅ Π½Π° Setting, Π° слСд Ρ‚ΠΎΠ²Π° β€” Π½Π° CI / CD.

Анализ Π½Π° merge request'ΠΎΠ²Π΅ Π² GitLab с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio Π·Π° C#
Π’ отворСния ΠΏΡ€ΠΎΠ·ΠΎΡ€Π΅Ρ† Π½Π°ΠΌΠΈΡ€Π°ΠΌΠ΅ ΠΏΡƒΠ½ΠΊΡ‚Π° ΠŸΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, отдясно натискамС Π±ΡƒΡ‚ΠΎΠ½Π° Expand ΠΈ добавямС ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ. Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ трябва Π΄Π° сС ΠΏΠΎΠ»ΡƒΡ‡ΠΈ слСдното:

Анализ Π½Π° merge request'ΠΎΠ²Π΅ Π² GitLab с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio Π·Π° C#
Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌ към Π°Π½Π°Π»ΠΈΠ·Π°. ΠŸΡŠΡ€Π²ΠΎ, Ρ‰Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ скрипт Π·Π° пълСн Π°Π½Π°Π»ΠΈΠ·. Π’ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€Π° -t ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°ΠΌΠ΅ ΠΏΡŠΡ‚Ρ Π΄ΠΎ solution, Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€Π° -o Π²ΠΊΠ»ΡŽΡ‡Π²Π°ΠΌΠ΅ ΠΏΡŠΡ‚Ρ Π΄ΠΎ Ρ„Π°ΠΉΠ»Π°, Π² ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ записани Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ ΠΎΡ‚ Π°Π½Π°Π»ΠΈΠ·Π°. Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Π½ΠΈ интСрСсува ΠΊΠΎΠ΄ΡŠΡ‚ Π½Π° Π²Ρ€ΡŠΡ‰Π°Π½Π΅. Π’ Ρ‚ΠΎΠ·ΠΈ случай Π΅ Π²Π°ΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π΄Π° спрС, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΊΠΎΠ΄ΡŠΡ‚ Π½Π° Π²Ρ€ΡŠΡ‰Π°Π½Π΅ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° информация, Ρ‡Π΅ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π° са Π±ΠΈΠ»ΠΈ ΠΈΠ·Π΄Π°Π΄Π΅Π½ΠΈ прСдупрСТдСния. Π•Ρ‚ΠΎ ΠΊΠ°ΠΊ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Ρ‚ΠΎΠ·ΠΈ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚:

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)" Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°.ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ Visual Studio / MSBuild / .NET Core ΠΎΡ‚ командния Ρ€Π΅Π΄ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio.".

Π’ Ρ‚ΠΎΠ·ΠΈ случай Π½ΠΈ интСрСсуват всички ΠΊΠΎΠ΄ΠΎΠ²Π΅ Π·Π° Π²Ρ€ΡŠΡ‰Π°Π½Π΅, Π² ΠΊΠΎΠΈΡ‚ΠΎ Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π° 8.

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

Π©Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ 1, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΊΠΎΠ΄ΡŠΡ‚ Π·Π° Π²Ρ€ΡŠΡ‰Π°Π½Π΅ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° интСрСсуващия Π½ΠΈ Π±ΠΈΡ‚ ΠΎΡ‚ числото, Π° Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π΅Π½ случай ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ 0.

ΠΠ°ΡΡ‚ΡŠΠΏΠΈ Π²Ρ€Π΅ΠΌΠ΅ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π°Π½Π°Π»ΠΈΠ· Π½Π° merge request. ΠŸΡ€Π΅Π΄ΠΈ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ Ρ‚ΠΎΠ²Π°, Π΄Π° ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²ΠΈΠΌ място Π·Π° скрипта. НСобходимо Π΅ Π΄Π° сС изпълнява само ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π½Π°ΡΡ‚ΡŠΠΏΠΈ merge request. ИзглСТда Ρ‚Π°ΠΊΠ°:

merge:
  script:
  only:
  - merge_requests

Π”Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌ към самия скрипт. Π‘ΠΏΡ€Π°Π²ΠΈΡ… сС с Ρ‚ΠΎΠ²Π°, Ρ‡Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π°Ρ‚Π° машина Π½Π΅ Π·Π½Π°Π΅ Π½ΠΈΡ‰ΠΎ Π·Π° origin/master. Π—Π°Ρ‚ΠΎΠ²Π° ΠΉ ΠΏΠΎΠΌΠ°Π³Π°ΠΌΠ΅ ΠΌΠ°Π»ΠΊΠΎ:

  - git fetch origin

Π‘Π΅Π³Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ Ρ€Π°Π·Π»ΠΈΠΊΠ°Ρ‚Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅Ρ‚Π΅ ΠΈ Π·Π°ΠΏΠ°Π·Π²Π°ΠΌΠ΅ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚Π° Π² txt Ρ„Π°ΠΉΠ»:

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

КъдС $CI_COMMIT_SHA – Ρ…Π΅Ρˆ Π½Π° послСдния ΠΊΠΎΠΌΠΈΡ‚.

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° стартирамС Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° списъка с Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Ρ„Π»Π°Π³Π° -f. Π’ Π½Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄Π°Π²Π°ΠΌΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎΡ‚ΠΎ ΠΏΠΎ-Ρ€Π°Π½ΠΎ .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

ΠŸΡŠΠ»Π½ΠΈΡΡ‚ скрипт Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° merge request Ρ‰Π΅ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Ρ‚Π°ΠΊΠ°:

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

ΠžΡΡ‚Π°Π²Π° само Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€Π°Π½Π΅ Π½Π° Π»ΠΎΠ³Π°, слСд ΠΊΠ°Ρ‚ΠΎ всички скриптовС са изпълнСни. ИзползвамС Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚Π° after_script ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°Ρ‚Π° plog-converter:

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

Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° plog-converter β€” Ρ‚ΠΎΠ²Π° Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ с ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄, ΠΊΠΎΠΉΡ‚ΠΎ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½Π΅ Π½Π° ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΈ Π·Π° Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΎΡ‚ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ HTML. По-ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ описаниС Π½Π° ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°Ρ‚Π° Π΅ прСдставСно Π² ΠΏΠΎΠ΄Π³Π»Π°Π²Π°Ρ‚Π° "Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° Plog Converter" ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ Ρ€Π°Π·Π΄Π΅Π» Π½Π° докумСнтацията.

ΠœΠ΅ΠΆΠ΄Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΡ‚ΠΎ, Π°ΠΊΠΎ искатС Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎ с .json ΠΎΡ‚Ρ‡Π΅Ρ‚Π° Π»ΠΎΠΊΠ°Π»Π½ΠΎ ΠΎΡ‚ IDE, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΠΌ нашия плъгин Π·Π° IDE Rider. По-ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π½Π΅Π³ΠΎΠ²ΠΎΡ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π΅ описано Π² ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚.

Π—Π° удобство Π΅Ρ‚ΠΎ .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

Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ всичко Π² Ρ„Π°ΠΉΠ»Π°, натиснСтС Π½Π° Commit changes. Π—Π° Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Π΅ всичко Π΅ Π½Π°Ρ€Π΅Π΄, Π²Π»Π΅Π·Ρ‚Π΅ Π² CI/CD -> Pipelines -> Π’ процСс Π½Π° изпълнСниС. Π©Π΅ сС ΠΎΡ‚Π²ΠΎΡ€ΠΈ ΠΏΡ€ΠΎΠ·ΠΎΡ€Π΅Ρ† Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина, Π² края Π½Π° ΠΊΠΎΠΉΡ‚ΠΎ трябва Π΄Π° ΠΈΠΌΠ° слСдното:

Анализ Π½Π° merge request'ΠΎΠ²Π΅ Π² GitLab с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio Π·Π° C#
ВидяхтС Job succeeded – успСх, всичко Π΅ Π΄ΠΎΠ±Ρ€Π΅. Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° тСстватС Π½Π°ΠΏΡ€Π°Π²Π΅Π½ΠΎΡ‚ΠΎ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π°

Π—Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‰Π΅ създадСм прост ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ (Π² master) ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ ΠΈΠΌΠ° няколко Ρ„Π°ΠΉΠ»Π°. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Π² Π΄Ρ€ΡƒΠ³Π° ΠΊΠ»ΠΎΠ½ Ρ‰Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΠΌ само Π΅Π΄ΠΈΠ½ Ρ„Π°ΠΉΠ» ΠΈ Ρ‰Π΅ сС ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ merge request.

Π©Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π΄Π²Π° случая: ΠΊΠΎΠ³Π°Ρ‚ΠΎ промСнСният Ρ„Π°ΠΉΠ» ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Π³Ρ€Π΅ΡˆΠΊΠ° ΠΈ ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π½Π΅. ΠŸΡŠΡ€Π²ΠΎ, ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с Π³Ρ€Π΅ΡˆΠΊΠ°.

Π”Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Π΅ Π² master ΠΊΠ»ΠΎΠ½Π° ΠΈΠΌΠ° Ρ„Π°ΠΉΠ» Program.cs, ΠΊΠΎΠΉΡ‚ΠΎ Π½Π΅ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Π³Ρ€Π΅ΡˆΠΊΠΈ, Π° Π² Π΄Ρ€ΡƒΠ³ ΠΊΠ»ΠΎΠ½ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡŠΡ‚ Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠ» Π³Ρ€Π΅ΡˆΠ΅Π½ ΠΊΠΎΠ΄ ΠΈ иска Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈ merge request. Каква Ρ‚ΠΎΡ‡Π½ΠΎ Π³Ρ€Π΅ΡˆΠΊΠ° Π΅ допуснал – Π½Π΅ Π΅ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° Π²Π°ΠΆΠ½ΠΎ, Π²Π°ΠΆΠ½ΠΎ Π΅, Ρ‡Π΅ Ρ‚Π°ΠΊΠ°Π²Π° ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°. НапримСр, Π·Π°Π±Ρ€Π°Π²ΠΈΠ» Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° throw (Π΄Π°, Ρ‚Π°ΠΊΠ° Π³Ρ€Π΅ΡˆΠ°Ρ‚):

void MyAwesomeMethod(String name)
{
  if (name == null)
    new ArgumentNullException(....);
  // Π½Π°ΠΏΡ€Π°Π²ΠΈ Π½Π΅Ρ‰ΠΎ
  ....
}

НСка Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚Π° ΠΎΡ‚ Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° с Π³Ρ€Π΅ΡˆΠΊΠ°. Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ°, Π·Π° Π΄Π° сС ΡƒΠ²Π΅Ρ€ΠΈΠΌ, Ρ‡Π΅ само Π΅Π΄ΠΈΠ½ Ρ„Π°ΠΉΠ» Π΅ Π±ΠΈΠ» Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½, Π΄ΠΎΠ±Π°Π²ΠΈΡ… Ρ„Π»Π°Π³Π° -r Π² командния Ρ€Π΅Π΄ Π½Π° pvs-studio-dotnet:

Анализ Π½Π° merge request'ΠΎΠ²Π΅ Π² GitLab с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio Π·Π° C#
Π’ΠΈΠΆΠ΄Π°ΠΌΠ΅, Ρ‡Π΅ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΡŠΡ‚ Π΅ ΠΎΡ‚ΠΊΡ€ΠΈΠ» Π³Ρ€Π΅ΡˆΠΊΠ° ΠΈ Π½Π΅ Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ» сливанСто Π½Π° ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅Ρ‚Π΅.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ²Π°ΠΌΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π±Π΅Π· Π³Ρ€Π΅ΡˆΠΊΠ°. ΠŸΠΎΠΏΡ€Π°Π²ΡΠΌΠ΅ ΠΊΠΎΠ΄Π°:

void MyAwesomeMethod(String name)
{
  if (name == null)
    throw new ArgumentNullException(....);
  // Π½Π°ΠΏΡ€Π°Π²ΠΈ Π½Π΅Ρ‰ΠΎ
  ....
}

Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ ΠΎΡ‚ Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° merge request:

Анализ Π½Π° merge request'ΠΎΠ²Π΅ Π² GitLab с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio Π·Π° C#
ΠšΠ°ΠΊΡ‚ΠΎ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅, Π³Ρ€Π΅ΡˆΠΊΠΈ Π½Π΅ са Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈ ΠΈ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° Π΅ ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π»ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, ΠΊΠΎΠ΅Ρ‚ΠΎ искахмС Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ΠžΡ‚ΡΡ‚Ρ€Π°Π½ΡΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° лош ΠΊΠΎΠ΄ ΠΏΡ€Π΅Π΄ΠΈ сливанСто Π½Π° ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅Ρ‚Π΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈ приятно. Π—Π°Ρ‚ΠΎΠ²Π°, Π°ΠΊΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ CI/CD, ΠΎΠΏΠΈΡ‚Π°ΠΉΡ‚Π΅ Π΄Π° Π²Π³Ρ€Π°Π΄ΠΈΡ‚Π΅ статичСн Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°. ОсобСно, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Ρ‚ΠΎΠ²Π° сС ΠΏΡ€Π°Π²ΠΈ доста лСсно.

Благодаря Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅Ρ‚ΠΎ.

Анализ Π½Π° merge request'ΠΎΠ²Π΅ Π² GitLab с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio Π·Π° C#
Ако искатС Π΄Π° сподСлитС Ρ‚Π°Π·ΠΈ статия с англоговоряща аудитория, моля, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ Π»ΠΈΠ½ΠΊΠ° към ΠΏΡ€Π΅Π²ΠΎΠ΄Π°: Nikolay Mironov. Анализ Π½Π° merge requests Π² GitLab с PVS-Studio Π·Π° C#.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster