ΠΠ±ΠΈΡΠ°ΡΠ΅ GitLab ΠΈ ΠΌΡΠ°Π·ΠΈΡΠ΅ Π³ΡΠ΅ΡΠΊΠΈ? ΠΡΠΊΠ°ΡΠ΅ Π»ΠΈ Π΄Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΠΈΡΠ΅ ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎΡΠΎ Π½Π° Π²Π°ΡΠΈΡ ΠΈΠ·Ρ
ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄? Π’ΠΎΠ³Π°Π²Π° ΡΡΠ΅ ΠΏΠΎΠΏΠ°Π΄Π½Π°Π»ΠΈ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎΡΠΎ ΠΌΡΡΡΠΎ. ΠΠ½Π΅Ρ ΡΠ΅ Π²ΠΈ ΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠ°ΠΊ Π΄Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΠ΅ C# Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° Π½Π° PVS-Studio Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π·Π°ΡΠ²ΠΊΠΈΡΠ΅ Π·Π° ΡΠ»ΠΈΠ²Π°Π½Π΅. ΠΠ°Π·Π΄ΡΠ°Π²Π΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΠΈ ΠΏΡΠΈΡΡΠ½ΠΎ ΡΠ΅ΡΠ΅Π½Π΅.
ΠΠ΅ΠΆΠ΄Ρ Π΄ΡΡΠ³ΠΎΡΠΎ, ΠΏΡΡΠ½Π°Ρ
ΠΌΠ΅ 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
ΠΠΊΠΎ ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π°ΡΠ΅ ΠΎΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π·Π° ΠΈΠ·Π²ΡΡΡΠ²Π°Π½Π΅ ΠΈΠ»ΠΈ Π·Π°ΡΠ²ΠΊΠΈ Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅, ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΡΠΎ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΠΎΠ·ΠΈ ΡΠ΅ΠΆΠΈΠΌ. Π Π°Π·Π»ΠΈΠΊΠ°ΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ Π² ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΏΠΈΡΡΠΊ Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π·Π° Π°Π½Π°Π»ΠΈΠ· ΠΈ ΡΠ΅ Π·Π°Π²ΠΈΡΠΈ ΠΎΡ ΡΠΎΠ²Π° ΠΊΠΎΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅.
ΠΡΠΈΠ½ΡΠΈΠΏ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ° Π·Π° ΡΠ»ΠΈΠ²Π°Π½Π΅
ΠΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΡΡΡΠ½ΠΎΡΡ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ° Π΅ Π΄Π° ΡΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠ°, ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅, ΠΎΡΠΊΡΠΈΡΠΈ ΠΎΡ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°, Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°Ρ Π² ΡΠ»ΠΈΠ²Π°Π½Π΅ΡΠΎ ΠΌΠ°ΠΉΡΡΠΎΡ ΠΊΠ»ΠΎΠ½. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° Π½Π΅ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΡΠ΅Π»ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ Π²ΡΠ΅ΠΊΠΈ ΠΏΡΡ. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΠΎΠ±Π΅Π΄ΠΈΠ½ΡΠ²Π°ΠΌΠ΅ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅, ΠΈΠΌΠ°ΠΌΠ΅ ΡΠΏΠΈΡΡΠΊ Ρ ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. ΠΠ°ΡΠΎΠ²Π° ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΠΌ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΈΡΠΊΠ°Π½Π΅ Π·Π° ΡΠ»ΠΈΠ²Π°Π½Π΅.
ΠΡΠΎ ΠΊΠ°ΠΊ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΈΡΠΊΠ°Π½Π΅ΡΠΎ Π·Π° ΡΠ»ΠΈΠ²Π°Π½Π΅ ΠΏΡΠ΅Π΄ΠΈ Π²ΡΠ²Π΅ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ°ΡΠΈΡΠ½ΠΈΡ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ:
Π’ΠΎΠ΅ΡΡ Π²ΡΠΈΡΠΊΠΈ Π³ΡΠ΅ΡΠΊΠΈ, ΠΊΠΎΠΈΡΠΎ Π±ΡΡ
Π° Π² ΠΊΠ»ΠΎΠ½Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈ, ΡΠ΅ ΡΠ΅ ΠΏΡΠ΅ΠΌΠ΅ΡΡΠΈ Π² Π³Π»Π°Π²Π½ΠΈΡ ΠΊΠ»ΠΎΠ½. Π’ΡΠΉ ΠΊΠ°ΡΠΎ Π½Π΅ ΠΈΡΠΊΠ°ΠΌΠ΅ ΡΠΎΠ²Π°, Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ ΡΠ΅Π³Π° Π²Π΅ΡΠΈΠ³Π°ΡΠ° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ°:
ΠΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ2 ΠΈ Π°ΠΊΠΎ Π½ΡΠΌΠ° Π³ΡΠ΅ΡΠΊΠΈ, ΠΏΡΠΈΠ΅ΠΌΠ°ΠΌΠ΅ Π·Π°ΡΠ²ΠΊΠ°ΡΠ° Π·Π° ΡΠ»ΠΈΠ²Π°Π½Π΅, Π² ΠΏΡΠΎΡΠΈΠ²Π΅Π½ ΡΠ»ΡΡΠ°ΠΉ Ρ ΠΎΡΡ
Π²ΡΡΠ»ΡΠΌΠ΅.
ΠΠ΅ΠΆΠ΄Ρ Π΄ΡΡΠ³ΠΎΡΠΎ, Π°ΠΊΠΎ ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π°ΡΠ΅ ΠΎΡ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½ΡΠΈ ΠΈ Π·Π°ΡΠ²ΠΊΠΈ Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅ Π·Π° C/C++, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΎΡΠ΅ΡΠ΅ΡΠ΅ Π·Π° ΡΠΎΠ²Π°.
GitLab
ΠΡΠ΅Π΄ΠΈ Π΄Π° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈΡΠ΅ Ρ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° Π·Π°ΡΠ²ΠΊΠΈΡΠ΅ Π·Π° ΡΠ»ΠΈΠ²Π°Π½Π΅, ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°ΡΠ΅ ΠΈ Π΄Π° ΠΊΠ°ΡΠΈΡΠ΅ Π²Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ. ΠΠΊΠΎ Π½Π΅ Π·Π½Π°Π΅ΡΠ΅ ΠΊΠ°ΠΊ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ²Π°, ΡΠΎΠ³Π°Π²Π° Π²ΠΈ ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΠΌ
ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅. ΠΠ°ΡΠΈΠ½ΡΡ Π·Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°, ΠΎΠΏΠΈΡΠ°Π½ ΠΏΠΎ-Π΄ΠΎΠ»Ρ, Π΅ Π΅Π΄ΠΈΠ½ ΠΎΡ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΈΡΠ΅. Π¦Π΅Π»ΡΠ° Π΅ Π΄Π° ΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ°Ρ ΡΡΡΠΏΠΊΠΈΡΠ΅ Π·Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° Π·Π° Π°Π½Π°Π»ΠΈΠ· ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°. ΠΠΎΠΆΠ΅ Π±ΠΈ Π²ΡΠ² Π²Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ Π±ΠΈ Π±ΠΈΠ»ΠΎ ΠΏΠΎ-ΠΎΠΏΡΠΈΠΌΠ°Π»Π½ΠΎ Π΄Π° ΡΠ΅ ΡΠ°Π·Π΄Π΅Π»ΡΡ Π΅ΡΠ°ΠΏΠΈΡΠ΅ Π½Π° ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π½Π° ΡΡΠ΅Π΄Π°ΡΠ° (Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°, ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°) ΠΈ Π°Π½Π°Π»ΠΈΠ·: Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π½Π° Docker ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ°ΡΠ° ΡΡΠ΅Π΄Π° ΠΈ ΡΡΡ Π½ΠΎΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ ΠΈΠ»ΠΈ ΠΏΠΎ Π΄ΡΡΠ³ Π½Π°ΡΠΈΠ½.
ΠΠ° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ ΡΠ΅ ΡΠ»ΡΡΠΈ ΡΠ΅Π³Π°, ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΠΌ Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΡΠ΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ° Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ°:
ΠΠ½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡΡ ΠΈΠ·ΠΈΡΠΊΠ²Π° .NET Core SDK 3, Π·Π° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΏΡΠ΅Π΄ΠΈ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°, ΡΡΡΠ±Π²Π° Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°ΡΠ° Π½Π° Microsoft, ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈΡΠ΅, Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°. ΠΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° Π½Π° Microsoft Π·Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Linux Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠΈ
ΠΠ° Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ PVS-Studio ΡΡΠ΅Π· ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ, ΡΠ΅ ΡΡΡΠ±Π²Π° ΡΡΡΠΎ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°ΡΠ° Π½Π° PVS-Studio. ΠΠΎΠ±Π°Π²ΡΠ½Π΅ΡΠΎ Π½Π° Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° Π·Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠΈ Π΅ ΠΎΠΏΠΈΡΠ°Π½ΠΎ ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Π²
ΠΠ½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡΡ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ ΠΎΡ Π»ΠΈΡΠ΅Π½Π·Π΅Π½ ΠΊΠ»ΡΡ, Π·Π° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΠΏΡΠΎΠ±Π΅Π½ Π»ΠΈΡΠ΅Π½Π· Π½Π°
ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅. ΠΠΎΠ»Ρ, ΠΎΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡΡ ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΡΠ°Π±ΠΎΡΠ° (Π°Π½Π°Π»ΠΈΠ· Π½Π° Π·Π°ΡΠ²ΠΊΠΈ Π·Π° ΡΠ»ΠΈΠ²Π°Π½Π΅) ΠΈΠ·ΠΈΡΠΊΠ²Π° Π»ΠΈΡΠ΅Π½Π· Enterprise. ΠΠ°ΡΠΎΠ²Π°, Π°ΠΊΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΡΠΎΠ±Π²Π°ΡΠ΅ ΡΠΎΠ·ΠΈ ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΡΠ°Π±ΠΎΡΠ°, Π² ΠΏΠΎΠ»Π΅ΡΠΎ "Π‘ΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅" Π½Π΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅ Π΄Π° ΠΏΠΎΡΠΎΡΠΈΡΠ΅, ΡΠ΅ ΠΈΠΌΠ°ΡΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ Enterprise Π»ΠΈΡΠ΅Π½Π·.
ΠΠΊΠΎ Π²ΡΠ·Π½ΠΈΠΊΠ½Π΅ Π·Π°ΡΠ²ΠΊΠ° Π·Π° ΡΠ»ΠΈΠ²Π°Π½Π΅, ΡΡΡΠ±Π²Π° Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΡΠ°ΠΌΠΎ ΡΠΏΠΈΡΡΠΊΠ° Ρ ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, Π² ΠΏΡΠΎΡΠΈΠ²Π΅Π½ ΡΠ»ΡΡΠ°ΠΉ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. Π‘Π»Π΅Π΄ Π°Π½Π°Π»ΠΈΠ· ΡΡΡΠ±Π²Π° Π΄Π° ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π²ΡΠ² ΡΠΎΡΠΌΠ°ΡΠ°, ΠΎΡ ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ΠΌ.
Π‘Π΅Π³Π°, ΠΊΠ°ΡΠΎ ΠΈΠΌΠ°ΠΌΠ΅ Π°Π»Π³ΠΎΡΠΈΡΡΠΌΠ° Π½Π° ΡΠ°Π±ΠΎΡΠ° ΠΏΡΠ΅Π΄ ΠΎΡΠΈΡΠ΅ ΡΠΈ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈΠΌ Ρ ΠΏΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ΅Π½Π°ΡΠΈΡ. ΠΠ° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ²Π°, ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»Π° .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
Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ΡΠΎ ΠΈ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½Π΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΡΠ»ΡΡΠΈ ΠΏΡΠ΅Π΄ΠΈ Π²ΡΠΈΡΠΊΠΈ Π΄ΡΡΠ³ΠΈ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅, Π½ΠΈΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΠΏΠ΅ΡΠΈΠ°Π»Π΅Π½ Π΅ΡΠΈΠΊΠ΅Ρ ΠΏΡΠ΅Π΄ΠΈ_ΡΠΊΡΠΈΠΏΡ. ΠΠ΅ΠΊΠ° ΠΎΠ±ΡΡΠ½Ρ ΠΌΠ°Π»ΠΊΠΎ ΡΠ°Π·ΠΈ ΡΠ°ΡΡ.
ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π·Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°:
- 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.
Π ΠΏΡΠΎΠ·ΠΎΡΠ΅ΡΠ°, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΎΡΠ²Π°ΡΡ, Π½Π°ΠΌΠ΅ΡΠ΅ΡΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠ° ΠΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, ΡΡΠ°ΠΊΠ½Π΅ΡΠ΅ Ρ Π΄Π΅ΡΠ½ΠΈΡ Π±ΡΡΠΎΠ½ Π²ΡΡΡ
Ρ Π±ΡΡΠΎΠ½Π° Π Π°Π·ΡΠΈΡΠ΅ΡΠ΅ ΠΈ Π΄ΠΎΠ±Π°Π²Π΅ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ. Π Π΅Π·ΡΠ»ΡΠ°ΡΡΡ ΡΡΡΠ±Π²Π° Π΄Π° Π΅ ΡΠ»Π΅Π΄Π½ΠΈΡΡ:
Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΊΡΠΌ Π°Π½Π°Π»ΠΈΠ·Π°. ΠΡΡΠ²ΠΎ, Π½Π΅ΠΊΠ° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠΊΡΠΈΠΏΡ Π·Π° ΠΏΡΠ»Π΅Π½ Π°Π½Π°Π»ΠΈΠ·. ΠΡΠΌ Π·Π½Π°ΠΌΠ΅ΡΠΎ -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) Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°.
Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π°ΠΌΠ΅ ΠΎΡ Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΠ΄ΠΎΠ²Π΅ Π·Π° Π²ΡΡΡΠ°Π½Π΅, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ΅ ΠΏΠΎΡΠ²ΡΠ²Π° 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
ΠΠΎΠ»Π΅Π·Π½ΠΎΡΡ
ΠΠ΅ΠΆΠ΄Ρ Π΄ΡΡΠ³ΠΎΡΠΎ, Π°ΠΊΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅ ΡΠ΄ΠΎΠ±Π½ΠΎ Ρ .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
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ Π²ΡΠΈΡΠΊΠΎ Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΎ ΠΊΡΠΌ ΡΠ°ΠΉΠ»Π°, ΡΡΠ°ΠΊΠ½Π΅ΡΠ΅ Π²ΡΡΡ Ρ ΠΠ·Π²ΡΡΡΠ΅ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ. ΠΠ° Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ Π΄Π°Π»ΠΈ Π²ΡΠΈΡΠΊΠΎ Π΅ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ, ΠΎΡΠΈΠ΄Π΅ΡΠ΅ Π½Π° CI / CD -> Π’ΡΡΠ±ΠΎΠΏΡΠΎΠ²ΠΎΠ΄ΠΈ -> Π Π°Π±ΠΎΡΠ΅ΡΠΈ. Π©Π΅ ΡΠ΅ ΠΎΡΠ²ΠΎΡΠΈ ΠΏΡΠΎΠ·ΠΎΡΠ΅ΡΡΡ Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π°, Π² ΠΊΡΠ°Ρ Π½Π° ΠΊΠΎΠΉΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠΌΠ° ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ:
ΡΡΠΈΠΎΠ½ Π Π°Π±ΠΎΡΠ°ΡΠ° ΡΡΠΏΡ - ΡΡΠΏΠ΅Ρ
, Π²ΡΠΈΡΠΊΠΎ Π΅ Π½Π°ΡΠ΅Π΄. Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ΡΡΠ²Π°ΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ ΡΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈΠ»ΠΈ.
ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ°
ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠ°Π±ΠΎΡΠ°, Π½Π΅ΠΊΠ° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΏΡΠΎΡΡ ΠΏΡΠΎΠ΅ΠΊΡ (Π² ΠΌΠ°ΠΉΡΡΠΎΡ), ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ°ΠΉΠ»Π°. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° Π² Π΄ΡΡΠ³ ΠΊΠ»ΠΎΠ½ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΠΌ ΡΠ°ΠΌΠΎ Π΅Π΄ΠΈΠ½ ΡΠ°ΠΉΠ» ΠΈ ΡΠ΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ Π·Π°ΡΠ²ΠΊΠ° Π·Π° ΡΠ»ΠΈΠ²Π°Π½Π΅.
ΠΠ΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π΄Π²Π° ΡΠ»ΡΡΠ°Ρ: ΠΊΠΎΠ³Π°ΡΠΎ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠ°Π½ΠΈΡΡ ΡΠ°ΠΉΠ» ΡΡΠ΄ΡΡΠΆΠ° Π³ΡΠ΅ΡΠΊΠ° ΠΈ ΠΊΠΎΠ³Π°ΡΠΎ Π½Π΅ ΡΡΠ΄ΡΡΠΆΠ°. ΠΡΡΠ²ΠΎ, ΠΏΡΠΈΠΌΠ΅Ρ Ρ Π³ΡΠ΅ΡΠΊΠ°.
ΠΠ° ΠΊΠ°ΠΆΠ΅ΠΌ, ΡΠ΅ ΠΈΠΌΠ° ΡΠ°ΠΉΠ» Π² Π³Π»Π°Π²Π½ΠΈΡ ΠΊΠ»ΠΎΠ½ Program.cs, ΠΊΠΎΠΉΡΠΎ Π½Π΅ ΡΡΠ΄ΡΡΠΆΠ° Π³ΡΠ΅ΡΠΊΠΈ, Π° Π² Π΄ΡΡΠ³ ΠΊΠ»ΠΎΠ½ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡΡ Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠ» Π³ΡΠ΅ΡΠ΅Π½ ΠΊΠΎΠ΄ ΠΈ ΠΈΡΠΊΠ° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ Π·Π°ΡΠ²ΠΊΠ° Π·Π° ΡΠ»ΠΈΠ²Π°Π½Π΅. ΠΠ°ΠΊΠ²Π° Π³ΡΠ΅ΡΠΊΠ° Π΅ Π½Π°ΠΏΡΠ°Π²ΠΈΠ» Π½Π΅ Π΅ ΡΠΎΠ»ΠΊΠΎΠ²Π° Π²Π°ΠΆΠ½ΠΎ, Π²Π°ΠΆΠ½ΠΎΡΠΎ Π΅, ΡΠ΅ ΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π°Π±ΡΠ°Π²ΠΈΡ
ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° Ρ
Π²ΡΡΠ»ΡΠΌ (ΠΠ°,
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
....
}
Π Π΅Π·ΡΠ»ΡΠ°ΡΠΈ ΠΎΡ Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° ΠΈΡΠΊΠ°Π½Π΅ΡΠΎ Π·Π° ΡΠ»ΠΈΠ²Π°Π½Π΅:
ΠΠ°ΠΊΡΠΎ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅, Π½Π΅ Π±ΡΡ
Π° ΠΎΡΠΊΡΠΈΡΠΈ Π³ΡΠ΅ΡΠΊΠΈ ΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π·Π°Π΄Π°ΡΠ°ΡΠ° Π±Π΅ΡΠ΅ ΡΡΠΏΠ΅ΡΠ½ΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΠΈΡΠΊΠ°Ρ
ΠΌΠ΅ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΡΡΡΡΠ°Π½ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π»ΠΎΡ ΠΊΠΎΠ΄ ΠΏΡΠ΅Π΄ΠΈ ΡΠ»ΠΈΠ²Π°Π½Π΅ Π½Π° ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΈ ΠΏΡΠΈΡΡΠ½ΠΎ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ, Π°ΠΊΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ CI/CD, ΠΎΠΏΠΈΡΠ°ΠΉΡΠ΅ Π΄Π° Π²Π³ΡΠ°Π΄ΠΈΡΠ΅ ΡΡΠ°ΡΠΈΡΠ΅Π½ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ, Π·Π° Π΄Π° Π³ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΠ΅. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° ΡΠΎΠ²Π° ΡΠ΅ ΠΏΡΠ°Π²ΠΈ ΡΡΠ²ΡΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ.
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ Π²ΠΈ Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ΡΠΎ.
ΠΠΊΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»ΠΈΡΠ΅ ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ Ρ Π°Π½Π³Π»ΠΎΠ΅Π·ΠΈΡΠ½Π° Π°ΡΠ΄ΠΈΡΠΎΡΠΈΡ, ΠΌΠΎΠ»Ρ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ Π²ΡΡΠ·ΠΊΠ°ΡΠ° Π·Π° ΠΏΡΠ΅Π²ΠΎΠ΄: ΠΠΈΠΊΠΎΠ»Π°ΠΉ ΠΠΈΡΠΎΠ½ΠΎΠ².
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com