
ΠΠ±ΠΈΡΠ°ΡΠ΅ GitLab ΠΈ Π½Π΅ ΠΎΠ±ΠΈΡΠ°ΡΠ΅ Π³ΡΠ΅ΡΠΊΠΈ? ΠΡΠΊΠ°ΡΠ΅ Π΄Π° ΠΏΠΎΠ²ΠΈΡΠΈΡΠ΅ ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎΡΠΎ Π½Π° ΠΈΠ·Ρ
ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄? Π’ΠΎΠ³Π°Π²Π° ΡΡΠ΅ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎΡΠΎ ΠΌΡΡΡΠΎ. ΠΠ½Π΅Ρ ΡΠ΅ ΡΠ°Π·ΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠ°ΠΊ Π΄Π° Π½Π°ΡΡΡΠΎΠΈΡΠ΅ C# Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° PVS-Studio Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° merge request'ΠΎΠ²Π΅. ΠΠ° Π²ΡΠΈΡΠΊΠΈ ΠΆΠ΅Π»Π°Ρ Π΄ΠΎΠ±ΡΠΎ Π½Π°ΡΡΡΠΎΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΡΠΈΡΡΠ½ΠΎ ΡΠ΅ΡΠ΅Π½Π΅.
Π΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° ΠΎΡΠΊΡΠΈΠ²Π°Π½Π΅ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ ΠΈ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»Π½ΠΈ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ Π² ΠΈΠ·Ρ
ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, Π½Π°ΠΏΠΈΡΠ°Π½ΠΈ Π½Π° 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 ΠΏΡΠ΅Π΄ΠΈ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° ΡΡΠ°ΡΠΈΡΠ½ΠΈΡ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ:

Π’ΠΎΠ΅ΡΡ Π²ΡΠΈΡΠΊΠΈ Π³ΡΠ΅ΡΠΊΠΈ, ΠΊΠΎΠΈΡΠΎ Π±ΠΈΠ»ΠΈ Π² ΠΊΠ»ΠΎΠ½Π° changes, ΡΠ΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Ρ Π² Π³Π»Π°Π²Π½ΠΈΡ ΠΊΠ»ΠΎΠ½. ΠΠΎΠ½Π΅ΠΆΠ΅ Π½Π΅ ΠΆΠ΅Π»Π°Π΅ΠΌ ΡΠΎΠ²Π°, Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ Π°Π½Π°Π»ΠΈΠ·, ΠΈ ΡΠ΅Π³Π° ΡΡ
Π΅ΠΌΠ°ΡΠ° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡ Π½Π°ΡΠΈΠ½:

ΠΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° changes2 ΠΈ, Π°ΠΊΠΎ Π½ΡΠΌΠ° Π³ΡΠ΅ΡΠΊΠΈ, ΠΏΡΠΈΠ΅ΠΌΠ°ΠΌΠ΅ merge request, Π° Π² ΠΏΡΠΎΡΠΈΠ²Π΅Π½ ΡΠ»ΡΡΠ°ΠΉ Π³ΠΎ ΠΎΡΡ
Π²ΡΡΠ»ΡΠΌΠ΅.
ΠΠ΅ΠΆΠ΄Ρ Π΄ΡΡΠ³ΠΎΡΠΎ, Π°ΠΊΠΎ Π²ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π° Π°Π½Π°Π»ΠΈΠ· Π½Π° ΠΊΠΎΠΌΠΈΡΠΈ ΠΈ pull request'ΠΎΠ²Π΅ Π·Π° C/C++, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΎΡΠ΅ΡΠ΅ΡΠ΅ Π·Π° Π½Π΅Π³ΠΎ .
GitLab
β ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΆΠΈΠ·Π½Π΅Π½ΠΈΡ Π½Π° DevOps Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ΄ΠΎΠ²ΠΈ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° Π·Π° Git Ρ Π²Π³ΡΠ°Π΄Π΅Π½Π° ΡΠΈΠΊΠΈ, ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ, CI/CD ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ ΠΈ Π΄ΡΡΠ³ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ.
ΠΡΠ΅Π΄ΠΈ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ Ρ Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° merge request-ΠΈΡΠ΅, Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°ΡΠ΅ ΠΈ Π΄Π° ΠΊΠ°ΡΠΈΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΡΠΈ. ΠΠΊΠΎ Π½Π΅ Π·Π½Π°Π΅ΡΠ΅ ΠΊΠ°ΠΊ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅, ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΠΌ ΠΊΠΎΠ»Π΅Π³Π°ΡΠ° ΠΌΠΈ.
ΠΠ°Π±Π΅Π»Π΅ΠΆΠΊΠ°. ΠΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½ΠΈΡΡ ΠΏΠΎ-Π΄ΠΎΠ»Ρ Π½Π°ΡΠΈΠ½ Π·Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΡΡΠ΅Π΄Π° Π΅ Π΅Π΄ΠΈΠ½ ΠΎΡ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΈΡΠ΅. Π¦Π΅Π»ΡΠ° Π΅ Π΄Π° ΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ°Ρ ΡΡΡΠΏΠΊΠΈΡΠ΅ Π·Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ°ΡΠ° ΡΡΠ΅Π΄Π° Π·Π° Π°Π½Π°Π»ΠΈΠ· ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°. ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅ Π² ΡΠ»ΡΡΠ°Ρ Π²ΠΈ ΠΏΠΎ-ΠΎΠΏΡΠΈΠΌΠ°Π»Π½ΠΎ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ°Π·Π΄Π΅Π»ΡΠ½Π΅ΡΠΎ Π½Π° Π΅ΡΠ°ΠΏΠΈΡΠ΅ Π½Π° ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π½Π° ΡΡΠ΅Π΄Π°ΡΠ° (Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ, ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°) ΠΈ Π°Π½Π°Π»ΠΈΠ·: Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π½Π° Docker ΠΎΠ±ΡΠ°Π·ΠΈ Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ°ΡΠ° ΡΡΠ΅Π΄Π° ΠΈ ΡΡΡ Π½ΠΎΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ ΠΈΠ»ΠΈ Π½ΡΠΊΠ°ΠΊΡΠ² Π΄ΡΡΠ³ ΠΌΠ΅ΡΠΎΠ΄.
ΠΠ° ΠΏΠΎ-ΡΡΠ½ΠΎ ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ ΡΠ΅ ΡΠ»ΡΡΠ²Π° ΡΠ΅Π³Π°, ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΠΌ Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΡΠ΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΡΡ Π΅ΠΌΠ°:

ΠΠ½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡΡ ΠΈΠ·ΠΈΡΠΊΠ²Π° .NET Core SDK 3, Π·Π°ΡΠΎΠ²Π° ΠΏΡΠ΅Π΄ΠΈ ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡΡΠ° Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈΡΠ΅ Π½Π° Microsoft, ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π·Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°. ΠΠΎΠ±Π°Π²ΡΠ½Π΅ΡΠΎ Π½Π° ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ Π½Π° Microsoft Π·Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠΈ Π½Π° Linux .
ΠΠ° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° PVS-Studio ΡΡΠ΅Π· ΠΏΠ°ΠΊΠ΅ΡΠ΅Π½ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ ΡΡΡΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈΡΠ΅ Π½Π° PVS-Studio. ΠΠΎΠ±Π°Π²ΡΠ½Π΅ΡΠΎ Π½Π° ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ Π·Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠΈ Π΅ ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π² .
ΠΠ° ΡΠ°Π±ΠΎΡΠ° Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ Π»ΠΈΡΠ΅Π½Π·Π΅Π½ ΠΊΠ»ΡΡ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΠΏΡΠΎΠ±Π΅Π½ Π»ΠΈΡΠ΅Π½Π· Π½Π° .
ΠΠ°Π±Π΅Π»Π΅ΠΆΠΊΠ°. ΠΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΠ΅ Π·Π° ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΡΠ°Π±ΠΎΡΠ° (Π°Π½Π°Π»ΠΈΠ· Π½Π° merge requests) Π΅ Π½ΡΠΆΠ½Π° Enterprise Π»ΠΈΡΠ΅Π½Π·ΠΈΡ. ΠΠ°ΡΠΎΠ²Π°, Π°ΠΊΠΎ ΠΆΠ΅Π»Π°Π΅ΡΠ΅ Π΄Π° ΠΏΡΠΎΠ±Π²Π°ΡΠ΅ ΡΠΎΠ·ΠΈ ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΡΠ°Π±ΠΎΡΠ°, Π² ΠΏΠΎΠ»Π΅ΡΠΎ "Π‘ΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅" Π½Π΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅ Π΄Π° ΠΏΠΎΡΠΎΡΠΈΡΠ΅, ΡΠ΅ Π²ΠΈ Π΅ Π½ΡΠΆΠ½Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Enterprise Π»ΠΈΡΠ΅Π½Π·ΠΈΡ.
ΠΠΊΠΎ ΡΠ΅ ΡΠ»ΡΡΠΈ merge request, ΡΠ΅ Π½ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ Π°Π½Π°Π»ΠΈΠ· ΡΠ°ΠΌΠΎ Π½Π° ΡΠΏΠΈΡΡΠΊΠ° Ρ ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, Π° Π² ΠΏΡΠΎΡΠΈΠ²Π΅Π½ ΡΠ»ΡΡΠ°ΠΉ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. Π‘Π»Π΅Π΄ Π°Π½Π°Π»ΠΈΠ·Π° Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°ΠΌΠ΅ Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅ Π² Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡ ΡΠΎΡΠΌΠ°Ρ.
Π‘Π΅Π³Π°, ΠΈΠΌΠ°ΠΉΠΊΠΈ Π°Π»Π³ΠΎΡΠΈΡΡΠΌΠ° Π½Π° ΡΠ°Π±ΠΎΡΠ° ΠΏΡΠ΅Π΄ ΠΎΡΠΈΡΠ΅ ΡΠΈ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠΈΡΡΡΠΏΠΈΠΌ ΠΊΡΠΌ Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΊΡΠΈΠΏΡΠ°. ΠΠ° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ, Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΠΌ ΡΠ°ΠΉΠ»Π° .gitlab-ci.yml ΠΈΠ»ΠΈ, Π°ΠΊΠΎ Π³ΠΎ Π½ΡΠΌΠ°, Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ. ΠΠ° Π½Π΅Π³ΠΎΠ²ΠΎΡΠΎ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π°ΡΠΈΡΠ½Π΅ΡΠ΅ Π½Π° ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° ΡΠΈ -> ΠΠ°ΡΡΡΠΎΠΉΡΠ΅ CI/CD.

Π‘Π΅Π³Π° ΡΠΌΠ΅ Π³ΠΎΡΠΎΠ²ΠΈ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΡΠΊΡΠΈΠΏΡΠ°. ΠΠ΅ΠΊΠ° ΠΏΡΡΠ²ΠΎ Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΠΊΠΎΠ΄, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° ΠΈ ΡΠ΅ Π²ΡΠ²Π΅Π΄Π΅ Π»ΠΈΡΠ΅Π½Π·Π°:
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.

Π ΠΎΡΠ²ΠΎΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ·ΠΎΡΠ΅Ρ Π½Π°ΠΌΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠ½ΠΊΡΠ° ΠΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, ΠΎΡΠ΄ΡΡΠ½ΠΎ Π½Π°ΡΠΈΡΠΊΠ°ΠΌΠ΅ Π±ΡΡΠΎΠ½Π° Expand ΠΈ Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ. Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ:

Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΊΡΠΌ Π°Π½Π°Π»ΠΈΠ·Π°. ΠΡΡΠ²ΠΎ, ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠΊΡΠΈΠΏΡ Π·Π° ΠΏΡΠ»Π΅Π½ Π°Π½Π°Π»ΠΈΠ·. Π ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° -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)" Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°.".
Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ Π½ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π°Ρ Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΠ΄ΠΎΠ²Π΅ Π·Π° Π²ΡΡΡΠ°Π½Π΅, Π² ΠΊΠΎΠΈΡΠΎ ΡΠΈΠ³ΡΡΠΈΡΠ° 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Π£ΡΠΈΠ»ΠΈΡΠ° β ΡΠΎΠ²Π° Π΅ ΠΏΡΠΎΠ΅ΠΊΡ Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½Π΅ Π½Π° ΠΎΡΡΠ΅ΡΠΈ Π·Π° Π³ΡΠ΅ΡΠΊΠΈ ΠΎΡ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° Π² ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΎΡΠΌΠ°ΡΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ 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 -> Π ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅. Π©Π΅ ΡΠ΅ ΠΎΡΠ²ΠΎΡΠΈ ΠΏΡΠΎΠ·ΠΎΡΠ΅Ρ Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π°, Π² ΠΊΡΠ°Ρ Π½Π° ΠΊΠΎΠΉΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠΌΠ° ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ:

ΠΠΈΠ΄ΡΡ
ΡΠ΅ Job succeeded β ΡΡΠΏΠ΅Ρ
, Π²ΡΠΈΡΠΊΠΎ Π΅ Π΄ΠΎΠ±ΡΠ΅. Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ΡΡΠ²Π°ΡΠ΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΎΡΠΎ.
ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ°
ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΏΡΠΎΡΡ ΠΏΡΠΎΠ΅ΠΊΡ (Π² master) ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΈΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ°ΠΉΠ»Π°. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° Π² Π΄ΡΡΠ³Π° ΠΊΠ»ΠΎΠ½ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΠΌ ΡΠ°ΠΌΠΎ Π΅Π΄ΠΈΠ½ ΡΠ°ΠΉΠ» ΠΈ ΡΠ΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ merge request.
Π©Π΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π΄Π²Π° ΡΠ»ΡΡΠ°Ρ: ΠΊΠΎΠ³Π°ΡΠΎ ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΈΡΡ ΡΠ°ΠΉΠ» ΡΡΠ΄ΡΡΠΆΠ° Π³ΡΠ΅ΡΠΊΠ° ΠΈ ΠΊΠΎΠ³Π°ΡΠΎ Π½Π΅. ΠΡΡΠ²ΠΎ, ΠΏΡΠΈΠΌΠ΅Ρ Ρ Π³ΡΠ΅ΡΠΊΠ°.
ΠΠ° ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΠ΅ Π² master ΠΊΠ»ΠΎΠ½Π° ΠΈΠΌΠ° ΡΠ°ΠΉΠ» Program.cs, ΠΊΠΎΠΉΡΠΎ Π½Π΅ ΡΡΠ΄ΡΡΠΆΠ° Π³ΡΠ΅ΡΠΊΠΈ, Π° Π² Π΄ΡΡΠ³ ΠΊΠ»ΠΎΠ½ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡΡ Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠ» Π³ΡΠ΅ΡΠ΅Π½ ΠΊΠΎΠ΄ ΠΈ ΠΈΡΠΊΠ° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ merge request. ΠΠ°ΠΊΠ²Π° ΡΠΎΡΠ½ΠΎ Π³ΡΠ΅ΡΠΊΠ° Π΅ Π΄ΠΎΠΏΡΡΠ½Π°Π» β Π½Π΅ Π΅ ΡΠΎΠ»ΠΊΠΎΠ²Π° Π²Π°ΠΆΠ½ΠΎ, Π²Π°ΠΆΠ½ΠΎ Π΅, ΡΠ΅ ΡΠ°ΠΊΠ°Π²Π° ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π°Π±ΡΠ°Π²ΠΈΠ» Π΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° throw (Π΄Π°, ):
void MyAwesomeMethod(String name)
{
if (name == null)
new ArgumentNullException(....);
// Π½Π°ΠΏΡΠ°Π²ΠΈ Π½Π΅ΡΠΎ
....
}ΠΠ΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ° ΠΎΡ Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ° Ρ Π³ΡΠ΅ΡΠΊΠ°. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ°, Π·Π° Π΄Π° ΡΠ΅ ΡΠ²Π΅ΡΠΈΠΌ, ΡΠ΅ ΡΠ°ΠΌΠΎ Π΅Π΄ΠΈΠ½ ΡΠ°ΠΉΠ» Π΅ Π±ΠΈΠ» Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½, Π΄ΠΎΠ±Π°Π²ΠΈΡ ΡΠ»Π°Π³Π° -r Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΈΡ ΡΠ΅Π΄ Π½Π° pvs-studio-dotnet:

ΠΠΈΠΆΠ΄Π°ΠΌΠ΅, ΡΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡΡ Π΅ ΠΎΡΠΊΡΠΈΠ» Π³ΡΠ΅ΡΠΊΠ° ΠΈ Π½Π΅ Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ» ΡΠ»ΠΈΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ΡΠ΅.
ΠΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΌΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π±Π΅Π· Π³ΡΠ΅ΡΠΊΠ°. ΠΠΎΠΏΡΠ°Π²ΡΠΌΠ΅ ΠΊΠΎΠ΄Π°:
void MyAwesomeMethod(String name)
{
if (name == null)
throw new ArgumentNullException(....);
// Π½Π°ΠΏΡΠ°Π²ΠΈ Π½Π΅ΡΠΎ
....
}Π Π΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΡ Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° merge request:

ΠΠ°ΠΊΡΠΎ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅, Π³ΡΠ΅ΡΠΊΠΈ Π½Π΅ ΡΠ° Π½Π°ΠΌΠ΅ΡΠ΅Π½ΠΈ ΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π·Π°Π΄Π°ΡΠ°ΡΠ° Π΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π»ΠΎ ΡΡΠΏΠ΅ΡΠ½ΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΠΈΡΠΊΠ°Ρ
ΠΌΠ΅ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΡΡΡΡΠ°Π½ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π»ΠΎΡ ΠΊΠΎΠ΄ ΠΏΡΠ΅Π΄ΠΈ ΡΠ»ΠΈΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ΡΠ΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΈ ΠΏΡΠΈΡΡΠ½ΠΎ. ΠΠ°ΡΠΎΠ²Π°, Π°ΠΊΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ CI/CD, ΠΎΠΏΠΈΡΠ°ΠΉΡΠ΅ Π΄Π° Π²Π³ΡΠ°Π΄ΠΈΡΠ΅ ΡΡΠ°ΡΠΈΡΠ΅Π½ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°. ΠΡΠΎΠ±Π΅Π½ΠΎ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠΎΠ²Π° ΡΠ΅ ΠΏΡΠ°Π²ΠΈ Π΄ΠΎΡΡΠ° Π»Π΅ΡΠ½ΠΎ.
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ΡΠΎ.
ΠΠΊΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»ΠΈΡΠ΅ ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ Ρ Π°Π½Π³Π»ΠΎΠ³ΠΎΠ²ΠΎΡΡΡΠ° Π°ΡΠ΄ΠΈΡΠΎΡΠΈΡ, ΠΌΠΎΠ»Ρ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ Π»ΠΈΠ½ΠΊΠ° ΠΊΡΠΌ ΠΏΡΠ΅Π²ΠΎΠ΄Π°: Nikolay Mironov. .
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
