ΠΡΠ±ΠΈΡΠ΅ GitLab ΠΈ Π½Π΅ Π»ΡΠ±ΠΈΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ? Π₯ΠΎΡΠΈΡΠ΅ ΠΏΠΎΠ²ΡΡΠΈΡΡ ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°? Π’ΠΎΠ³Π΄Π° Π²Ρ ΠΏΠΎΠΏΠ°Π»ΠΈ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ. Π‘Π΅Π³ΠΎΠ΄Π½Ρ ΠΌΡ ΡΠ°ΡΡΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊ Π½Π°ΡΡΡΠΎΠΈΡΡ C# Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ PVS-Studio Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ merge request'ΠΎΠ². ΠΡΠ΅ΠΌ Π΅Π΄ΠΈΠ½ΠΎΡΠΎΠΆΠ½ΠΎΠ³ΠΎ Π½Π°ΡΡΡΠΎΠ΅Π½ΠΈΡ ΠΈ ΠΏΡΠΈΡΡΠ½ΠΎΠ³ΠΎ ΡΡΠ΅Π½ΠΈΡ.
ΠΡΡΠ°ΡΠΈ, Ρ Π½Π°Ρ ΡΠΎΡΡΠΎΡΠ»ΡΡ ΡΠ΅Π»ΠΈΠ· 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
ΠΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ ΠΊΠ°ΠΊ ΠΏΡΠΈΡΡΡΠΏΠΈΡΡ ΠΊ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π°Π½Π°Π»ΠΈΠ·Π° merge request'ΠΎΠ² Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡΡΡ ΠΈ Π·Π°Π³ΡΡΠ·ΠΈΡΡ ΡΠ²ΠΎΠΉ ΠΏΡΠΎΠ΅ΠΊΡ. ΠΡΠ»ΠΈ Π²Ρ Π½Π΅ Π·Π½Π°Π΅ΡΠ΅, ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ, ΡΠΎ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Ρ
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅. ΠΠΏΠΈΡΡΠ²Π°Π΅ΠΌΡΠΉ Π΄Π°Π»Π΅Π΅ ΡΠΏΠΎΡΠΎΠ± Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ β ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ . Π¦Π΅Π»Ρ β ΠΏΠΎΠΊΠ°Π·Π°ΡΡ ΡΠ°Π³ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ Π΄Π»Ρ Π°Π½Π°Π»ΠΈΠ·Π° ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΡΡΠΊΠ° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π² Π²Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΌ Π±ΡΠ΄Π΅Ρ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΡΠ°ΠΏΠΎΠ² ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠΈ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ (Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠ΅Π², ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°) ΠΈ Π°Π½Π°Π»ΠΈΠ·Π°: Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Docker ΠΎΠ±ΡΠ°Π·ΠΎΠ² Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΌ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΈΠ½ΠΎΠΉ ΡΠΏΠΎΡΠΎΠ±.
Π§ΡΠΎΠ±Ρ Π½Π°Π³Π»ΡΠ΄Π½Π΅Π΅ ΠΏΠΎΠ½ΡΡΡ, ΡΡΠΎ ΡΠ΅ΠΉΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡΡ, Ρ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Ρ Π²Π·Π³Π»ΡΠ½ΡΡΡ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΡΡ ΡΡ Π΅ΠΌΡ:
ΠΠ»Ρ ΡΠ°Π±ΠΎΡΡ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ .NET Core SDK 3, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠ΅ΡΠ΅Π΄ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΎΠΉ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° Π½ΡΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ Microsoft, ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ
Π±ΡΠ΄ΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Ρ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π»Ρ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ. ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠ΅Π² Microsoft Π΄Π»Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ²ΠΎΠ² Linux
ΠΠ»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ PVS-Studio ΡΠ΅ΡΠ΅Π· ΠΏΠ°ΠΊΠ΅ΡΠ½ΡΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ PVS-Studio. ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠ΅Π² Π΄Π»Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ²ΠΎΠ² Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π²
ΠΠ»Ρ ΡΠ°Π±ΠΎΡΡ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌ Π»ΠΈΡΠ΅Π½Π·ΠΈΠΎΠ½Π½ΡΠΉ ΠΊΠ»ΡΡ. ΠΠΎΠ»ΡΡΠΈΡΡ ΠΏΡΠΎΠ±Π½ΡΡ Π»ΠΈΡΠ΅Π½Π·ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π΄Π»Ρ ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈΠΌΠ° ΡΠ°Π±ΠΎΡΡ (Π°Π½Π°Π»ΠΈΠ· merge requests) Π½ΡΠΆΠ½Π° Enterprise Π»ΠΈΡΠ΅Π½Π·ΠΈΡ. ΠΠΎΡΡΠΎΠΌΡ, Π΅ΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ ΡΠ°Π±ΠΎΡΡ, Π² ΠΏΠΎΠ»Π΅ "Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅" Π½Π΅ Π·Π°Π±ΡΠ΄ΡΡΠ΅ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ Π²Π°ΠΌ Π½ΡΠΆΠ½Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Enterprise Π»ΠΈΡΠ΅Π½Π·ΠΈΡ.
ΠΡΠ»ΠΈ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ merge request, ΡΠΎ Π½Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΡΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ², Π° ΠΈΠ½Π°ΡΠ΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π²ΡΠ΅ ΡΠ°ΠΉΠ»Ρ. ΠΠΎΡΠ»Π΅ Π°Π½Π°Π»ΠΈΠ·Π° Π½ΡΠΆΠ½ΠΎ ΡΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ Π»ΠΎΠ³ΠΈ Π² Π½ΡΠΆΠ½ΡΠΉ Π½Π°ΠΌ ΡΠΎΡΠΌΠ°Ρ.
Π’Π΅ΠΏΠ΅ΡΡ, ΠΈΠΌΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΄ Π³Π»Π°Π·Π°ΠΌΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΡΠ°Π±ΠΎΡΡ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡΡ ΠΊ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠΊΡΠΈΠΏΡΠ°. Π§ΡΠΎΠ±Ρ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠ°ΠΉΠ» .gitlab-ci.yml ΠΈΠ»ΠΈ, Π΅ΡΠ»ΠΈ Π΅Π³ΠΎ Π½Π΅Ρ, ΡΠΎΠ·Π΄Π°ΡΡ. ΠΠ»Ρ Π΅Π³ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½ΡΠΆΠ½ΠΎ Π½Π°ΠΆΠ°ΡΡ Π½Π° Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° -> Set up 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.
Π ΠΎΡΠΊΡΡΠ²ΡΠΈΠΌΡΡ ΠΎΠΊΠ½Π΅ Π½Π°Ρ
ΠΎΠ΄ΠΈΠΌ ΠΏΡΠ½ΠΊΡ Variables, ΡΠΏΡΠ°Π²Π° Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡ 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
Π£ΡΠΈΠ»ΠΈΡΠ°
ΠΡΡΠ°ΡΠΈ, Π΅ΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΡΠ΄ΠΎΠ±Π½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ .json ΠΎΡΡΡΡΠΎΠΌ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ ΠΈΠ· IDE, ΡΠΎ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Ρ Π½Π°Ρ
ΠΠ»Ρ ΡΠ΄ΠΎΠ±ΡΡΠ²Π° Π²ΠΎΡ .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. ΠΡΠΊΡΠΎΠ΅ΡΡΡ ΠΎΠΊΠ½ΠΎ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Ρ, Π² ΠΊΠΎΠ½ΡΠ΅ ΠΊΠΎΡΠΎΡΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅:
Π£Π²ΠΈΠ΄Π΅Π»ΠΈ 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:
ΠΡ Π²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ Π½Π°ΡΠ΅Π» ΠΎΡΠΈΠ±ΠΊΡ ΠΈ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ» ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ»ΠΈΡΠ½ΠΈΠ΅ Π²Π΅ΡΠΎΠΊ.
ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅Ρ Π±Π΅Π· ΠΎΡΠΈΠ±ΠΊΠΈ. ΠΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ ΠΊΠΎΠ΄:
void MyAwesomeMethod(String name)
{
if (name == null)
throw new ArgumentNullException(....);
// do something
....
}
Π Π΅Π·ΡΠ»ΡΡΠ°ΡΡ Π°Π½Π°Π»ΠΈΠ·Π° merge request:
ΠΠ°ΠΊ ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ, ΠΎΡΠΈΠ±ΠΊΠΈ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Ρ, ΠΈ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ ΠΏΡΠΎΡΠ»ΠΎ ΡΡΠΏΠ΅ΡΠ½ΠΎ, ΡΡΠΎ ΠΌΡ ΠΈ Ρ
ΠΎΡΠ΅Π»ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΡΡΠ΅ΠΈΠ²Π°ΡΡ ΠΏΠ»ΠΎΡ ΠΎΠΉ ΠΊΠΎΠ΄ Π΄ΠΎ ΡΠ»ΠΈΡΠ½ΠΈΡ Π²Π΅ΡΠΎΠΊ β ΡΡΠΎ ΠΎΡΠ΅Π½Ρ ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΈ ΠΏΡΠΈΡΡΠ½ΠΎ. ΠΠΎΡΡΠΎΠΌΡ, Π΅ΡΠ»ΠΈ Π²Ρ ΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ΡΡ CI/CD, ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ Π²ΡΡΡΠΎΠΈΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ. Π’Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ ΡΡΠΎ Π΄Π΅Π»Π°Π΅ΡΡΡ ΡΡΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ.
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅.
ΠΡΠ»ΠΈ Ρ
ΠΎΡΠΈΡΠ΅ ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ΠΉ Ρ Π°Π½Π³Π»ΠΎΡΠ·ΡΡΠ½ΠΎΠΉ Π°ΡΠ΄ΠΈΡΠΎΡΠΈΠ΅ΠΉ, ΡΠΎ ΠΏΡΠΎΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΡΠ»ΠΊΡ Π½Π° ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄: Nikolay Mironov.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com