
Π Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° PVS-Studio Π·Π° Π΅Π·ΠΈΡΠΈ C ΠΈ C++ Π½Π° Linux ΠΈ macOS, ΠΎΡ Π²Π΅ΡΡΠΈΡ 7.04, ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ ΡΠ΅ΡΡΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΡ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΏΠΈΡΡΠΊΠ° Π½Π° ΡΠΊΠ°Π·Π°Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. Π‘ Π½ΠΎΠ²ΠΈΡ ΡΠ΅ΠΆΠΈΠΌ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΡΡΡΠΎΠΈΡΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΊΠΎΠΌΠΈΡΠΈ ΠΈ pull request-ΠΈ. Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΡΠ°Π·ΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠ°ΠΊ Π΄Π° Π½Π°ΡΡΡΠΎΠΈΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΏΠΈΡΡΠΊΠ° Ρ ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π² ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ΅ Π² GitHub Π² ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΈΡΠ΅ CI (Continuous Integration) ΡΠΈΡΡΠ΅ΠΌΠΈ, ΠΊΠ°ΡΠΎ Travis CI, Buddy ΠΈ AppVeyor.
Π Π΅ΠΆΠΈΠΌ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΏΠΈΡΡΠΊ Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅
β ΡΠΎΠ²Π° Π΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° ΠΎΡΠΊΡΠΈΠ²Π°Π½Π΅ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ ΠΈ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»Π½ΠΈ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ Π² ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, Π½Π°ΠΏΠΈΡΠ°Π½ΠΈ Π½Π° Π΅Π·ΠΈΡΠΈ C, C++, C# ΠΈ Java. Π Π°Π±ΠΎΡΠΈ Π² 64-Π±ΠΈΡΠΎΠ²ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ Π½Π° Windows, Linux ΠΈ macOS.
Π Π²Π΅ΡΡΠΈΡ PVS-Studio 7.04 Π·Π° Linux ΠΈ macOS ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΏΠΈΡΡΠΊΠ° Ρ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. Π’ΠΎΠ²Π° ΡΠ°Π±ΠΎΡΠΈ Π·Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈ, ΡΠΈΡΡΠΎ ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΡΠ±ΠΎΡΠΊΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°ΠΉΠ» . ΠΡΠΆΠ΅Π½ Π΅, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° Π΄Π° ΠΈΠ·Π²Π»Π΅ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠΊΠ°Π·Π°Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. ΠΠΊΠΎ Π²Π°ΡΠ°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΡΠ±ΠΎΡΠΊΠ° Π½Π΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠ°ΠΉΠ» compile_commands.json, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΎΠΏΠΈΡΠ°ΡΠ΅ Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ ΡΠ°ΠΊΡΠ² ΡΠ°ΠΉΠ» Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΡΠΈΠ»ΠΈΡΠ° .
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ΅ΠΆΠΈΠΌΡΡ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΏΠΈΡΡΠΊΠ° Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π°Π΅Π΄Π½ΠΎ Ρ Π»ΠΎΠ³ Π½Π° ΡΡΠ°ΡΠΈΡΠΎΠ²ΠΊΠ°ΡΠ° strace ΠΏΡΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠ° (pvs-studio-analyzer trace). ΠΠ° ΡΠ΅Π»ΡΠ° ΡΠ΅ ΡΡΡΠ±Π²Π° ΠΏΡΡΠ²ΠΎ Π΄Π° ΠΈΠ·Π²ΡΡΡΠΈΡΠ΅ ΠΏΡΠ»Π½Π° ΡΠ±ΠΎΡΠΊΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ Π΄Π° Ρ ΠΏΡΠΎΡΠ»Π΅Π΄ΠΈΡΠ΅, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡΡ Π΄Π° ΡΡΠ±Π΅ΡΠ΅ ΡΡΠ»Π°ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅.
ΠΠ±Π°ΡΠ΅, ΡΠΎΠ·ΠΈ Π²Π°ΡΠΈΠ°Π½Ρ ΠΈΠΌΠ° ΡΡΡΠ΅ΡΡΠ²Π΅Π½ΠΈΡΡ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΠΊ β ΡΠ΅ ΡΡΡΠ±Π²Π° ΠΈΠ»ΠΈ Π΄Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ ΠΏΡΠ»Π½Π° ΡΡΠ°ΡΠΈΡΠΎΠ²ΠΊΠ° Π½Π° ΡΠ±ΠΎΡΠΊΠ°ΡΠ° Π½Π° ΡΠ΅Π»ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΏΡΠΈ Π²ΡΡΠΊΠΎ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅, ΠΊΠΎΠ΅ΡΠΎ ΡΠ°ΠΌΠΎ ΠΏΠΎ ΡΠ΅Π±Π΅ ΡΠΈ ΠΏΡΠΎΡΠΈΠ²ΠΎΡΠ΅ΡΠΈ Π½Π° ΠΈΠ΄Π΅ΡΡΠ° Π·Π° Π±ΡΡΠ·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΊΠΎΠΌΠΈΡΠΈ. ΠΠ»ΠΈ, Π°ΠΊΠΎ ΠΊΠ΅ΡΠΈΡΠ°ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ° ΠΎΡ ΡΡΠ°ΡΠΈΡΠΎΠ²ΠΊΠ°ΡΠ°, ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°Π½ΠΈΡ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π½Π΅ΠΏΡΠ»Π½ΠΈ, Π°ΠΊΠΎ ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² Π΅Π΄ΠΈΠ½ ΠΎΡ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π±ΡΠ΄Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½ Π½ΠΎΠ² #include).
ΠΠ°ΡΠΎΠ²Π° Π½Π΅ ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°ΠΌΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΠ΅ΠΆΠΈΠΌΠ° Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΏΠΈΡΡΠΊΠ° Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Ρ Π»ΠΎΠ³ Π½Π° ΡΡΠ°ΡΠΈΡΠΎΠ²ΠΊΠ°ΡΠ° Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΊΠΎΠΌΠΈΡΠΈ ΠΈΠ»ΠΈ pull request-ΠΈ. Π ΡΠ»ΡΡΠ°ΠΉ, ΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»Π½Π° ΡΠ±ΠΎΡΠΊΠ° ΠΏΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ° Π½Π° ΠΊΠΎΠΌΠΈΡ, ΠΎΠ±ΠΌΠΈΡΠ»Π΅ΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΠ΅ΠΆΠΈΠΌΠ° .
Π‘ΠΏΠΈΡΡΠΊΡΡ Π½Π° ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π·Π° Π°Π½Π°Π»ΠΈΠ· ΡΠ΅ Π·Π°ΠΏΠ°Π·Π²Π° Π² ΡΠ΅ΠΊΡΡΠΎΠ² ΡΠ°ΠΉΠ» ΠΈ ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π²Π° Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° -S:
pvs-studio-analyzer analyze ... -f build/compile_commands.json -S check-list.txtΠ ΡΠΎΠ·ΠΈ ΡΠ°ΠΉΠ» ΡΠ΅ ΠΏΠΎΡΠΎΡΠ²Π°Ρ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»Π½ΠΈ ΠΈΠ»ΠΈ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΈ ΠΏΡΡΠΈΡΠ° ΠΊΡΠΌ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, ΠΊΠ°ΡΠΎ Π²ΡΠ΅ΠΊΠΈ Π½ΠΎΠ² ΡΠ°ΠΉΠ» ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ Π² Π½ΠΎΠ² ΡΠ΅Π΄. ΠΠΎΠΏΡΡΡΠΈΠΌΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΏΠΎΡΠΎΡΠ²Π°Ρ Π½Π΅ ΡΠ°ΠΌΠΎ ΠΈΠΌΠ΅Π½Π° Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π·Π° Π°Π½Π°Π»ΠΈΠ·, Π½ΠΎ ΠΈ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ ΡΠ΅ΠΊΡΡ. ΠΠ½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡΡ ΡΠ΅ Π²ΠΈΠ΄ΠΈ, ΡΠ΅ ΡΠΎΠ²Π° Π½Π΅ Π΅ ΡΠ°ΠΉΠ» ΠΈ ΡΠ΅ ΠΈΠ³Π½ΠΎΡΠΈΡΠ° ΡΠ΅Π΄Π°. Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π·Π° ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈ, Π°ΠΊΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ ΡΠ΅ ΠΏΠΎΡΠΎΡΠ²Π°Ρ ΡΡΡΠ½ΠΎ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΡΠ΅ΡΡΠΎ ΡΠΏΠΈΡΡΠΊΡΡ Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΠ΅ Π±ΡΠ΄Π΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π° Π² CI, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΠ²Π° ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΎΡ ΠΊΠΎΠΌΠΌΠΈΡ ΠΈΠ»ΠΈ pull request.
Π‘Π΅Π³Π° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠΎΠ·ΠΈ ΡΠ΅ΠΆΠΈΠΌ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π±ΡΡΠ·ΠΎ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°ΡΠ΅ Π½ΠΎΠ² ΠΊΠΎΠ΄ ΠΏΡΠ΅Π΄ΠΈ Π΄Π° Π±ΡΠ΄Π΅ Π²ΠΊΠ»ΡΡΠ΅Π½ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡ ΠΊΠ»ΠΎΠ½ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°. ΠΠ° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π΄Π° ΡΠ΅Π°Π³ΠΈΡΠ° Π½Π° ΠΏΡΠΈΡΡΡΡΠ²ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ ΠΎΡ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°, Π² ΡΡΠΈΠ»ΠΈΡΠ°ΡΠ° plog-converter Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½ ΡΠ»Π°Π³ βindicate-warnings:
plog-converter ... --indicate-warnings ... -o /path/to/report.tasks ...Π‘ ΡΠΎΠ·ΠΈ ΡΠ»Π°Π³ ΠΊΠΎΠ½Π²Π΅ΡΡΠΎΡΡΡ ΡΠ΅ Π²ΡΡΠ½Π΅ Π½Π΅Π½ΡΠ»Π΅Π² ΠΊΠΎΠ΄, Π°ΠΊΠΎ Π² ΠΎΡΡΠ΅ΡΠ° Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° ΠΈΠΌΠ° ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ. Π‘ΠΏΠΎΡΠ΅Π΄ ΠΊΠΎΠ΄Π° Π½Π° Π²ΡΡΡΠ°Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±Π»ΠΎΠΊΠΈΡΠ°ΡΠ΅ ΠΏΡΠ΅ΠΊΠΎΠΌΠΈΡ Ρ ΡΠΊ, ΠΊΠΎΠΌΠΌΠΈΡ ΠΈΠ»ΠΈ pull request, Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ΠΈΡΡ ΠΎΡΡΠ΅Ρ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° Π΄Π° Π±ΡΠ΄Π΅ ΠΈΠ·Π²Π΅Π΄Π΅Π½ Π½Π° Π΅ΠΊΡΠ°Π½Π°, ΡΠΏΠΎΠ΄Π΅Π»Π΅Π½ ΠΈΠ»ΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠ΅Π½ ΠΏΠΎ ΠΈΠΌΠ΅ΠΉΠ».
ΠΠ°Π±Π΅Π»Π΅ΠΆΠΊΠ°. ΠΡΠΈ ΠΏΡΡΠ²ΠΎΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° ΡΠΏΠΈΡΡΠΊΠ° Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΠ΅ Π±ΡΠ΄Π΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ ΡΠ΅Π»ΠΈΡΡ ΠΏΡΠΎΠ΅ΠΊΡ, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡΡ ΡΡΡΠ±Π²Π° Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ° ΡΠ°ΠΉΠ» Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π½Π° ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΎΡ Π·Π°Π³Π»Π°Π²Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. Π’ΠΎΠ²Π° Π΅ ΠΎΡΠΎΠ±Π΅Π½ΠΎΡΡ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° C ΠΈ C++ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. Π Π±ΡΠ΄Π΅ΡΠ΅ ΡΠ°ΠΉΠ»ΡΡ Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΊΠ΅ΡΠΈΡΠ°Π½ ΠΈ ΡΠΎΠΉ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΎΠ±Π½ΠΎΠ²ΡΠ²Π°Π½ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΎΡ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°. ΠΡΠ΅Π΄ΠΈΠΌΡΡΠ²ΠΎΡΠΎ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ° Π½Π° ΠΊΠΎΠΌΠΌΠΈΡΠΈΡΠ΅ ΠΏΡΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅ΠΆΠΈΠΌΠ° Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΏΠΈΡΡΠΊΠ° Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΏΡΠ΅Π΄ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅ΠΆΠΈΠΌΠ° Π·Π° ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»Π΅Π½ Π°Π½Π°Π»ΠΈΠ· Π΅, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΊΠ΅ΡΠΈΡΠ° ΡΠ°ΠΌΠΎ ΡΠΎΠ·ΠΈ ΡΠ°ΠΉΠ», Π° Π½Π΅ ΠΎΠ±Π΅ΠΊΡΠ½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅.
ΠΠ±ΡΠΈ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° pull request
ΠΠ½Π°Π»ΠΈΠ·ΡΡ Π½Π° ΡΠ΅Π»ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΎΡΠ½Π΅ΠΌΠ° Π΄ΠΎΡΡΠ° Π²ΡΠ΅ΠΌΠ΅, Π·Π°ΡΠΎΠ²Π° Π΅ ΡΠ°Π·ΡΠΌΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° ΡΠ°ΠΌΠΎ ΡΠ°ΡΡ ΠΎΡ Π½Π΅Π³ΠΎ. ΠΡΠΎΠ±Π»Π΅ΠΌΡΡ Π΅, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΎΡΠ΄Π΅Π»ΡΡ Π½ΠΎΠ²ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΎΡ ΠΎΡΡΠ°Π½Π°Π»ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°.
ΠΠ΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΡΠΈΠΌΠ΅Ρ Π½Π° Π΄ΡΡΠ²ΠΎ ΠΎΡ ΠΊΠΎΠΌΠΌΠΈΡΠΈ Ρ Π΄Π²Π΅ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅:

ΠΡΠ΅Π΄ΡΡΠ°Π²Π΅ΡΠ΅ ΡΠΈ, ΡΠ΅ ΠΊΠΎΠΌΠΌΠΈΡ A1 ΡΠΎΠ΄ΡΡΠΆΠ° Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π³ΠΎΠ»ΡΠΌΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠ΄, ΠΊΠΎΠΉΡΠΎ Π²Π΅ΡΠ΅ Π΅ Π±ΠΈΠ» ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°Π½. ΠΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΡΠ°Π½ΠΎ ΡΡΠ·Π΄Π°Π΄ΠΎΡ ΠΌΠ΅ ΠΊΠ»ΠΎΠ½ ΠΎΡ ΠΊΠΎΠΌΠΌΠΈΡΠ° A1 ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΡΡ ΠΌΠ΅ Π½ΡΠΊΠΎΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅.
Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, Π·Π°Π±Π΅Π»ΡΠ·Π°Ρ ΡΠ΅, ΡΠ΅ ΡΠ»Π΅Π΄ A1 ΡΠ° Π½Π°ΡΡΡΠΏΠΈΠ»ΠΈ ΠΎΡΠ΅ Π΄Π²Π° ΠΊΠΎΠΌΠΌΠΈΡΠ°, Π½ΠΎ ΡΠ΅ ΡΡΡΠΎ Π±ΡΡ Π° ΡΠ»ΠΈΡΠ½ΠΈΡ Π½Π° Π΄ΡΡΠ³ΠΈ ΠΊΠ»ΠΎΠ½ΠΈ, Π½ΠΈΠ΅ Π½Π΅ ΠΊΠΎΠΌΠΌΠΈΡΠ²Π°ΠΌΠ΅ Π² master. Π Π΅ΡΠΎ, Π΄ΠΎΠΉΠ΄Π΅ Π²ΡΠ΅ΠΌΠ΅, ΠΊΠΎΠ³Π°ΡΠΎ hotfix Π΅ Π³ΠΎΡΠΎΠ². ΠΠ°ΡΠΎΠ²Π° ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ pull request Π·Π° ΡΠ»ΠΈΠ²Π°Π½Π΅ B3 ΠΈ A3.
Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈ ΡΠ΅Π»ΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ ΠΎΡ ΡΡΡ Π½ΠΎΡΠΎ ΡΠ»ΠΈΠ²Π°Π½Π΅, Π½ΠΎ ΡΠΎΠ²Π° Π±ΠΈ ΠΎΡΠ½Π΅Π»ΠΎ ΡΠ²ΡΡΠ΄Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΈ Π½ΡΠΌΠ°ΡΠ΅ Π΄Π° Π΅ ΠΎΠΏΡΠ°Π²Π΄Π°Π½ΠΎ, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π±ΡΡ Π° ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΈ ΡΠ°ΠΌΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ°ΠΉΠ»Π°. ΠΠ°ΡΠΎΠ²Π° Π΅ ΠΏΠΎ-Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΡΠ°ΠΌΠΎ ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΈΡΠ΅.
ΠΠ° ΡΠ΅Π»ΡΠ° ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠ°Π·Π»ΠΈΠΊΠ°ΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ΡΠ΅, ΠΊΠ°ΡΠΎ ΡΠΌΠ΅ Π² HEAD Π½Π° ΠΊΠ»ΠΎΠ½Π°, ΠΎΡ ΠΊΠΎΠΉΡΠΎ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΡΠ»Π΅Π΅ΠΌ Π² master:
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list$MERGE_BASE ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ. Π€Π°ΠΊΡ Π΅, ΡΠ΅ Π½Π΅ Π²ΡΠ΅ΠΊΠΈ CI ΡΠ΅ΡΠ²ΠΈΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ°ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΎΡΠ½ΠΎΠ²Π°ΡΠ° Π·Π° ΡΠ»ΠΈΠ²Π°Π½Π΅, Π·Π°ΡΠΎΠ²Π° Π²ΡΠ΅ΠΊΠΈ ΠΏΡΡ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΠΌΠΈΡΠ»ΡΠΌΠ΅ Π½ΠΎΠ²ΠΈ Π½Π°ΡΠΈΠ½ΠΈ Π·Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° ΡΠ΅Π·ΠΈ Π΄Π°Π½Π½ΠΈ. Π’ΠΎΠ²Π° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΎ ΠΏΠΎ-Π΄ΠΎΠ»Ρ Π²ΡΠ² Π²ΡΠ΅ΠΊΠΈ ΠΎΡ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡΠ΅ ΡΠ΅Π±-ΡΠ΅ΡΠ²ΠΈΠ·ΠΈ.
Π ΡΠ°ΠΊΠ°, ΠΏΠΎΠ»ΡΡΠΈΡ ΠΌΠ΅ ΡΠ°Π·Π»ΠΈΠΊΠ°ΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ΡΠ΅, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ β ΡΠΏΠΈΡΡΠΊ Ρ ΠΈΠΌΠ΅Π½Π° Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΡΠ° Π±ΠΈΠ»ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΈ. Π‘Π΅Π³Π° ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅Π΄Π°Π΄Π΅ΠΌ ΡΠ°ΠΉΠ»Π° .pvs-pr.list (Π² ΠΊΠΎΠΉΡΠΎ ΠΏΡΠ΅Π½Π°ΡΠΎΡΠΈΡ ΠΌΠ΅ ΠΈΠ·Ρ ΠΎΠ΄Π° ΠΏΠΎ-Π³ΠΎΡΠ΅) Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°:
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
-S .pvs-pr.listΠ‘Π»Π΅Π΄ Π°Π½Π°Π»ΠΈΠ·Π° ΡΡΡΠ±Π²Π° Π΄Π° ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠ°ΠΉΠ»Π° Ρ Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅ (PVS-Studio.log) Π² ΡΠ΄ΠΎΠ±Π΅Π½ ΡΠΎΡΠΌΠ°Ρ Π·Π° Π²ΡΠ·ΠΏΡΠΈΠ΅ΠΌΠ°Π½Π΅:
plog-converter -t errorfile PVS-Studio.log --cerr -wΠ’Π°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΠ΅ ΠΈΠ·Π²Π΅Π΄Π΅ ΡΠΏΠΈΡΡΠΊ Ρ Π³ΡΠ΅ΡΠΊΠΈ Π² (ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈΡ ΠΏΠΎΡΠΎΠΊ Π·Π° ΠΈΠ·Ρ ΠΎΠ΄ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ Π·Π° Π³ΡΠ΅ΡΠΊΠΈ).
Π‘Π°ΠΌΠΎ ΡΠ΅ Π½ΠΈ ΡΡΡΠ±Π²Π° Π½Π΅ ΡΠ°ΠΌΠΎ Π΄Π° ΠΈΠ·Π²Π΅Π΄Π΅ΠΌ Π³ΡΠ΅ΡΠΊΠΈΡΠ΅, Π½ΠΎ ΠΈ Π΄Π° ΡΠ²Π΅Π΄ΠΎΠΌΠΈΠΌ Π½Π°ΡΠΈΡ ΡΠ΅ΡΠ²ΠΈΡ Π·Π° ΡΠ±ΠΎΡΠΊΠ° ΠΈ ΡΠ΅ΡΡΠ²Π°Π½Π΅ Π·Π° Π½Π°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ. ΠΠ°ΡΠΎΠ²Π° Π² ΠΊΠΎΠ½Π²Π΅ΡΡΠΎΡΠ° Π±Π΅ΡΠ΅ Π΄ΠΎΠ±Π°Π²Π΅Π½ ΡΠ»Π°Π³ -W (βindicate-warnings). ΠΡΠΈ Π½Π°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ΠΏΠΎΠ½Π΅ Π΅Π΄Π½ΠΎ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎΡ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°, ΠΊΠΎΠ΄ΡΡ Π½Π° Π²ΡΡΡΠ°Π½Π΅ Π½Π° ΡΡΠΈΠ»ΠΈΡΠ°ΡΠ° plog-converter ΡΠ΅ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π½Π° 2, ΠΊΠΎΠ΅ΡΠΎ ΠΎΡ ΡΠ²ΠΎΡ ΡΡΡΠ°Π½Π° ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠΈΡΠ° CI ΡΡΡΠ²ΠΈΡΠ° Π·Π° Π½Π°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»Π½ΠΈ Π³ΡΠ΅ΡΠΊΠΈ Π² ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ Π½Π° pull requestβa.
Travis CI
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½Π° ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΡΠ°ΠΉΠ» .travis.yml. ΠΠ° ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎ ΡΡΠ²Π΅ΡΠ²Π°ΠΌ Π΄Π° ΠΈΠ·Π½Π΅ΡΠ΅ΡΠ΅ Π²ΡΠΈΡΠΊΠΎ Π² ΠΎΡΠ΄Π΅Π»Π΅Π½ bash-ΡΠΊΡΠΈΠΏΡ Ρ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈ ΠΎΡ ΡΠ°ΠΉΠ»Π° .travis.yml (bash ΠΈΠΌΠ΅_ΡΠΊΡΠΈΠΏΡΠ°.sh ΠΈΠΌΠ΅_ΡΡΠ½ΠΊΡΠΈΡ).
Π©Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡ ΠΊΠΎΠ΄ Π² ΡΠΊΡΠΈΠΏΡΠ° Π½Π° bash, ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ. Π ΡΠ΅ΠΊΡΠΈΡΡΠ° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ ΡΠ΅ Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ:
install:
- bash .travis.sh travis_installΠΠΊΠΎ ΠΈΠΌΠ°ΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΈΡΠΎ ΠΈ Π΄Π° Π±ΠΈΠ»ΠΎ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΈ ΠΏΡΠ΅Π½Π΅ΡΠ΅ΡΠ΅ Π² ΡΠΊΡΠΈΠΏΡΠ°, ΠΏΡΠ΅ΠΌΠ°Ρ Π²Π°ΠΉΠΊΠΈ Π΄Π΅ΡΠΈΡΠΈΡΠ΅.
ΠΡΠ²Π°ΡΡΠΌΠ΅ ΡΠ°ΠΉΠ»Π° .travis.sh ΠΈ Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡΡΠ° Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° Π²ΡΠ² ΡΡΠ½ΠΊΡΠΈΡΡΠ° travis_install():
travis_install() {
wget -q -O - https://files.viva64.com/etc/pubkey.txt
| sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
sudo apt-get update -qq
sudo apt-get install -qq pvs-studio
}Π‘Π΅Π³Π° Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ΡΠ΅ΠΊΡΠΈΡΡΠ° ΡΠΊΡΠΈΠΏΡ Π·Π°ΠΏΡΡΠΊ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°:
script:
- bash .travis.sh travis_scriptΠ Π² bash-ΡΠΊΡΠΈΠΏΡΠ°:
travis_script() {
pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY
if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
git diff --name-only origin/HEAD > .pvs-pr.list
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
-S .pvs-pr.list
--disableLicenseExpirationCheck
else
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
fi
plog-converter -t errorfile PVS-Studio.log --cerr -w
}Π’ΠΎΠ·ΠΈ ΠΊΠΎΠ΄ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° ΡΠ»Π΅Π΄ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π°ΠΊΠΎ ΡΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈΠ»ΠΈ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Ρ CMake:
travis_script() {
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
cmake $CMAKE_ARGS CMakeLists.txt
make -j8
}Π©Π΅ ΡΡΠ°Π½Π΅ ΡΠ°ΠΊΠ°:
travis_script() {
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
cmake $CMAKE_ARGS CMakeLists.txt
make -j8
pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY
if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
git diff --name-only origin/HEAD > .pvs-pr.list
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
-S .pvs-pr.list
--disableLicenseExpirationCheck
else
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
fi
plog-converter -t errorfile PVS-Studio.log --cerr -w
}ΠΠ΅ΡΠΎΡΡΠ½ΠΎ Π²Π΅ΡΠ΅ ΡΡΠ΅ Π·Π°Π±Π΅Π»ΡΠ·Π°Π»ΠΈ ΡΠΏΠΎΠΌΠ΅Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°. $TRAVIS_PULL_REQUEST ΠΈ $TRAVIS_BRANCH. Travis CI ΠΎΠ±ΡΠ²ΡΠ²Π° ΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ:
- $TRAVIS_PULL_REQUEST ΡΡΡ ΡΠ°Π½ΡΠ²Π° Π½ΠΎΠΌΠ΅ΡΠ° Π½Π° pull request-Π° ΠΈΠ»ΠΈ Π½Π΅Π²Π΅ΡΠ½ΠΎ, Π°ΠΊΠΎ Π΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ ΠΊΠ»ΠΎΠ½;
- $TRAVIS_REPO_SLUG ΡΡΡ ΡΠ°Π½ΡΠ²Π° ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°.
ΠΠ»Π³ΠΎΡΠΈΡΡΠΌΡΡ Π½Π° ΡΠ°Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΡ:

Travis CI ΡΠ΅Π°Π³ΠΈΡΠ° Π½Π° ΠΊΠΎΠ΄ΠΎΠ²Π΅ΡΠ΅ Π·Π° Π²ΡΡΡΠ°Π½Π΅, Π·Π°ΡΠΎΠ²Π° Π½Π°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ ΡΠ΅ Π½Π°ΠΊΠ°ΡΠ° ΡΡΠ»ΡΠ³Π°ΡΠ° Π΄Π° ΠΌΠ°ΡΠΊΠΈΡΠ° ΠΊΠΎΠΌΠΈΡΠ° ΠΊΠ°ΡΠΎ ΡΡΠ΄ΡΡΠΆΠ°Ρ Π³ΡΠ΅ΡΠΊΠΈ.
Π ΡΠ΅Π³Π° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΡΠΎΠ·ΠΈ ΡΠ΅Π΄ ΠΊΠΎΠ΄:
git diff --name-only origin/HEAD > .pvs-pr.listΠ‘ΡΠ°Π²Π° Π²ΡΠΏΡΠΎΡ Π·Π° ΡΠΎΠ²Π°, ΡΠ΅ Travis CI Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΠ»ΠΈΠ²Π°Π½Π΅ Π½Π° ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° pull request:

ΠΠ°ΡΠΎΠ²Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ A4, Π° Π½Π΅ B3->A3. ΠΠΎΡΠ°Π΄ΠΈ ΡΠ°Π·ΠΈ ΠΎΡΠΎΠ±Π΅Π½ΠΎΡΡ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°ΠΌΠ΅ ΡΠ°Π·Π»ΠΈΠΊΠ°ΡΠ° Ρ Π3, ΠΊΠΎΠ΅ΡΠΎ Π²ΡΡΡΠ½ΠΎΡΡ Π΅ Π²ΡΡΡ
ΡΡ Π½Π° ΠΊΠ»ΠΎΠ½Π° ΠΎΡ origin.
ΠΡΡΠ°Π½Π° Π΅Π΄ΠΈΠ½ Π²Π°ΠΆΠ΅Π½ Π΄Π΅ΡΠ°ΠΉΠ» β ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° Π·Π°Π³Π»Π°Π²Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΎΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½ΠΈΡΠ΅ Π΅Π΄ΠΈΠ½ΠΈΡΠΈ Π½Π° ΡΡΠ°Π½ΡΠ»Π°ΡΠΈΡΡΠ° (*.c, *.cc, *.cpp ΠΈ Ρ.Π½.). Π’Π΅Π·ΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡΡ ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π° ΠΏΡΠΈ ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π² ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΏΠΈΡΡΠΊΠ° Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π³ΠΈ ΡΡΡ ΡΠ°Π½ΡΠ²Π° Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° .PVS-Studio. Travis CI ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠ°ΠΏΠΊΠΈ, Π·Π°ΡΠΎΠ²Π° ΡΠ΅ Π·Π°ΠΏΠ°Π·ΠΈΠΌ Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΎΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° .PVS-Studio/:
cache:
directories:
- .PVS-Studio/Π’ΠΎΠ·ΠΈ ΠΊΠΎΠ΄ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈ Π² ΡΠ°ΠΉΠ»Π° .travis.yml. Π’Π°Π·ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ ΡΡΡ ΡΠ°Π½ΡΠ²Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π΄Π°Π½Π½ΠΈ, ΡΡΠ±ΡΠ°Π½ΠΈ ΡΠ»Π΅Π΄ Π°Π½Π°Π»ΠΈΠ·Π°, ΠΊΠΎΠΈΡΠΎ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΡΡΠΊΠΎΡΡΠ²Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄Π²Π°ΡΠΈΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°Π½ΠΈΡ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²ΠΈΡ ΡΠΏΠΈΡΡΠΊ ΠΈΠ»ΠΈ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»Π½ΠΈΡ Π°Π½Π°Π»ΠΈΠ·. ΠΠΊΠΎ ΡΠΎΠ²Π° Π½Π΅ ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ, Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡΡ Π²ΡΡΡΠ½ΠΎΡΡ ΡΠ΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ° Π²ΡΠΈΡΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π²ΡΠ΅ΠΊΠΈ ΠΏΡΡ.
Buddy
ΠΠ°ΠΊΡΠΎ Travis CI, ΠΏΡΠ΅Π΄Π»Π°Π³Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°Π½ΠΎ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ ΠΈ ΡΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π°Ρ Π² GitHub. ΠΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΡ Travis CI, ΡΠΎΠΉ ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠ²Π° Π² ΡΠ΅Π± ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ (ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΡΠ΅ bash), ΠΏΠΎΡΠ°Π΄ΠΈ ΠΊΠΎΠ΅ΡΠΎ Π½ΡΠΌΠ° Π½ΡΠΆΠ΄Π° Π΄Π° ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π°Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ°.
ΠΡΡΠ²ΠΎ, ΡΡΡΠ±Π²Π° Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π½ΠΎΠ²ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π² Π»ΠΈΠ½ΠΈΡΡΠ° Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅:

Π©Π΅ ΠΏΠΎΡΠΎΡΠΈΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠ°, ΠΊΠΎΠΉΡΠΎ Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°. ΠΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° docker ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, ΠΊΠΎΠΉΡΠΎ Π΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ Π² ΡΠΎΠ²Π° Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π° GCC ΠΈΠΌΠ° ΡΠΏΠ΅ΡΠΈΠ°Π»Π΅Π½ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ:

Π‘Π΅Π³Π° ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ PVS-Studio ΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΡΡΠΈΠ»ΠΈΡΠΈ:

ΠΠΎΠ±Π°Π²Π΅ΡΠ΅ Π² ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΡΠ΅Π΄ΠΎΠ²Π΅:
apt-get update && apt-get -y install wget gnupg jq
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Π‘Π΅Π³Π° ΡΠ΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ Π½Π° ΡΠ°Π±Π° Run (ΠΏΡΡΠ²Π°ΡΠ° ΠΈΠΊΠΎΠ½Π°) ΠΈ Π² ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎΡΠΎ ΠΏΠΎΠ»Π΅ Π½Π° ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ° ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠ»Π΅Π΄Π½ΠΈΡ ΠΊΠΎΠ΄:
pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY
if [ "$BUDDY_EXECUTION_PULL_REQUEST_NO" != '' ]; then
PULL_REQUEST_ID="pulls/$BUDDY_EXECUTION_PULL_REQUEST_NO"
MERGE_BASE=`wget -qO -
https://api.github.com/repos/${BUDDY_REPO_SLUG}/${PULL_REQUEST_ID}
| jq -r ".base.ref"`
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
-S .pvs-pr.list
else
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
fi
plog-converter -t errorfile PVS-Studio.log --cerr -wΠΠΊΠΎ ΡΡΠ΅ ΠΏΡΠΎΡΠ΅Π»ΠΈ ΡΠ°Π·Π΄Π΅Π»Π°, ΠΏΠΎΡΠ²Π΅ΡΠ΅Π½ Π½Π° Travis-CI, ΡΠΎ ΡΠΎΠ·ΠΈ ΠΊΠΎΠ΄ Π²Π΅ΡΠ΅ Π΅ ΠΏΠΎΠ·Π½Π°Ρ Π·Π° Π²Π°Ρ, ΠΎΠ±Π°ΡΠ΅ ΡΠ΅Π³Π° Π΅ Π½Π°Π»ΠΈΡΠ΅ Π½ΠΎΠ² Π΅ΡΠ°ΠΏ:

Π Π°Π±ΠΎΡΠ°ΡΠ° Π΅ ΡΠ°ΠΌ, ΡΠ΅ ΡΠ΅Π³Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π½Π΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ° ΠΎΡ ΡΠ»ΠΈΠ²Π°Π½Π΅ΡΠΎ, Π° HEAD Π½Π° ΠΊΠ»ΠΎΠ½Π°, ΠΎΡ ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΏΡΠ°Π²ΠΈ pull request:

ΠΠ°ΡΠΎΠ²Π° ΡΠ΅ Π½Π°ΠΌΠΈΡΠ°ΠΌΠ΅ Π² ΡΡΠ»ΠΎΠ²Π΅Π½ ΠΊΠΎΠΌΠΈΡ B3 ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠ°Π·Π»ΠΈΠΊΠ°ΡΠ° Ρ A3:
PULL_REQUEST_ID="pulls/$BUDDY_EXECUTION_PULL_REQUEST_NO"
MERGE_BASE=`wget -qO -
https://api.github.com/repos/${BUDDY_REPO_SLUG}/${PULL_REQUEST_ID}
| jq -r ".base.ref"`
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.listΠΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ A3 ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ API Π½Π° GitHub:
https://api.github.com/repos/${USERNAME}/${REPO}/pulls/${PULL_REQUEST_ID}ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΌΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½ΠΈ ΠΎΡ Buddy:
- $BUDDY_EXECUTION_PULL_REQUEST_NO β Π½ΠΎΠΌΠ΅Ρ Π½Π° pull request-Π°;
- $BUDDY_REPO_SLUG β ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎ ΠΈΠΌΠ΅ ΠΈ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ max/test).
Π‘Π΅Π³Π° ΡΠ΅ Π·Π°ΠΏΠ°Π·ΠΈΠΌ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π±ΡΡΠΎΠ½Π° Π΄ΠΎΠ»Ρ, ΠΈ ΡΠ΅ Π²ΠΊΠ»ΡΡΠΈΠΌ Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° pull request:

ΠΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΡ Travis CI, Π½ΡΠΌΠ° Π½ΡΠΆΠ΄Π° Π΄Π° ΡΠΊΠ°Π·Π²Π°ΠΌΠ΅ .pvs-studio Π·Π° ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ Buddy Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΊΠ΅ΡΠΈΡΠ° Π²ΡΠΈΡΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π·Π° ΡΠ»Π΅Π΄Π²Π°ΡΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½ΠΈΡ. ΠΡΡΠ°Π²Π° ΡΠ°ΠΌΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΎΡΠΎ β Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈΠΌ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎΡΠΎ ΠΈΠΌΠ΅ ΠΈ ΠΏΠ°ΡΠΎΠ»Π°ΡΠ° Π·Π° PVS-Studio Π² Buddy. Π‘Π»Π΅Π΄ Π·Π°ΠΏΠ°Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΡΠ΅ ΡΠ΅ Π²ΡΡΠ½Π΅ΠΌ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π² Pipeline. Π’ΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΊΡΠΌ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ ΠΈ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎΡΠΎ ΠΈΠΌΠ΅ ΠΈ ΠΊΠ»ΡΡΠ° Π·Π° PVS-Studio:

Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΏΠΎΡΠ²Π°ΡΠ° Π½Π° Π½ΠΎΠ² pull request ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΈΡΠ° ΡΠ΅ Π·Π°Π΄Π΅ΠΉΡΡΠ²Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ°. ΠΠΊΠΎ ΠΊΠΎΠΌΠΈΡΡΡ ΡΡΠ΄ΡΡΠΆΠ° Π³ΡΠ΅ΡΠΊΠΈ, Buddy ΡΠ΅ ΠΏΠΎΡΠΎΡΠΈ ΡΠΎΠ²Π° Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° Π½Π° pull request:
AppVeyor
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ°ΡΠ° Π½Π° AppVeyor Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π½Π° Π½Π° ΡΠ°Π·ΠΈ Π½Π° Buddy, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π²ΡΠΈΡΠΊΠΎ ΡΠ΅ ΡΠ»ΡΡΠ²Π° Π² ΡΠ΅Π± ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΠΈ Π½ΡΠΌΠ° Π½ΡΠΆΠ΄Π° Π΄Π° Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ ΡΠ°ΠΉΠ» *.yml Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°.
ΠΠ΅ΠΊΠ° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΊΡΠΌ ΡΠ°Π±Π° Settings Π² ΠΏΡΠ΅Π³Π»Π΅Π΄Π° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°:

Π©Π΅ ΡΠΊΡΠΎΠ»Π½Π΅ΠΌ ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° Π½Π°Π΄ΠΎΠ»Ρ ΠΈ ΡΠ΅ Π²ΠΊΠ»ΡΡΠΈΠΌ Π·Π°ΠΏΠ°Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠ΅ΡΠ° Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° pull request:

Π‘Π΅Π³Π° ΡΠ΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΊΡΠΌ ΡΠ°Π±Π° Environment, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ΅ ΡΠΊΠ°ΠΆΠ΅ΠΌ ΠΎΠ±ΡΠ°Π·Π° Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ ΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°:

ΠΠΊΠΎ ΡΡΠ΅ ΠΏΡΠΎΡΠ΅Π»ΠΈ ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈΡΠ΅ ΡΠ°Π·Π΄Π΅Π»ΠΈ, Π΄ΠΎΠ±ΡΠ΅ Π·Π½Π°Π΅ΡΠ΅ Π·Π° ΡΠ΅Π·ΠΈ Π΄Π²Π΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ β PVS_KEY ΠΈ PVS_USERNAME. ΠΠΊΠΎ Π½Π΅, ΡΠ΅ Π½Π°ΠΏΠΎΠΌΠ½Ρ, ΡΠ΅ ΡΠ΅ ΡΠ° Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π»ΠΈΡΠ΅Π½Π·Π° Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° PVS-Studio. ΠΠΎ-ΠΊΡΡΠ½ΠΎ ΠΎΡΠ½ΠΎΠ²ΠΎ ΡΠ΅ ΡΠ΅ ΡΡΠ΅ΡΠ½Π΅ΠΌ Ρ ΡΡΡ
Π² Bash ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ΡΠ΅.
ΠΠ° ΡΡΡΠ°ΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ° Π΄ΠΎΠ»Ρ ΡΠ΅ ΡΠΊΠ°ΠΆΠ΅ΠΌ ΠΏΠ°ΠΏΠΊΠ°ΡΠ° Π·Π° ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅:

ΠΠΊΠΎ Π½Π΅ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΡΠΎΠ²Π°, ΡΠ΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π²ΠΌΠ΅ΡΡΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ°ΠΉΠ»Π° ΡΠ΅Π»ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ, Π½ΠΎ ΠΈΠ·Π²ΠΎΠ΄Π° ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΏΠΎ ΡΠΊΠ°Π·Π°Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. ΠΠ°ΡΠΎΠ²Π° Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° Π²ΡΠ²Π΅Π΄Π΅ΠΌ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎΡΠΎ ΠΈΠΌΠ΅ Π½Π° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ°.
Π‘Π΅Π³Π° Π΅ Π²ΡΠ΅ΠΌΠ΅ Π·Π° ΡΠΊΡΠΈΠΏΡΠ° Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°. ΠΠ΅ΠΊΠ° ΠΎΡΠ²ΠΎΡΠΈΠΌ ΡΠ°Π±Π° Tests ΠΈ Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ΠΌ Script:

Π ΡΠ°Π·ΠΈ ΡΠΎΡΠΌΠ° ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈΡΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡ ΠΊΠΎΠ΄:
sudo apt-get update && sudo apt-get -y install jq
wget -q -O - https://files.viva64.com/etc/pubkey.txt
| sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
sudo apt-get update && sudo apt-get -y install pvs-studio
pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY
PWD=$(pwd -L)
if [ "$APPVEYOR_PULL_REQUEST_NUMBER" != '' ]; then
PULL_REQUEST_ID="pulls/$APPVEYOR_PULL_REQUEST_NUMBER"
MERGE_BASE=`wget -qO -
https://api.github.com/repos/${APPVEYOR_REPO_NAME}/${PULL_REQUEST_ID}
| jq -r ".base.ref"`
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
--dump-files --dump-log pvs-dump.log
-S .pvs-pr.list
else
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
fi
plog-converter -t errorfile PVS-Studio.log --cerr -wΠΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΡΠ°ΡΡ ΠΎΡ ΠΊΠΎΠ΄Π°:
PWD=$(pwd -L)
if [ "$APPVEYOR_PULL_REQUEST_NUMBER" != '' ]; then
PULL_REQUEST_ID="pulls/$APPVEYOR_PULL_REQUEST_NUMBER"
MERGE_BASE=`wget -qO -
https://api.github.com/repos/${APPVEYOR_REPO_NAME}/${PULL_REQUEST_ID}
| jq -r ".base.ref"`
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
--dump-files --dump-log pvs-dump.log
-S .pvs-pr.list
else
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
fiΠΠ° ΠΏΡΡΠ² ΠΏΠΎΠ³Π»Π΅Π΄, Π½Π°Π·Π½Π°ΡΠ°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° pwd Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°, ΠΊΠΎΡΡΠΎ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΡ ΡΠ°Π½ΡΠ²Π° ΡΠΎΠ²Π° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΡΡΠ°Π½Π½ΠΎ, Π½ΠΎ ΡΠ΅Π³Π° ΡΠ΅ ΠΎΠ±ΡΡΠ½Ρ Π²ΡΠΈΡΠΊΠΎ.
ΠΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° Π² AppVeyor, ΡΠ΅ ΡΠ±Π»ΡΡΠΊΠ°Ρ Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΡΠ°Π½Π½ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°. ΠΡ Π΅Π΄Π½Π° ΡΡΡΠ°Π½Π°, Π²ΡΠΈΡΠΊΠΎ ΡΠ°Π±ΠΎΡΠ΅ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ, Π½ΠΎ Π°Π½Π°Π»ΠΈΠ·ΡΡ Π½Π΅ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅. ΠΠ·ΠΌΠΈΠ½Π°Ρ Π΄ΠΎΡΡΠ° Π²ΡΠ΅ΠΌΠ΅, Π·Π° Π΄Π° Π·Π°Π±Π΅Π»Π΅ΠΆΠ°, ΡΠ΅ ΡΠΌΠ΅ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ /home/appveyor/projects/testcalc/, Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡΡ Π΅ ΡΠ±Π΅Π΄Π΅Π½, ΡΠ΅ ΡΠΌΠ΅ Π² /opt/appveyor/build-agent/. Π’ΠΎΠ³Π°Π²Π° ΡΠ°Π·Π±ΡΠ°Ρ , ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° $PWD ΠΌΠ°Π»ΠΊΠΎ Π»ΡΠΆΠ΅. ΠΠΎΡΠ°Π΄ΠΈ ΡΠ°Π·ΠΈ ΠΏΡΠΈΡΠΈΠ½Π°, ΡΡΡΠ½ΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° ΠΉ ΠΏΡΠ΅Π΄ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°.
Π ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π²ΡΠΈΡΠΊΠΎ Π΅ ΠΊΠ°ΠΊΡΠΎ ΠΏΡΠ΅Π΄ΠΈ:

Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ:
PULL_REQUEST_ID="pulls/$APPVEYOR_PULL_REQUEST_NUMBER"
MERGE_BASE=`wget -qO -
https://api.github.com/repos/${APPVEYOR_REPO_NAME}/${PULL_REQUEST_ID}
| jq -r ".base.ref"`Π Π½Π΅Π³ΠΎ ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΡΠ°Π·Π»ΠΈΠΊΠ°ΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ΡΠ΅, Π½Π°Π΄ ΠΊΠΎΠΈΡΠΎ Π΅ ΠΎΠ±ΡΠ²Π΅Π½ pull request. ΠΠ° ΡΠΎΠ²Π° Π½ΠΈ ΡΡΡΠ±Π²Π°Ρ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°:
- $APPVEYOR_PULL_REQUEST_NUMBER β Π½ΠΎΠΌΠ΅Ρ Π½Π° pull request;
- $APPVEYOR_REPO_NAME β ΠΈΠΌΠ΅ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» ΠΈ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, Π½Π΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°Ρ ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΈ ΡΡΠ»ΡΠ³ΠΈ Π·Π° Π½Π΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°ΡΠ° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ, Π½ΠΎ ΡΠ΅ ΠΈΠΌΠ°Ρ ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΡΡ ΠΎΠ΄Π½ΠΈ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ. Π‘ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ, Π²ΡΡΠΊΠ° ΡΡΠ»ΡΠ³Π° ΠΏΡΠ°Π²ΠΈ ΡΠ²ΠΎΠΉ Β«Π²Π΅Π»ΠΎΡΠΈΠΏΠ΅Π΄Β», Π·Π°ΡΠΎΠ²Π° Π²ΡΠΈΡΠΊΠΎ Π΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΎ.
Π’ΡΠΊ, ΠΊΠ°ΠΊΡΠΎ Π² Travis-CI, Π΄Π²Π΅ ΡΠ΅Π΄Π° ΠΊΠΎΠ΄ ΠΈ ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ ΡΠ°Π±ΠΎΡΠΈ Π±Π΅Π·ΡΠΏΡΠ΅ΡΠ½ΠΎ; ΡΠ°ΠΌ, ΠΊΡΠ΄Π΅ΡΠΎ Π² AppVeyor, ΠΏΡΠΎΡΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΡΠ΅ ΠΏΠ°ΠΏΠΊΠ° Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅; Π½ΠΎ Π½Π° ΠΌΠ΅ΡΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΡΠ½ΠΈΠΊΠ°Π»Π½ΠΈ ΠΊΠ»ΡΡΠΎΠ²Π΅ ΠΈ Π΄Π° ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΡΠ΅ Π΄Π° ΡΠ±Π΅Π΄ΠΈΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π΄Π° Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° ΠΏΡΠ΅Π·Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΠΊΠ΅ΡΠΈΡΠ°Π½ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ. ΠΠ°ΡΠΎΠ²Π°, Π°ΠΊΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° Π½Π°ΡΡΡΠΎΠΈΡΠ΅ Π°Π½Π°Π»ΠΈΠ· Π½Π° pull request-ΠΈ Π½Π° ΡΡΠ»ΡΠ³Π° Π·Π° Π½Π΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°ΡΠ° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ, ΠΊΠΎΡΡΠΎ Π½Π΅ Π±Π΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°Π½Π° ΠΏΠΎ-Π³ΠΎΡΠ΅, ΠΏΡΡΠ²ΠΎ ΡΠ΅ ΡΠ²Π΅ΡΠ΅ΡΠ΅, ΡΠ΅ Π½ΡΠΌΠ°ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ.
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ΡΠΎ. ΠΠΊΠΎ Π½Π΅ΡΠΎ Π½Π΅ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π²Π°, ΡΠΌΠ΅Π»ΠΎ ΠΏΠΈΡΠ΅ΡΠ΅ Π½ΠΈ Π½Π° . ΠΠΈΠ΅ ΡΠ΅ Π²ΠΈ Π½Π°ΡΠΎΡΠΈΠΌ ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ΠΌ.
ΠΠΊΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»ΠΈΡΠ΅ ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ Ρ Π°Π½Π³Π»ΠΎΠ³ΠΎΠ²ΠΎΡΡΡΠ° Π°ΡΠ΄ΠΈΡΠΎΡΠΈΡ, ΠΌΠΎΠ»Ρ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ Π»ΠΈΠ½ΠΊΠ° ΠΊΡΠΌ ΠΏΡΠ΅Π²ΠΎΠ΄Π°: Maxim Zvyagintsev. .
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
