Анализ Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈΡ‚Π΅ ΠΈ pull request-ΠΎΠ²Π΅Ρ‚Π΅ Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio

Анализ Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈ ΠΈ pull request'ΠΈ Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio
Π’ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° PVS-Studio Π·Π° Π΅Π·ΠΈΡ†ΠΈ C ΠΈ C++ Π½Π° Linux ΠΈ macOS, ΠΎΡ‚ вСрсия 7.04, сС появи тСстова функция Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° списъка Π½Π° ΡƒΠΊΠ°Π·Π°Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅. Π‘ новия Ρ€Π΅ΠΆΠΈΠΌ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° настроитС Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈ ΠΈ pull request-ΠΈ. Π’ Ρ‚Π°Π·ΠΈ статия Ρ‰Π΅ Ρ€Π°Π·ΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠ°ΠΊ Π΄Π° настроитС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° списъка с ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ‚Π΅ Π² GitHub Π² популярнитС CI (Continuous Integration) систСми, ΠΊΠ°Ρ‚ΠΎ Travis CI, Buddy ΠΈ AppVeyor.

Π Π΅ΠΆΠΈΠΌ Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° списък с Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅

PVS-Studio β€” Ρ‚ΠΎΠ²Π° Π΅ инструмСнт Π·Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π°Π½Π΅ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΈ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»Π½ΠΈ уязвимости Π² изходния ΠΊΠΎΠ΄ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ, написани Π½Π° Π΅Π·ΠΈΡ†ΠΈ C, C++, C# ΠΈ Java. Π Π°Π±ΠΎΡ‚ΠΈ Π² 64-Π±ΠΈΡ‚ΠΎΠ²ΠΈ систСми Π½Π° Windows, Linux ΠΈ macOS.

Π’ вСрсия PVS-Studio 7.04 Π·Π° Linux ΠΈ macOS сС появи Ρ€Π΅ΠΆΠΈΠΌ Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° списъка с ΠΈΠ·Ρ…ΠΎΠ΄Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅. Π’ΠΎΠ²Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ Π·Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ, чиято систСма Π·Π° сборка позволява Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° Ρ„Π°ΠΉΠ» compile_commands.json. НуТСн Π΅, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π΄Π° ΠΈΠ·Π²Π»Π΅Ρ‡Π΅ информация Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΡƒΠΊΠ°Π·Π°Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅. Ако Π²Π°ΡˆΠ°Ρ‚Π° систСма Π·Π° сборка Π½Π΅ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ„Π°ΠΉΠ» compile_commands.json, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΎΠΏΠΈΡ‚Π°Ρ‚Π΅ Π΄Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Ρ‚Π΅ Ρ‚Π°ΠΊΡŠΠ² Ρ„Π°ΠΉΠ» с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° Bear.

Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Ρ€Π΅ΠΆΠΈΠΌΡŠΡ‚ Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° списъка с Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π°Π΅Π΄Π½ΠΎ с Π»ΠΎΠ³ Π½Π° трасировката 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

ΠΠ½Π°Π»ΠΈΠ·ΡŠΡ‚ Π½Π° цСлия ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΎΡ‚Π½Π΅ΠΌΠ° доста Π²Ρ€Π΅ΠΌΠ΅, Π·Π°Ρ‚ΠΎΠ²Π° Π΅ Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ Π΄Π° сС провСрява само част ΠΎΡ‚ Π½Π΅Π³ΠΎ. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚ Π΅, Ρ‡Π΅ трябва Π΄Π° сС отдСлят Π½ΠΎΠ²ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΎΡ‚ останалитС Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

НСка Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° Π΄ΡŠΡ€Π²ΠΎ ΠΎΡ‚ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΈ с Π΄Π²Π΅ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅:

Анализ Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈ ΠΈ pull request'ΠΈ Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π΅Ρ‚Π΅ си, Ρ‡Π΅ ΠΊΠΎΠΌΠΌΠΈΡ‚ 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

Π’Π°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ‰Π΅ ΠΈΠ·Π²Π΅Π΄Π΅ списък с Π³Ρ€Π΅ΡˆΠΊΠΈ Π² stderr (стандартния ΠΏΠΎΡ‚ΠΎΠΊ Π·Π° ΠΈΠ·Ρ…ΠΎΠ΄ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ Π·Π° Π³Ρ€Π΅ΡˆΠΊΠΈ).

Π‘Π°ΠΌΠΎ Ρ‡Π΅ Π½ΠΈ трябва Π½Π΅ само Π΄Π° ΠΈΠ·Π²Π΅Π΄Π΅ΠΌ Π³Ρ€Π΅ΡˆΠΊΠΈΡ‚Π΅, Π½ΠΎ ΠΈ Π΄Π° ΡƒΠ²Π΅Π΄ΠΎΠΌΠΈΠΌ нашия сСрвис Π·Π° сборка ΠΈ тСстванС Π·Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ. Π—Π°Ρ‚ΠΎΠ²Π° Π² ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΎΡ€Π° бСшС Π΄ΠΎΠ±Π°Π²Π΅Π½ Ρ„Π»Π°Π³ -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 ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° рСпозитория Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

ΠΠ»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌΡŠΡ‚ Π½Π° Ρ‚Π°Π·ΠΈ функция:

Анализ Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈ ΠΈ pull request'ΠΈ Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio
Travis CI Ρ€Π΅Π°Π³ΠΈΡ€Π° Π½Π° ΠΊΠΎΠ΄ΠΎΠ²Π΅Ρ‚Π΅ Π·Π° Π²Ρ€ΡŠΡ‰Π°Π½Π΅, Π·Π°Ρ‚ΠΎΠ²Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅Ρ‚ΠΎ Π½Π° прСдупрСТдСния Ρ‰Π΅ Π½Π°ΠΊΠ°Ρ€Π° услугата Π΄Π° ΠΌΠ°Ρ€ΠΊΠΈΡ€Π° ΠΊΠΎΠΌΠΈΡ‚Π° ΠΊΠ°Ρ‚ΠΎ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰ Π³Ρ€Π΅ΡˆΠΊΠΈ.

А сСга Π΄Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎ-ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Ρ‚ΠΎΠ·ΠΈ Ρ€Π΅Π΄ ΠΊΠΎΠ΄:

git diff --name-only origin/HEAD > .pvs-pr.list

Π‘Ρ‚Π°Π²Π° Π²ΡŠΠΏΡ€ΠΎΡ Π·Π° Ρ‚ΠΎΠ²Π°, Ρ‡Π΅ Travis CI Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° сливанС Π½Π° ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° pull request:

Анализ Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈ ΠΈ pull request'ΠΈ Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio
Π—Π°Ρ‚ΠΎΠ²Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ A4, Π° Π½Π΅ B3->A3. ΠŸΠΎΡ€Π°Π΄ΠΈ Ρ‚Π°Π·ΠΈ особСност трябва Π΄Π° изчислявамС Ρ€Π°Π·Π»ΠΈΠΊΠ°Ρ‚Π° с А3, ΠΊΠΎΠ΅Ρ‚ΠΎ Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ Π΅ Π²ΡŠΡ€Ρ…ΡŠΡ‚ Π½Π° ΠΊΠ»ΠΎΠ½Π° ΠΎΡ‚ origin.

ΠžΡΡ‚Π°Π½Π° Π΅Π΄ΠΈΠ½ Π²Π°ΠΆΠ΅Π½ Π΄Π΅Ρ‚Π°ΠΉΠ» β€” ΠΊΠ΅ΡˆΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° зависимоститС Π½Π° Π·Π°Π³Π»Π°Π²Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΎΡ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½ΠΈΡ‚Π΅ Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ Π½Π° транслацията (*.c, *.cc, *.cpp ΠΈ Ρ‚.Π½.). Π’Π΅Π·ΠΈ зависимости Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΡŠΡ‚ изчислява ΠΏΡ€ΠΈ ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΎΡ‚ΠΎ стартиранС Π² Ρ€Π΅ΠΆΠΈΠΌ Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° списъка с Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΈ слСд Ρ‚ΠΎΠ²Π° Π³ΠΈ ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° Π² дирСкторията .PVS-Studio. Travis CI позволява ΠΊΠ΅ΡˆΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΠ°ΠΏΠΊΠΈ, Π·Π°Ρ‚ΠΎΠ²Π° Ρ‰Π΅ Π·Π°ΠΏΠ°Π·ΠΈΠΌ Π΄Π°Π½Π½ΠΈΡ‚Π΅ ΠΎΡ‚ дирСкторията .PVS-Studio/:

cache:
  directories:
    - .PVS-Studio/

Π’ΠΎΠ·ΠΈ ΠΊΠΎΠ΄ трябва Π΄Π° сС Π΄ΠΎΠ±Π°Π²ΠΈ Π² Ρ„Π°ΠΉΠ»Π° .travis.yml. Π’Π°Π·ΠΈ дирСктория ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π΄Π°Π½Π½ΠΈ, ΡΡŠΠ±Ρ€Π°Π½ΠΈ слСд Π°Π½Π°Π»ΠΈΠ·Π°, ΠΊΠΎΠΈΡ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ускоряват послСдващитС стартирания Π½Π° Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° файловия списък ΠΈΠ»ΠΈ инкрСмСнталния Π°Π½Π°Π»ΠΈΠ·. Ако Ρ‚ΠΎΠ²Π° Π½Π΅ сС Π½Π°ΠΏΡ€Π°Π²ΠΈ, Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΡŠΡ‚ Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ Ρ‰Π΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π° всички Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ всСки ΠΏΡŠΡ‚.

Buddy

ΠšΠ°ΠΊΡ‚ΠΎ Travis CI, Buddy ΠΏΡ€Π΅Π΄Π»Π°Π³Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°Π½ΠΎ ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ ΠΈ тСстванС Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ сС ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Ρ‚ Π² GitHub. Π—Π° Ρ€Π°Π·Π»ΠΈΠΊΠ° ΠΎΡ‚ Travis CI, Ρ‚ΠΎΠΉ сС настройва Π² ΡƒΠ΅Π± интСрфСйс (ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° сС bash), ΠΏΠΎΡ€Π°Π΄ΠΈ ΠΊΠΎΠ΅Ρ‚ΠΎ няма Π½ΡƒΠΆΠ΄Π° Π΄Π° сС ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Ρ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ с конфигурация Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

ΠŸΡŠΡ€Π²ΠΎ, трябва Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π½ΠΎΠ²ΠΎ дСйствиС Π² линията Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅:

Анализ Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈ ΠΈ pull request'ΠΈ Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio
Π©Π΅ посочим ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€Π°, ΠΊΠΎΠΉΡ‚ΠΎ Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. ΠžΠ±ΡŠΡ€Π½Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° docker ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, ΠΊΠΎΠΉΡ‚ΠΎ Π΅ инсталиран Π² Ρ‚ΠΎΠ²Π° дСйствиС. НапримСр, Π·Π° GCC ΠΈΠΌΠ° спСциалСн ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€:

Анализ Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈ ΠΈ pull request'ΠΈ Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio
Π‘Π΅Π³Π° Ρ‰Π΅ инсталирамС PVS-Studio ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈΡ‚Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΈ:

Анализ Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈ ΠΈ pull request'ΠΈ Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° 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, Ρ‚ΠΎ Ρ‚ΠΎΠ·ΠΈ ΠΊΠΎΠ΄ Π²Π΅Ρ‡Π΅ Π΅ ΠΏΠΎΠ·Π½Π°Ρ‚ Π·Π° вас, ΠΎΠ±Π°Ρ‡Π΅ сСга Π΅ Π½Π°Π»ΠΈΡ†Π΅ Π½ΠΎΠ² Π΅Ρ‚Π°ΠΏ:

Анализ Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈ ΠΈ pull request'ΠΈ Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio
Π Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π΅ Ρ‚Π°ΠΌ, Ρ‡Π΅ сСга Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ Π½Π΅ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚Π° ΠΎΡ‚ сливанСто, Π° HEAD Π½Π° ΠΊΠ»ΠΎΠ½Π°, ΠΎΡ‚ ΠΊΠΎΠΉΡ‚ΠΎ сС ΠΏΡ€Π°Π²ΠΈ pull request:

Анализ Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈ ΠΈ pull request'ΠΈ Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio
Π—Π°Ρ‚ΠΎΠ²Π° сС Π½Π°ΠΌΠΈΡ€Π°ΠΌΠ΅ Π² условСн ΠΊΠΎΠΌΠΈΡ‚ 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:

Анализ Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈ ΠΈ pull request'ΠΈ Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio
Π—Π° Ρ€Π°Π·Π»ΠΈΠΊΠ° ΠΎΡ‚ Travis CI, няма Π½ΡƒΠΆΠ΄Π° Π΄Π° ΡƒΠΊΠ°Π·Π²Π°ΠΌΠ΅ .pvs-studio Π·Π° ΠΊΠ΅ΡˆΠΈΡ€Π°Π½Π΅, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Buddy Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ ΠΊΠ΅ΡˆΠΈΡ€Π° всички Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π·Π° слСдващи стартирания. ΠžΡΡ‚Π°Π²Π° само послСдното β€” Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈΠΌ потрСбитСлското ΠΈΠΌΠ΅ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»Π°Ρ‚Π° Π·Π° PVS-Studio Π² Buddy. Π‘Π»Π΅Π΄ Π·Π°ΠΏΠ°Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Ρ‰Π΅ сС Π²ΡŠΡ€Π½Π΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² Pipeline. Врябва Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌ към настройкитС Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅ ΠΈ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ потрСбитСлското ΠΈΠΌΠ΅ ΠΈ ΠΊΠ»ΡŽΡ‡Π° Π·Π° PVS-Studio:

Анализ Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈ ΠΈ pull request'ΠΈ Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio
Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° появата Π½Π° Π½ΠΎΠ² pull request ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΈΡ‚Π° Ρ‰Π΅ задСйства ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°Ρ‚Π°. Ако ΠΊΠΎΠΌΠΈΡ‚ΡŠΡ‚ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Π³Ρ€Π΅ΡˆΠΊΠΈ, Buddy Ρ‰Π΅ посочи Ρ‚ΠΎΠ²Π° Π½Π° страницата Π½Π° pull request:

AppVeyor

Настройката Π½Π° AppVeyor Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π½Π° Π½Π° Ρ‚Π°Π·ΠΈ Π½Π° Buddy, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ всичко сС случва Π² ΡƒΠ΅Π± интСрфСйса ΠΈ няма Π½ΡƒΠΆΠ΄Π° Π΄Π° добавямС Ρ„Π°ΠΉΠ» *.yml Π² рСпозитория Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

НСка ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌ към Ρ‚Π°Π±Π° Settings Π² ΠΏΡ€Π΅Π³Π»Π΅Π΄Π° Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

Анализ Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈ ΠΈ pull request'ΠΈ Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio
Π©Π΅ скролнСм страницата Π½Π°Π΄ΠΎΠ»Ρƒ ΠΈ Ρ‰Π΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠΌ Π·Π°ΠΏΠ°Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° кСша Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° pull request:

Анализ Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈ ΠΈ pull request'ΠΈ Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio
Π‘Π΅Π³Π° Ρ‰Π΅ ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌ към Ρ‚Π°Π±Π° Environment, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ Ρ‰Π΅ ΡƒΠΊΠ°ΠΆΠ΅ΠΌ ΠΎΠ±Ρ€Π°Π·Π° Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° срСдата:

Анализ Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈ ΠΈ pull request'ΠΈ Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio
Ако стС ΠΏΡ€ΠΎΡ‡Π΅Π»ΠΈ ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡ‚Π΅ Ρ€Π°Π·Π΄Π΅Π»ΠΈ, Π΄ΠΎΠ±Ρ€Π΅ Π·Π½Π°Π΅Ρ‚Π΅ Π·Π° Ρ‚Π΅Π·ΠΈ Π΄Π²Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ β€” PVS_KEY ΠΈ PVS_USERNAME. Ако Π½Π΅, Ρ‰Π΅ напомня, Ρ‡Π΅ Ρ‚Π΅ са Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π»ΠΈΡ†Π΅Π½Π·Π° Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° PVS-Studio. По-късно ΠΎΡ‚Π½ΠΎΠ²ΠΎ Ρ‰Π΅ сС срСщнСм с тях Π² Bash скриптовСтС.

На ΡΡŠΡ‰Π°Ρ‚Π° страница Π΄ΠΎΠ»Ρƒ Ρ‰Π΅ ΡƒΠΊΠ°ΠΆΠ΅ΠΌ ΠΏΠ°ΠΏΠΊΠ°Ρ‚Π° Π·Π° ΠΊΠ΅ΡˆΠΈΡ€Π°Π½Π΅:

Анализ Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈ ΠΈ pull request'ΠΈ Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio
Ако Π½Π΅ Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ Ρ‚ΠΎΠ²Π°, Ρ‰Π΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ вмСсто няколко Ρ„Π°ΠΉΠ»Π° цСлия ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π½ΠΎ ΠΈΠ·Π²ΠΎΠ΄Π° Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅. Π—Π°Ρ‚ΠΎΠ²Π° Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° въвСдСм ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎΡ‚ΠΎ ΠΈΠΌΠ΅ Π½Π° дирСкторията.

Π‘Π΅Π³Π° Π΅ Π²Ρ€Π΅ΠΌΠ΅ Π·Π° скрипта Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°. НСка ΠΎΡ‚Π²ΠΎΡ€ΠΈΠΌ Ρ‚Π°Π±Π° Tests ΠΈ Π΄Π° ΠΈΠ·Π±Π΅Ρ€Π΅ΠΌ Script:

Анализ Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈ ΠΈ pull request'ΠΈ Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio
Π’ Ρ‚Π°Π·ΠΈ Ρ„ΠΎΡ€ΠΌΠ° трябва Π΄Π° поставитС слСдния ΠΊΠΎΠ΄:

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'ΠΈ Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio
Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ слСдния Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚:

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-ΠΈ Π½Π° услуга Π·Π° Π½Π΅ΠΏΡ€Π΅ΠΊΡŠΡΠ½Π°Ρ‚Π° интСграция, която Π½Π΅ Π±Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°Π½Π° ΠΏΠΎ-Π³ΠΎΡ€Π΅, ΠΏΡŠΡ€Π²ΠΎ сС ΡƒΠ²Π΅Ρ€Π΅Ρ‚Π΅, Ρ‡Π΅ няматС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ с ΠΊΠ΅ΡˆΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ.

Благодаря Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅Ρ‚ΠΎ. Ако Π½Π΅Ρ‰ΠΎ Π½Π΅ сС ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°, смСло ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π½ΠΈ Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°. НиС Ρ‰Π΅ Π²ΠΈ насочим ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ΠΌ.

Анализ Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈ ΠΈ pull request'ΠΈ Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio

Ако искатС Π΄Π° сподСлитС Ρ‚Π°Π·ΠΈ статия с англоговоряща аудитория, моля, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ Π»ΠΈΠ½ΠΊΠ° към ΠΏΡ€Π΅Π²ΠΎΠ΄Π°: Maxim Zvyagintsev. Анализ Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈ ΠΈ pull requests Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio.

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

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster