Анализ 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 ΠΈΠ»ΠΈ, Ссли Π΅Π³ΠΎ Π½Π΅Ρ‚, ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ. Для Π΅Π³ΠΎ создания Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΆΠ°Ρ‚ΡŒ Π½Π° Π½Π°Π·Π²Π°Π½ΠΈΠ΅ вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° -> Set up 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#
Π’ ΠΎΡ‚ΠΊΡ€Ρ‹Π²ΡˆΠΈΠΌΡΡ ΠΎΠΊΠ½Π΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ ΠΏΡƒΠ½ΠΊΡ‚ Variables, справа Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ 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 β€” это open source ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для прСобразования ΠΎΡ‚Ρ‡Π΅Ρ‚Π° ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 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 -> Running. ΠžΡ‚ΠΊΡ€ΠΎΠ΅Ρ‚ΡΡ ΠΎΠΊΠ½ΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

Анализ 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(....);
  // do something
  ....
}

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° с ошибкой. Π’Π°ΠΊΠΆΠ΅ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ» Π±Ρ‹Π» ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½, я Π΄ΠΎΠ±Π°Π²ΠΈΠ» Ρ„Π»Π°Π³ -r Π² строку запуска pvs-studio-dotnet:

Анализ merge request'ΠΎΠ² Π² GitLab с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ PVS-Studio для C#
ΠœΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ нашСл ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΈ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ» ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ слияниС Π²Π΅Ρ‚ΠΎΠΊ.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π±Π΅Π· ошибки. Π˜ΡΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌ ΠΊΠΎΠ΄:

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

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

Анализ merge request'ΠΎΠ² Π² GitLab с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ PVS-Studio для C#
Как ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, ошибки Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Ρ‹, ΠΈ исполнСниС Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΡ€ΠΎΡˆΠ»ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΈ Ρ…ΠΎΡ‚Π΅Π»ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ.

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

ΠžΡ‚ΡΠ΅ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠ»ΠΎΡ…ΠΎΠΉ ΠΊΠΎΠ΄ Π΄ΠΎ слияния Π²Π΅Ρ‚ΠΎΠΊ β€” это ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈ приятно. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Ссли Π²Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ΡΡŒ CI/CD, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π²ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ статичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ. Π’Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ Ρ‡Ρ‚ΠΎ дСлаСтся это достаточно просто.

Бпасибо за вниманиС.

Анализ merge request'ΠΎΠ² Π² GitLab с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ PVS-Studio для C#
Если Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ΠΉ с англоязычной Π°ΡƒΠ΄ΠΈΡ‚ΠΎΡ€ΠΈΠ΅ΠΉ, Ρ‚ΠΎ ΠΏΡ€ΠΎΡˆΡƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ссылку Π½Π° ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄: Nikolay Mironov. Analysis of merge requests in GitLab using PVS-Studio for C#.

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

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ