Анализ Π½Π° Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ‚ΠΈ ΠΈ заявки Π·Π° изтСглянС Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio

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

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

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

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

Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ°, Ρ€Π΅ΠΆΠΈΠΌΡŠΡ‚ Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° списъка с Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π°Π΅Π΄Π½ΠΎ с Π΄Π½Π΅Π²Π½ΠΈΠΊΠ° Π½Π° трасиранС Π½Π° strace Π½Π° стартирания Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€Π° (прослСдяванС Π½Π° pvs-studio-analyzer). Π—Π° Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Ρ‚ΠΎΠ²Π°, Ρ‰Π΅ трябва ΠΏΡŠΡ€Π²ΠΎ Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈΡ‚Π΅ пълно ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ Π΄Π° Π³ΠΎ прослСдитС, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΡŠΡ‚ Π΄Π° ΡΡŠΠ±Π΅Ρ€Π΅ пълна информация Π·Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅ Π½Π° компилация Π½Π° всички провСрявани Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅.

Π’Π°Π·ΠΈ опция ΠΎΠ±Π°Ρ‡Π΅ ΠΈΠΌΠ° Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π΅Π½ Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΠΊ - ΠΈΠ»ΠΈ Ρ‰Π΅ трябва Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Ρ‚Π΅ пълно трасиранС Π½Π° компилация Π½Π° цСлия ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ всСки ΠΏΡŠΡ‚, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π³ΠΎ стартиратС, ΠΊΠΎΠ΅Ρ‚ΠΎ само ΠΏΠΎ сСбС си ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈ Π½Π° идСята Π·Π° Π±ΡŠΡ€Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ‚. Или, Π°ΠΊΠΎ ΠΊΠ΅ΡˆΠΈΡ€Π°Ρ‚Π΅ самия Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ ΠΎΡ‚ прослСдяванСто, послСдващитС изпълнСния Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΌΠΎΠΆΠ΅ Π΄Π° са нСпълни, Π°ΠΊΠΎ структурата Π½Π° зависимостта Π½Π° ΠΈΠ·Ρ…ΠΎΠ΄Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ сС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ слСд прослСдяванСто (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ към Π΅Π΄ΠΈΠ½ ΠΎΡ‚ ΠΈΠ·Ρ…ΠΎΠ΄Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ сС добавя Π½ΠΎΠ² #include).

ΠŸΠΎΡ€Π°Π΄ΠΈ Ρ‚ΠΎΠ²Π° Π½Π΅ ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π°ΠΌΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Ρ€Π΅ΠΆΠΈΠΌΠ° Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° списъка с Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ с ΠΆΡƒΡ€Π½Π°Π»Π° Π·Π° прослСдяванС, Π·Π° Π΄Π° провСряватС Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ‚ΠΈ ΠΈΠ»ΠΈ заявки Π·Π° изтСглянС. Π’ случай, Ρ‡Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»Π½ΠΎ ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ‚, помислСтС Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ€Π΅ΠΆΠΈΠΌΠ° ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»Π΅Π½ Π°Π½Π°Π»ΠΈΠ·.

Π‘ΠΏΠΈΡΡŠΠΊΡŠΡ‚ с ΠΈΠ·Ρ…ΠΎΠ΄Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π·Π° Π°Π½Π°Π»ΠΈΠ· сС записва Π² тСкстов Ρ„Π°ΠΉΠ» ΠΈ сС ΠΏΡ€Π΅Π΄Π°Π²Π° Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€Π° -S:

pvs-studio-analyzer analyze ... -f build/compile_commands.json -S check-list.txt

Π’ΠΎΠ·ΠΈ Ρ„Π°ΠΉΠ» опрСдСля относитСлни ΠΈΠ»ΠΈ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΈ ΠΏΡŠΡ‚ΠΈΡ‰Π° към Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅ ΠΈ всСки Π½ΠΎΠ² Ρ„Π°ΠΉΠ» трябва Π΄Π° бъдС Π½Π° Π½ΠΎΠ² Ρ€Π΅Π΄. ΠŸΡ€ΠΈΠ΅ΠΌΠ»ΠΈΠ²ΠΎ Π΅ Π΄Π° посочитС Π½Π΅ само ΠΈΠΌΠ΅Π½Π° Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π·Π° Π°Π½Π°Π»ΠΈΠ·, Π½ΠΎ ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½ тСкст. ΠΠ½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΡŠΡ‚ Ρ‰Π΅ Π²ΠΈΠ΄ΠΈ, Ρ‡Π΅ Ρ‚ΠΎΠ²Π° Π½Π΅ Π΅ Ρ„Π°ΠΉΠ» ΠΈ Ρ‰Π΅ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€Π° Ρ€Π΅Π΄Π°. Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π·Π° ΠΊΠΎΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π½Π΅, Π°ΠΊΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅ са посочСни Ρ€ΡŠΡ‡Π½ΠΎ. ЧСсто ΠΎΠ±Π°Ρ‡Π΅ списък с Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Ρ‰Π΅ бъдС Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ· Π² CI, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ²Π° ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΎΡ‚ заявка Π·Π° Π°Π½Π³Π°ΠΆΠΈΡ€Π°Π½Π΅ ΠΈΠ»ΠΈ изтСглянС.

Π‘Π΅Π³Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Ρ‚ΠΎΠ·ΠΈ Ρ€Π΅ΠΆΠΈΠΌ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π±ΡŠΡ€Π·ΠΎ Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅ новия ΠΊΠΎΠ΄, ΠΏΡ€Π΅Π΄ΠΈ Π΄Π° ΠΏΠΎΠΏΠ°Π΄Π½Π΅ Π² основния ΠΊΠ»ΠΎΠ½ Π·Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°. Π—Π° Π΄Π° сС Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π°, Ρ‡Π΅ систСмата Π·Π° сканиранС Ρ€Π΅Π°Π³ΠΈΡ€Π° Π½Π° прСдупрСТдСнията Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, ΠΏΠΎΠΌΠΎΡ‰Π½Π°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° plog-ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΎΡ€ Π΄ΠΎΠ±Π°Π²Π΅Π½ Ρ„Π»Π°Π³ --indicate-warnings:

plog-converter ... --indicate-warnings ... -o /path/to/report.tasks ...

Π‘ Ρ‚ΠΎΠ·ΠΈ Ρ„Π»Π°Π³ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΎΡ€ΡŠΡ‚ Ρ‰Π΅ Π²ΡŠΡ€Π½Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½ ΠΎΡ‚ Π½ΡƒΠ»Π° ΠΊΠΎΠ΄, Π°ΠΊΠΎ ΠΈΠΌΠ° прСдупрСТдСния Π² ΠΎΡ‚Ρ‡Π΅Ρ‚Π° Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°. Π‘ ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΊΠΎΠ΄Π° Π·Π° Π²Ρ€ΡŠΡ‰Π°Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π±Π»ΠΎΠΊΠΈΡ€Π°Ρ‚Π΅ ΠΊΡƒΠΊΠ° Π·Π° ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΏΠΎΠ΄Π°Π²Π°Π½Π΅, ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅ ΠΈΠ»ΠΈ изтСглянС, Π° гСнСрираният ΠΎΡ‚Ρ‡Π΅Ρ‚ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΠΎΠΊΠ°Π·Π°Π½, сподСлСн ΠΈΠ»ΠΈ ΠΈΠ·ΠΏΡ€Π°Ρ‚Π΅Π½ ΠΏΠΎ ΠΈΠΌΠ΅ΠΉΠ».

Π—Π°Π±Π΅Π»Π΅ΠΆΠΊΠ°. ΠšΠΎΠ³Π°Ρ‚ΠΎ Π·Π° ΠΏΡŠΡ€Π²ΠΈ ΠΏΡŠΡ‚ Π·Π°ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚Π΅ списък с Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, цСлият ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Ρ‰Π΅ бъдС Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½, Π·Π°Ρ‰ΠΎΡ‚ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΡŠΡ‚ трябва Π΄Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° Ρ„Π°ΠΉΠ» със зависимости Π½Π° ΠΈΠ·Ρ…ΠΎΠ΄Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΎΡ‚ Π·Π°Π³Π»Π°Π²Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅. Π’ΠΎΠ²Π° Π΅ функция Π·Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° C ΠΈ C++ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅. Π’ Π±ΡŠΠ΄Π΅Ρ‰Π΅ Ρ„Π°ΠΉΠ»ΡŠΡ‚ Π½Π° зависимостта ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΊΠ΅ΡˆΠΈΡ€Π°Π½ ΠΈ Ρ‰Π΅ сС Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ ΠΎΡ‚ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°. ΠŸΡ€Π΅Π΄ΠΈΠΌΡΡ‚Π²ΠΎΡ‚ΠΎ Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°Ρ‚Π° Π½Π° Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Ρ€Π΅ΠΆΠΈΠΌ Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° списък с Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΏΡ€Π΅Π΄ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ€Π΅ΠΆΠΈΠΌ Π½Π° ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»Π΅Π½ Π°Π½Π°Π»ΠΈΠ· Π΅, Ρ‡Π΅ трябва Π΄Π° ΠΊΠ΅ΡˆΠΈΡ€Π°Ρ‚Π΅ само Ρ‚ΠΎΠ·ΠΈ Ρ„Π°ΠΉΠ», Π° Π½Π΅ ΠΎΠ±Π΅ΠΊΡ‚Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅.

ΠžΠ±Ρ‰ΠΈ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° заявка Π·Π° изтСглянС

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

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

Анализ Π½Π° Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ‚ΠΈ ΠΈ заявки Π·Π° изтСглянС Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio

НСка си прСдставим Ρ‚ΠΎΠ·ΠΈ Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ‚ A1 ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° доста голямо количСство ΠΊΠΎΠ΄, ΠΊΠΎΠΉΡ‚ΠΎ Π²Π΅Ρ‡Π΅ Π΅ тСстван. Малко ΠΏΠΎ-Ρ€Π°Π½ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ…ΠΌΠ΅ ΠΊΠ»ΠΎΠ½ ΠΎΡ‚ ΠΊΠΎΠΌΠΈΡ‚Π° A1 ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ някои Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅.

Π’ΠΈΠ΅, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, забСлязахтС Ρ‚ΠΎΠ²Π° слСд Ρ‚ΠΎΠ²Π° A1 Π²ΡŠΠ·Π½ΠΈΠΊΠ½Π°Ρ…Π° ΠΎΡ‰Π΅ Π΄Π²Π° Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ‚Π°, Π½ΠΎ Ρ‚ΠΎΠ²Π° ΡΡŠΡ‰ΠΎ бяха сливания Π½Π° Π΄Ρ€ΡƒΠ³ΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅, Π·Π°Ρ‰ΠΎΡ‚ΠΎ Π½ΠΈΠ΅ Π½Π΅ сС Π°Π½Π³Π°ΠΆΠΈΡ€Π°ΠΌΠ΅ с майстор. И сСга Π΄ΠΎΠΉΠ΄Π΅ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ корСкция Π³ΠΎΡ‚ΠΎΠ². Π—Π°Ρ‚ΠΎΠ²Π° сС появи ΠΏΡƒΠ» заявка Π·Π° сливанСто 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-ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΎΡ€ Ρ‰Π΅ сС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π½Π° 2, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΎΡ‚ своя страна Ρ‰Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€Π° CI услугата Π·Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»Π½ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ във Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅ Π·Π° заявка Π·Π° изтСглянС.

Вравис CI

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

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

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 ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° Π½ΠΎΠΌΠ΅Ρ€Π° Π½Π° заявката Π·Π° изтСглянС ΠΈΠ»ΠΈ Ρ„Π°Π»ΡˆΠΈΠ², Π°ΠΊΠΎ Ρ‚ΠΎΠ²Π° Π΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ ΠΊΠ»ΠΎΠ½;
  • $TRAVIS_REPO_SLUG ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

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

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

Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎ-ΠΎΡ‚Π±Π»ΠΈΠ·ΠΎ Ρ‚ΠΎΠ·ΠΈ Ρ€Π΅Π΄ ΠΊΠΎΠ΄:

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

Π€Π°ΠΊΡ‚ Π΅, Ρ‡Π΅ Travis CI Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ обСдинява ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π° заявка Π·Π° изтСглянС:

Анализ Π½Π° Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ‚ΠΈ ΠΈ заявки Π·Π° изтСглянС Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio
Π—Π°Ρ‚ΠΎΠ²Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ A4И Π½Π΅ B3->A3. ΠŸΠΎΡ€Π°Π΄ΠΈ Ρ‚Π°Π·ΠΈ характСристика трябва Π΄Π° изчислим Ρ€Π°Π·Π»ΠΈΠΊΠ°Ρ‚Π° с A3, ΠΊΠΎΠ΅Ρ‚ΠΎ Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ Π²ΡŠΡ€Ρ…Π° Π½Π° ΠΊΠ»ΠΎΠ½Π° ΠΎΡ‚ ΠΏΡ€ΠΎΠΈΠ·Ρ…ΠΎΠ΄.

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

cache:
  directories:
    - .PVS-Studio/

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

ΠŸΡ€ΠΈΡΡ‚Π΅Π»ΡŽ

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

На ΠΏΡŠΡ€Π²ΠΎ място, трябва Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π½ΠΎΠ²ΠΎ дСйствиС към ΠΏΠΎΡ‚ΠΎΡ‡Π½Π°Ρ‚Π° линия:

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

Анализ Π½Π° Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ‚ΠΈ ΠΈ заявки Π·Π° изтСглянС Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio
Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° инсталирамС PVS-Studio ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈΡ‚Π΅ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ:

Анализ Π½Π° Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ‚ΠΈ ΠΈ заявки Π·Π° изтСглянС Π² 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, Ρ‚ΠΎΠ³Π°Π²Π° Ρ‚ΠΎΠ·ΠΈ ΠΊΠΎΠ΄ Π²Π΅Ρ‡Π΅ Π²ΠΈ Π΅ ΠΏΠΎΠ·Π½Π°Ρ‚, Π½ΠΎ сСга ΠΈΠΌΠ° Π½ΠΎΠ² Π΅Ρ‚Π°ΠΏ:

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

Анализ Π½Π° Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ‚ΠΈ ΠΈ заявки Π·Π° изтСглянС Π² 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 β€” Π½ΠΎΠΌΠ΅Ρ€ Π½Π° заявка Π·Π° изтСглянС;
  • $BUDDY_REPO_SLUG β€” комбинация ΠΎΡ‚ потрСбитСлско ΠΈΠΌΠ΅ ΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ max/test).

Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° Π·Π°ΠΏΠ°Π·ΠΈΠΌ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅, ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π±ΡƒΡ‚ΠΎΠ½Π° ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ ΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°ΠΌΠ΅ Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° заявката Π·Π° изтСглянС:

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

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

AppVeyor

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

НСка ΠΎΡ‚ΠΈΠ΄Π΅ΠΌ Π² Ρ€Π°Π·Π΄Π΅Π»Π° Настройки Π² ΠΏΡ€Π΅Π³Π»Π΅Π΄Π° Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

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

Анализ Π½Π° Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ‚ΠΈ ΠΈ заявки Π·Π° изтСглянС Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio
Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° ΠΎΡ‚ΠΈΠ΄Π΅ΠΌ Π² Ρ€Π°Π·Π΄Π΅Π»Π° Околна срСда, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ посочвамС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π·Π° сглобяванС ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° срСдата:

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

На ΡΡŠΡ‰Π°Ρ‚Π° страница ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ посочвамС ΠΏΠ°ΠΏΠΊΠ°Ρ‚Π° Π·Π° ΠΊΠ΅ΡˆΠΈΡ€Π°Π½Π΅:

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

Π‘Π΅Π³Π° Π΅ Π²Ρ€Π΅ΠΌΠ΅ Π·Π° тСстванС Π½Π° скрипта. ΠžΡ‚Π²ΠΎΡ€Π΅Ρ‚Π΅ Ρ€Π°Π·Π΄Π΅Π»Π° ВСстовС ΠΈ ΠΈΠ·Π±Π΅Ρ€Π΅Ρ‚Π΅ Π‘ΠΊΡ€ΠΈΠΏΡ‚:

Анализ Π½Π° Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ‚ΠΈ ΠΈ заявки Π·Π° изтСглянС Π² 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 ΠΌΠ°Π»ΠΊΠΎ лъТС. ΠŸΠΎΡ€Π°Π΄ΠΈ Ρ‚Π°Π·ΠΈ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Ρ… Ρ€ΡŠΡ‡Π½ΠΎ стойността ΠΌΡƒ, ΠΏΡ€Π΅Π΄ΠΈ Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°.

И Ρ‚ΠΎΠ³Π°Π²Π° всичко Π΅ ΠΊΠ°ΠΊΡ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΈ:

Анализ Π½Π° Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ‚ΠΈ ΠΈ заявки Π·Π° изтСглянС Π² 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"`

Π’ Π½Π΅Π³ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ Ρ€Π°Π·Π»ΠΈΠΊΠ°Ρ‚Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅Ρ‚Π΅, Π½Π°Π΄ ΠΊΠΎΠΈΡ‚ΠΎ Π΅ Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π°Π½Π° заявката Π·Π° изтСглянС. Π—Π° Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ Ρ‚ΠΎΠ²Π°, ΠΈΠΌΠ°ΠΌΠ΅ Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ слСднитС ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° срСдата:

  • $APPVEYOR_PULL_REQUEST_NUMBER β€” Π½ΠΎΠΌΠ΅Ρ€ Π½Π° заявка Π·Π° изтСглянС;
  • $APPVEYOR_REPO_NAME - потрСбитСлско ΠΈΠΌΠ΅ ΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π Π°Π·Π±ΠΈΡ€Π° сС, Π½Π΅ смС Ρ€Π°Π·Π³Π»Π΅Π΄Π°Π»ΠΈ всички възмоТни услуги Π·Π° Π½Π΅ΠΏΡ€Π΅ΠΊΡŠΡΠ½Π°Ρ‚Π° интСграция, Π½ΠΎ всички Ρ‚Π΅ ΠΈΠΌΠ°Ρ‚ ΠΈΠ·ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ сходни спСцифики Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° Π΅Π΄Π½Π° с Π΄Ρ€ΡƒΠ³Π°. Π‘ ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠ΅ΡˆΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ, всяка услуга ΠΏΡ€Π°Π²ΠΈ свой собствСн β€žΠ²Π΅Π»ΠΎΡΠΈΠΏΠ΅Π΄β€œ, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ всичко Π²ΠΈΠ½Π°Π³ΠΈ Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎ.

НякъдС, ΠΊΠ°Ρ‚ΠΎ Π² Travis-CI, няколко Ρ€Π΅Π΄Π° ΠΊΠΎΠ΄ ΠΈ ΠΊΠ΅ΡˆΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ работят Π±Π΅Π·ΡƒΠΏΡ€Π΅Ρ‡Π½ΠΎ; някъдС, ΠΊΠ°Ρ‚ΠΎ Π² AppVeyor, просто трябва Π΄Π° посочитС ΠΏΠ°ΠΏΠΊΠ°Ρ‚Π° Π² настройкитС; Π½ΠΎ някъдС трябва Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ ΡƒΠ½ΠΈΠΊΠ°Π»Π½ΠΈ ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅ ΠΈ Π΄Π° сС ΠΎΠΏΠΈΡ‚Π°Ρ‚Π΅ Π΄Π° ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ систСмата Π΄Π° Π²ΠΈ Π΄Π°Π΄Π΅ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π΄Π° ΠΏΡ€Π΅Π·Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΊΠ΅ΡˆΠΈΡ€Π°Π½ΠΈΡ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ, Π°ΠΊΠΎ искатС Π΄Π° настроитС Π°Π½Π°Π»ΠΈΠ· Π½Π° заявки Π·Π° изтСглянС Π½Π° услуга Π·Π° Π½Π΅ΠΏΡ€Π΅ΠΊΡŠΡΠ½Π°Ρ‚Π° интСграция, която Π½Π΅ бСшС обсъдСна ΠΏΠΎ-Π³ΠΎΡ€Π΅, ΠΏΡŠΡ€Π²ΠΎ сС ΡƒΠ²Π΅Ρ€Π΅Ρ‚Π΅, Ρ‡Π΅ няма Π΄Π° ΠΈΠΌΠ°Ρ‚Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ с ΠΊΠ΅ΡˆΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ.

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

Анализ Π½Π° Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ‚ΠΈ ΠΈ заявки Π·Π° изтСглянС Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PVS-Studio

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

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€