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

Анализ Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈ ΠΈ pull requests Π² 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 requests Π² 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

Π‘Π»Π΅Π΄ Π°Π½Π°Π»ΠΈΠ·Π° трябва Π΄Π° ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€Π°ΠΌΠ΅ Ρ„Π°ΠΉΠ»a с Π»ΠΎΠ³ΠΎΠ²Π΅Ρ‚Π΅ (PVS-Studio.log) Π² ΡƒΠ΄ΠΎΠ±Π΅Π½ Π·Π° Π²ΡŠΠ·ΠΏΡ€ΠΈΠ΅ΠΌΠ°Π½Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚:

plog-converter -t errorfile PVS-Studio.log --cerr -w

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

Но Π½ΠΈΠ΅ трябва Π½Π΅ само Π΄Π° ΠΈΠ·Π²Π΅Π΄Π΅ΠΌ Π³Ρ€Π΅ΡˆΠΊΠΈΡ‚Π΅, Π½ΠΎ ΠΈ Π΄Π° ΡƒΠ²Π΅Π΄ΠΎΠΌΠΈΠΌ нашия сСрвис Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ ΠΈ тСстванС Π·Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ. Π—Π°Ρ‚ΠΎΠ²Π° Π² ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΎΡ€Π° Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½ Ρ„Π»Π°Π³ -W (β€”indicate-warnings). ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π΄ΠΎΡ€ΠΈ Π½Π° Π΅Π΄Π½ΠΎ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎΡ‚ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, ΠΊΠΎΠ΄ΡŠΡ‚ Π·Π° Π²Ρ€ΡŠΡ‰Π°Π½Π΅ Π½Π° ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°Ρ‚Π° plog-converter Ρ‰Π΅ сС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π½Π° 2, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΎΡ‚ своя страна Ρ‰Π΅ ΡƒΠ²Π΅Π΄ΠΎΠΌΠΈ CI сСрвиса Π·Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»Π½ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ Π² Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅ Π½Π° pull request.

Travis CI

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡΡ‚Π° Π΅ ΠΈΠ·Π²ΡŠΡ€ΡˆΠ΅Π½Π° ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° Ρ„Π°ΠΉΠ» .travis.yml. Π—Π° удобство, ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π°ΠΌ всичко Π΄Π° бъдС изнСсСно Π² ΠΎΡ‚Π΄Π΅Π»Π΅Π½ bash-скрипт с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ ΠΈΠ·Π²ΠΈΠΊΠ°Π½ΠΈ ΠΎΡ‚ Ρ„Π°ΠΉΠ»Π° .travis.yml (bash ΠΈΠΌΠ΅_скрипта.sh ΠΈΠΌΠ΅_функция).

Π©Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ нСобходимия ΠΊΠΎΠ΄ Π² скрипта Π½Π° bash, ΠΏΠΎ Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½ Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΏΠΎ-голяма функционалност. Π’ сСкцията install Ρ‰Π΅ напишСм слСдното:

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 стартиранС Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°:

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-Π° ΠΈΠ»ΠΈ false, Π°ΠΊΠΎ Ρ‚ΠΎΠ²Π° Π΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½Π° ΠΊΠ»ΠΎΠ½ΠΊΠ°;
  • $TRAVIS_REPO_SLUG ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° рСпозитория Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

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

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

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

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

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

Анализ Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈ ΠΈ pull requests Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio
Π—Π°Ρ‚ΠΎΠ²Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ A4, Π° Π½Π΅ B3->A3. ΠŸΠΎΡ€Π°Π΄ΠΈ Ρ‚Π°Π·ΠΈ особСност трябва Π΄Π° изчислим Ρ€Π°Π·Π»ΠΈΠΊΠ°Ρ‚Π° с A3, ΠΊΠΎΠΉΡ‚ΠΎ Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ Π΅ Π²Ρ€ΡŠΡ… Π½Π° ΠΊΠ»ΠΎΠ½Π° ΠΎΡ‚ 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 requests Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio
Π©Π΅ ΡƒΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€Π°, ΠΊΠΎΠΉΡ‚ΠΎ Π΅ Π±ΠΈΠ» ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. ΠžΠ±ΡŠΡ€Π½Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° docker ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, ΠΊΠΎΠΉΡ‚ΠΎ Π΅ Π·Π°Π΄Π°Π΄Π΅Π½ Π² Ρ‚ΠΎΠ²Π° дСйствиС. НапримСр, Π·Π° GCC ΠΈΠΌΠ° спСциалСн ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€:

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

Анализ Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈ ΠΈ pull requests Π² 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

Ако стС Ρ‡Π΅Π»ΠΈ Ρ€Π°Π·Π΄Π΅Π»Π°, посвСтСн Π½Π° Travs-CI, Ρ‚ΠΎ Ρ‚ΠΎΠ·ΠΈ ΠΊΠΎΠ΄ Π²Π΅Ρ‡Π΅ Π΅ ΠΏΠΎΠ·Π½Π°Ρ‚, ΠΎΠ±Π°Ρ‡Π΅ сСга ΠΈΠΌΠ°ΠΌΠ΅ Π½ΠΎΠ² Π΅Ρ‚Π°ΠΏ:

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

Анализ Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈ ΠΈ pull requests Π² 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 Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ GitHub API:

https://api.github.com/repos/${USERNAME}/${REPO}/pulls/${PULL_REQUEST_ID}

Π˜Π·ΠΏΠΎΠ»Π·Π²Π°Ρ…ΠΌΠ΅ слСднитС ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, прСдоставСни ΠΎΡ‚ Buddy:

  • $BUDDY_EXECUTION_PULL_REQEUST_NO β€” Π½ΠΎΠΌΠ΅Ρ€ Π½Π° pull request-Π°;
  • $BUDDY_REPO_SLUG β€” комбинация ΠΎΡ‚ потрСбитСлско ΠΈΠΌΠ΅ ΠΈ рСпозитория (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ max/test).

Π‘Π΅Π³Π° Ρ‰Π΅ Π·Π°ΠΏΠ°Π·ΠΈΠΌ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Π±ΡƒΡ‚ΠΎΠ½Π° Π΄ΠΎΠ»Ρƒ, ΠΈ Ρ‰Π΅ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°ΠΌΠ΅ Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° pull request:

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

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

AppVeyor

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

Π©Π΅ ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌ Π½Π° Ρ‚Π°Π±Π° Settings Π² ΠΏΡ€Π΅Π³Π»Π΅Π΄Π° Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

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

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

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

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

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

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

Анализ Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈ ΠΈ pull requests Π² 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 requests Π² 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 requests Π² 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