Анализ Π½Π° заявки Π·Π° сливанС Π² GitLab с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio Π·Π° C#

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

PVS-Π‘Ρ‚ΡƒΠ΄ΠΈΠΎ Π΅ инструмСнт Π·Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π°Π½Π΅ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΈ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»Π½ΠΈ уязвимости Π² изходния ΠΊΠΎΠ΄ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ, написани Π½Π° 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

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

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° заявката Π·Π° сливанС

ΠžΡΠ½ΠΎΠ²Π½Π°Ρ‚Π° ΡΡŠΡ‰Π½ΠΎΡΡ‚ Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°Ρ‚Π° Π΅ Π΄Π° сС Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π°, Ρ‡Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈΡ‚Π΅, ΠΎΡ‚ΠΊΡ€ΠΈΡ‚ΠΈ ΠΎΡ‚ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°Ρ‚ Π² сливанСто майстор ΠΊΠ»ΠΎΠ½. ОсвСн Ρ‚ΠΎΠ²Π° Π½Π΅ искамС Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ цСлия ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ всСки ΠΏΡŠΡ‚. ОсвСн Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ³Π°Ρ‚ΠΎ обСдинявамС ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅, ΠΈΠΌΠ°ΠΌΠ΅ списък с ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅. Π—Π°Ρ‚ΠΎΠ²Π° ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΠΌ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° исканС Π·Π° сливанС.

Π•Ρ‚ΠΎ ΠΊΠ°ΠΊ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° исканСто Π·Π° сливанС ΠΏΡ€Π΅Π΄ΠΈ Π²ΡŠΠ²Π΅ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Π½Π° статичния Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€:

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

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

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

GitLab

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

ΠŸΡ€Π΅Π΄ΠΈ Π΄Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΡ‚Π΅ с ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° заявкитС Π·Π° сливанС, трябва Π΄Π° сС рСгистриратС ΠΈ Π΄Π° ΠΊΠ°Ρ‡ΠΈΡ‚Π΅ вашия ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Ако Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅ ΠΊΠ°ΠΊ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Ρ‚ΠΎΠ²Π°, Ρ‚ΠΎΠ³Π°Π²Π° Π²ΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΠΌ Бтатия моя ΠΊΠΎΠ»Π΅Π³Π°.

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

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

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

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

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

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

Ако възникнС заявка Π·Π° сливанС, трябва Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ само списъка с ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π΅Π½ случай Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ всички Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅. Π‘Π»Π΅Π΄ Π°Π½Π°Π»ΠΈΠ· трябва Π΄Π° ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€Π°ΠΌΠ΅ рСгистрационнитС Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ във Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°, ΠΎΡ‚ ΠΊΠΎΠΉΡ‚ΠΎ сС Π½ΡƒΠΆΠ΄Π°Π΅ΠΌ.

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

Анализ Π½Π° заявки Π·Π° сливанС Π² 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

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

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

  - 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 ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ трябва Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΈΠ·Ρ‚Π΅Π³Π»Π΅Π½ΠΈ).

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

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

Анализ Π½Π° заявки Π·Π° сливанС Π² GitLab с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio Π·Π° C#
Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌ към Π°Π½Π°Π»ΠΈΠ·Π°. ΠŸΡŠΡ€Π²ΠΎ, Π½Π΅ΠΊΠ° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ скрипт Π·Π° пълСн Π°Π½Π°Π»ΠΈΠ·. Към Π·Π½Π°ΠΌΠ΅Ρ‚ΠΎ -t ΠΏΠΎΠ΄Π°ΠΉΡ‚Π΅ ΠΏΡŠΡ‚Ρ към Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Ρ„Π»Π°Π³Π° -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:
  script:
  only:
  - merge_requests

Π”Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌ към самия сцСнарий. Π‘Ρ€Π΅Ρ‰Π½Π°Ρ… Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π°Ρ‚Π° машина Π½Π΅ Π·Π½Π°Π΅ Π½ΠΈΡ‰ΠΎ ΠΏΡ€ΠΎΠΈΠ·Ρ…ΠΎΠ΄/майстор. Π’Π°ΠΊΠ° Ρ‡Π΅ Π½Π΅ΠΊΠ° ΠΉ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ΠΌ ΠΌΠ°Π»ΠΊΠΎ:

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

ΠžΡΡ‚Π°Π²Π° само Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΆΡƒΡ€Π½Π°Π»Π°, слСд ΠΊΠ°Ρ‚ΠΎ всички скриптовС работят. ИзползванС Π½Π° Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚Π° слСд_скрипт ΠΈ полСзност plog-ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΎΡ€:

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

ΠŸΠΎΠ»Π΅Π·Π½ΠΎΡΡ‚ plog-ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΎΡ€ Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ с ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄, ΠΊΠΎΠΉΡ‚ΠΎ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½Π΅ Π½Π° Π΄ΠΎΠΊΠ»Π°Π΄ΠΈΡ‚Π΅ Π·Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ„ΠΎΡ€ΠΌΠΈ ΠΊΠ°Ρ‚ΠΎ HTML. Π—Π° ΠΏΠΎ-ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ описаниС Π½Π° ΠΏΠΎΠΌΠΎΡ‰Π½Π°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π²ΠΈΠΆΡ‚Π΅ ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»Π° β€žΠŸΠΎΠΌΠΎΡ‰Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π·Π° ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΎΡ€ Π½Π° Plogβ€œ. ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ Ρ€Π°Π·Π΄Π΅Π» ΠΎΡ‚ докумСнтацията.

ΠœΠ΅ΠΆΠ΄Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΡ‚ΠΎ, Π°ΠΊΠΎ искатС Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎ с .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

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

Анализ Π½Π° заявки Π·Π° сливанС Π² GitLab с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio Π·Π° C#
Ρ‚Ρ€ΠΈΠΎΠ½ Π Π°Π±ΠΎΡ‚Π°Ρ‚Π° успя - успСх, всичко Π΅ Π½Π°Ρ€Π΅Π΄. Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° тСстватС ΠΊΠ°ΠΊΠ²ΠΎ стС Π½Π°ΠΏΡ€Π°Π²ΠΈΠ»ΠΈ.

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

Π—Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π°, Π½Π΅ΠΊΠ° създадСм прост ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ (Π² майстор), ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° няколко Ρ„Π°ΠΉΠ»Π°. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Π² Π΄Ρ€ΡƒΠ³ ΠΊΠ»ΠΎΠ½ Ρ‰Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΠΌ само Π΅Π΄ΠΈΠ½ Ρ„Π°ΠΉΠ» ΠΈ Ρ‰Π΅ сС ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ заявка Π·Π° сливанС.

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

Π”Π° ΠΊΠ°ΠΆΠ΅ΠΌ, Ρ‡Π΅ ΠΈΠΌΠ° Ρ„Π°ΠΉΠ» Π² главния ΠΊΠ»ΠΎΠ½ Program.cs, ΠΊΠΎΠΉΡ‚ΠΎ Π½Π΅ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Π³Ρ€Π΅ΡˆΠΊΠΈ, Π° Π² Π΄Ρ€ΡƒΠ³ ΠΊΠ»ΠΎΠ½ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡŠΡ‚ Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠ» Π³Ρ€Π΅ΡˆΠ΅Π½ ΠΊΠΎΠ΄ ΠΈ иска Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈ заявка Π·Π° сливанС. Каква Π³Ρ€Π΅ΡˆΠΊΠ° Π΅ Π½Π°ΠΏΡ€Π°Π²ΠΈΠ» Π½Π΅ Π΅ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° Π²Π°ΠΆΠ½ΠΎ, Π²Π°ΠΆΠ½ΠΎΡ‚ΠΎ Π΅, Ρ‡Π΅ тя ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°. НапримСр, Π·Π°Π±Ρ€Π°Π²ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Ρ…Π²ΡŠΡ€Π»ΡΠΌ (Π”Π°, Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° Π³Ρ€Π΅ΡˆΠ½ΠΎ):

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

НСка Π΄Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚Π° ΠΎΡ‚ Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с Π³Ρ€Π΅ΡˆΠΊΠ°. ОсвСн Ρ‚ΠΎΠ²Π°, Π·Π° Π΄Π° сС увСря, Ρ‡Π΅ само Π΅Π΄ΠΈΠ½ Ρ„Π°ΠΉΠ» Π΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½, Π΄ΠΎΠ±Π°Π²ΠΈΡ… Ρ„Π»Π°Π³Π° -r към началния Ρ€Π΅Π΄ Π½Π° pvs-studio-dotnet:

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

НСка ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π±Π΅Π· Π³Ρ€Π΅ΡˆΠΊΠ°. ΠšΠΎΡ€ΠΈΠ³ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΊΠΎΠ΄Π°:

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

Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ ΠΎΡ‚ Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° исканСто Π·Π° сливанС:

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

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

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

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

Анализ Π½Π° заявки Π·Π° сливанС Π² GitLab с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio Π·Π° C#
Ако искатС Π΄Π° сподСлитС Ρ‚Π°Π·ΠΈ статия с Π°Π½Π³Π»ΠΎΠ΅Π·ΠΈΡ‡Π½Π° аудитория, моля, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° Π·Π° ΠΏΡ€Π΅Π²ΠΎΠ΄: Николай ΠœΠΈΡ€ΠΎΠ½ΠΎΠ². Анализ Π½Π° заявки Π·Π° сливанС Π² GitLab с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio Π·Π° C#.

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€