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

Анализ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² ΠΈ pull request'ΠΎΠ² Π² Travis CI, Buddy ΠΈ AppVeyor с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ PVS-Studio
Π’ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π΅ PVS-Studio для языков Π‘ ΠΈ C++ Π½Π° Linux ΠΈ macOS, начиная с вСрсии 7.04, появилась тСстовая Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ список ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ². Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ° ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² ΠΈ pull request’ΠΎΠ². Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ рассказано, ΠΊΠ°ΠΊ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ списка ΠΈΠ·ΠΌΠ΅Π½Ρ‘Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² GitHub-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² Ρ‚Π°ΠΊΠΈΡ… популярных CI (Continuous Integration) систСмах, ΠΊΠ°ΠΊ Travis CI, Buddy ΠΈ AppVeyor.

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

PVS-Studio β€” это инструмСнт для выявлСния ошибок ΠΈ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… уязвимостСй Π² исходном ΠΊΠΎΠ΄Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, написанных Π½Π° языках Π‘, 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’Π°.

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 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

Если Π²Ρ‹ Ρ‡ΠΈΡ‚Π°Π»ΠΈ Ρ€Π°Π·Π΄Π΅Π», посвящСнный Travs-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_REQEUST_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, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ всё происходит Π² web интСрфСйсС ΠΈ Π½Π΅Ρ‚ Π½ΡƒΠΆΠ΄Ρ‹ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ» *.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. Analysis of commits and pull requests in Travis CI, Buddy and AppVeyor using PVS-Studio.

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

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ