เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเปเบฅเบฐเบ”เบถเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเปƒเบ™ Travis CI, Buddy เปเบฅเบฐ AppVeyor เป‚เบ”เบเปƒเบŠเป‰ PVS-Studio

เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเปเบฅเบฐเบ”เบถเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเปƒเบ™ Travis CI, Buddy เปเบฅเบฐ AppVeyor เป‚เบ”เบเปƒเบŠเป‰ PVS-Studio
เปƒเบ™เบ•เบปเบงเบงเบดเป€เบ„เบฒเบฐ PVS-Studio เบชเปเบฒเบฅเบฑเบšเบžเบฒเบชเบฒ C เปเบฅเบฐ C ++ เปƒเบ™ Linux เปเบฅเบฐ macOS, เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบˆเบฒเบเบฎเบธเปˆเบ™ 7.04, เบ•เบปเบงเป€เบฅเบทเบญเบเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเป„เบ”เป‰เบ›เบฒเบเบปเบ”เบ‚เบถเป‰เบ™เป€เบžเบทเปˆเบญเบเบงเบ”เป€เบšเบดเปˆเบ‡เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เป„เบŸเบฅเปŒเบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰. เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบฎเบนเบšโ€‹เปเบšเบšโ€‹เปƒเบซเบกเปˆโ€‹, เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบเปเบฒโ€‹เบ™เบปเบ”โ€‹เบ„เปˆเบฒโ€‹เป€เบ„เบทเปˆเบญเบ‡โ€‹เบงเบดโ€‹เป€เบ„เบฒเบฐโ€‹เป€เบžเบทเปˆเบญโ€‹เบเบงเบ”โ€‹เบเบฒโ€‹เป€เบšเบดเปˆเบ‡ commits เปเบฅเบฐโ€‹เบ”เบถเบ‡โ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹. เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบˆเบฐเบšเบญเบเบ—เปˆเบฒเบ™เบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เบเบงเบ”เบชเบญเบšเป„เบŸเบฅเปŒเบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™ GitHub เปƒเบ™เบฅเบฐเบšเบปเบš CI (Continuous Integration) เบ—เบตเปˆเบ™เบดเบเบปเบกเป€เบŠเบฑเปˆเบ™ Travis CI, Buddy เปเบฅเบฐ AppVeyor.

เบฎเบนเบšเปเบšเบšเบเบฒเบ™เบเบงเบ”เบชเบญเบšเบฅเบฒเบเบเบฒเบ™เป„เบŸเบฅเปŒ

PVS Studio เป€เบ›เบฑเบ™เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเปเบฒเบ™เบปเบ”เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปเบฅเบฐเบˆเบธเบ”เบญเปˆเบญเบ™เบ—เบตเปˆเบญเบฒเบ”เบกเบตเบขเบนเปˆเปƒเบ™เบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡เบ‚เบญเบ‡เบšเบฑเบ™เบ”เบฒเป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบ‚เบฝเบ™เปƒเบ™ C, C ++, C # เปเบฅเบฐ Java. เป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เบฅเบฐเบšเบปเบš 64-bit เปƒเบ™ Windows, Linux เปเบฅเบฐ macOS.

เปƒเบ™เป€เบงเบตเบŠเบฑเปˆเบ™ PVS-Studio 7.04 เบชเปเบฒเบฅเบฑเบš Linux เปเบฅเบฐ macOS, เบฎเบนเบšเปเบšเบšเบเบฒเบ™เบเบงเบ”เบชเบญเบšเบฅเบฒเบเบเบฒเบ™เป„เบŸเบฅเปŒเบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเป„เบ”เป‰เบ›เบฐเบเบปเบ”เบ‚เบถเป‰เบ™. เบ™เบตเป‰เป€เบฎเบฑเบ”เบงเบฝเบเบชเปเบฒเบฅเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบฅเบฐเบšเบปเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒ compile_commands.json. เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบˆเปเบฒเป€เบ›เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบ™เบฑเบเบงเบดเป€เบ„เบฒเบฐเป€เบžเบทเปˆเบญเบชเบฐเบเบฑเบ”เบ‚เปเป‰เบกเบนเบ™เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบฅเบงเบšเบฅเบงเบกเป„เบŸเบฅเปŒเบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰. เบ–เป‰เบฒเบฅเบฐเบšเบปเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบšเปเปˆเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒ compile_commands.json, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบžเบฐเบเบฒเบเบฒเบกเบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเป‚เบ”เบเปƒเบŠเป‰เบ›เบฐเป‚เบซเบเบ”. เบฎเบฑเบšเบœเบดเบ”เบŠเบญเบš.

เบ™เบญเบเบˆเบฒเบเบ™เบตเป‰, เบฎเบนเบšเปเบšเบšเบเบฒเบ™เบเบงเบ”เบชเบญเบšเบฅเบฒเบเบเบฒเบ™เป„เบŸเบฅเปŒเบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบฎเปˆเบงเบกเบเบฑเบ™เบเบฑเบšเบšเบฑเบ™เบ—เบถเบเบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบก strace เบ‚เบญเบ‡เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง compiler (pvs-studio-analyzer trace). เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เป‚เบ„เบ‡เบเบฒเบ™เบขเปˆเบฒเบ‡เป€เบ•เบฑเบกเบ—เบตเปˆเปเบฅเบฐเบ•เบดเบ”เบ•เบฒเบกเบกเบฑเบ™เป€เบžเบทเปˆเบญเปƒเบซเป‰เบœเบนเป‰เบงเบดเป€เบ„เบฒเบฐเป€เบเบฑเบšเบเปเบฒเบ‚เปเป‰เบกเบนเบ™เบ„เบปเบšเบ–เป‰เบงเบ™เบชเบปเบกเบšเบนเบ™เบเปˆเบฝเบงเบเบฑเบšเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบฅเบงเบšเบฅเบงเบกเบ‚เบญเบ‡เป„เบŸเบฅเปŒเบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบ–เบทเบเบเบงเบ”เบชเบญเบš.

เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ™เบตเป‰เบกเบตเบ‚เปเป‰เบšเบปเบเบœเปˆเบญเบ‡เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™ - เบ—เปˆเบฒเบ™เบเปเปˆเบˆเบฐเบ•เป‰เบญเบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบธเบเบ„เบฑเป‰เบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™, เป€เบŠเบดเปˆเบ‡เปƒเบ™เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เบเบปเบ‡เบเบฑเบ™เบ‚เป‰เบฒเบกเบเบฑเบšเบ„เบงเบฒเบกเบ„เบดเบ”เบ‚เบญเบ‡เบเบฒเบ™เบเบงเบ”เบชเบญเบšเป„เบง. เบซเบผเบท, เบ–เป‰เบฒเบ—เปˆเบฒเบ™ cache เบœเบปเบ™ trace เบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡, เบเบฒเบ™เปเบฅเปˆเบ™เบ•เปเปˆเป„เบ›เบ‚เบญเบ‡เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบญเบฒเบ”เบˆเบฐเบšเปเปˆเบ„เบปเบšเบ–เป‰เบงเบ™เบชเบปเบกเบšเบนเบ™เบ–เป‰เบฒเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบเบฒเบ™เป€เบžเบดเปˆเบ‡เบžเบฒเบญเบฒเป„เบชเบ‚เบญเบ‡เป„เบŸเบฅเปŒเปเบซเบผเปˆเบ‡เบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบก (เบ•เบปเบงเบขเปˆเบฒเบ‡, #include เปƒเบซเบกเปˆเบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเบซเบ™เบถเปˆเบ‡เปƒเบ™เป„เบŸเบฅเปŒเปเบซเบผเปˆเบ‡).

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เปƒเบŠเป‰เป‚เบซเบกเบ”เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบฅเบฒเบเบเบฒเบ™เป„เบŸเบฅเปŒเบ—เบตเปˆเบกเบตเบšเบฑเบ™เบ—เบถเบเบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเป€เบžเบทเปˆเบญเบเบงเบ”เป€เบšเบดเปˆเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบซเบผเบทเบ”เบถเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป. เปƒเบ™โ€‹เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹เบ—เบตเปˆโ€‹เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เป€เบฎเบฑเบ”โ€‹เป„เบ”เป‰ incremental build เปƒเบ™โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ—เบตเปˆโ€‹เบเบฒเบ™โ€‹เบเบงเบ”โ€‹เบชเบญเบšโ€‹เบ„เปเบฒโ€‹เบซเบกเบฑเป‰เบ™โ€‹เบชเบฑเบ™โ€‹เบเบฒโ€‹, เบžเบดโ€‹เบˆเบฒโ€‹เบฅเบฐโ€‹เบ™เบฒโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบฎเบนเบšโ€‹เปเบšเบšโ€‹เบเบฒเบ™โ€‹ เบเบฒเบ™โ€‹เบงเบดโ€‹เป€เบ„เบฒเบฐโ€‹เป€เบžเบตเปˆเบกโ€‹เป€เบ•เบตเบกโ€‹.

เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เป„เบŸเบฅเปŒเปเบซเบผเปˆเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเปเบกเปˆเบ™เบ–เบทเบเบšเบฑเบ™เบ—เบถเบเป„เบงเป‰เปƒเบ™เป„เบŸเบฅเปŒเบ‚เปเป‰เบ„เบงเบฒเบกเปเบฅเบฐเบ–เบทเบเบชเบปเปˆเบ‡เป„เบ›เบซเบฒเบœเบนเป‰เบงเบดเป€เบ„เบฒเบฐเป‚เบ”เบเปƒเบŠเป‰เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต -S:

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

เป„เบŸเบฅเปŒเบ™เบตเป‰เบฅเบฐเบšเบธเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡ เบซเบผเบทเบขเปˆเบฒเบ‡เปเบ—เป‰เบˆเบดเบ‡เป„เบ›เบซเบฒเป„เบŸเบฅเปŒ, เปเบฅเบฐเปเบ•เปˆเบฅเบฐเป„เบŸเบฅเปŒเปƒเปเปˆเบˆเบฐเบ•เป‰เบญเบ‡เบขเบนเปˆเปƒเบ™เปเบ–เบงเปƒเปเปˆ. เบกเบฑเบ™เป€เบ›เบฑเบ™เบ—เบตเปˆเบเบญเบกเบฎเบฑเบšเบ—เบตเปˆเบˆเบฐเบฅเบฐเบšเบธเบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเบŠเบทเปˆเป„เบŸเบฅเปŒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ, เปเบ•เปˆเบเบฑเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบ•เปˆเบฒเบ‡เป†. เบ™เบฑเบเบงเบดเป€เบ„เบฒเบฐเบˆเบฐเป€เบซเบฑเบ™เบงเปˆเบฒเบ™เบตเป‰เบšเปเปˆเปเบกเปˆเบ™เป„เบŸเบฅเปŒเปเบฅเบฐเบˆเบฐเบšเปเปˆเบชเบปเบ™เปƒเบˆเบชเบฒเบ. เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบฐเปเบ”เบ‡เบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™เบ–เป‰เบฒเป„เบŸเบฅเปŒเบ–เบทเบเบฅเบฐเบšเบธเบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เป€เบฅเบทเป‰เบญเบเป†เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เป„เบŸเบฅเปŒเบˆเบฐเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเปƒเบ™ CI, เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡, เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เป„เบŸเบฅเปŒเบ—เบตเปˆเบกเบฒเบˆเบฒเบเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบซเบผเบทเบ”เบถเบ‡.

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบฎเบนเบšเปเบšเบšเบ™เบตเป‰, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเบงเบ”เบชเบญเบšเบฅเบฐเบซเบฑเบ”เปƒเบซเบกเปˆเบขเปˆเบฒเบ‡เป„เบงเบงเบฒเบเปˆเบญเบ™เบ—เบตเปˆเบกเบฑเบ™เบˆเบฐเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบชเบฒเบ‚เบฒเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบ•เบปเป‰เบ™เบ•เป. เป€เบžเบทเปˆเบญเบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบงเปˆเบฒเบฅเบฐเบšเบปเบšเบเบฒเบ™เบชเบฐเปเบเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบ•เปเปˆเบเบฒเบ™เป€เบ•เบทเบญเบ™เบ‚เบญเบ‡เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ, เบœเบปเบ™เบ›เบฐเป‚เบซเบเบ” เบ•เบปเบงเปเบ›เบ‡เบชเบฑเบ™เบเบฒเบ™ เป€เบžเบตเปˆเบกเบ—เบธเบ‡เปเบฅเป‰เบง -- เบŠเบตเป‰เบšเบญเบ-เป€เบ•เบทเบญเบ™:

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

เบ”เป‰เบงเบเบ—เบธเบ‡เบ™เบตเป‰, เบ•เบปเบงเปเบ›เบ‡เบชเบฑเบ™เบเบฒเบ™เบˆเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบšเปเปˆเปเบกเปˆเบ™เบชเบนเบ™เบ–เป‰เบฒเบกเบตเบ„เปเบฒเป€เบ•เบทเบญเบ™เปƒเบ™เบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ. เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบฅเบฐเบซเบฑเบ”เบเบฒเบ™เบชเบปเปˆเบ‡เบ„เบทเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบšเบฅเบฑเบญเบเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เป precommit, commit, เบซเบผเบทเบ”เบถเบ‡, เปเบฅเบฐเบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เบชเบฒเบกเบฒเบ”เบชเบฐเปเบ”เบ‡, เปเบšเปˆเบ‡เบ›เบฑเบ™, เบซเบผเบทเบชเบปเปˆเบ‡เบ—เบฒเบ‡เบญเบตเป€เบกเบฅเปŒ.

เบซเบกเบฒเบโ€‹เป€เบซเบ”โ€‹. เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ—เปˆเบฒเบ™เบ—เปเบฒเบญเบดเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เป„เบŸเบฅเปŒ, เป‚เบ„เบ‡เบเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบˆเบฐเบ–เบทเบเบงเบดเป€เบ„เบฒเบฐ, เป€เบžเบฒเบฐเบงเปˆเบฒ เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒเบ—เบตเปˆเบ‚เบถเป‰เบ™เบเบฑเบšเป„เบŸเบฅเปŒเปเบซเบผเปˆเบ‡เป‚เบ„เบ‡เบเบฒเบ™เบขเบนเปˆเปƒเบ™เป„เบŸเบฅเปŒ header. เบ™เบตเป‰เปเบกเปˆเบ™เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ‚เบญเบ‡เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเป„เบŸเบฅเปŒ C เปเบฅเบฐ C ++. เปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”, เป„เบŸเบฅเปŒ dependency เบชเบฒเบกเบฒเบ”เบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เบ–เบฒเบ™เบ„เบงเบฒเบกเบˆเปเบฒเปเบฅเบฐเบกเบฑเบ™เบˆเบฐเบ–เบทเบเบ›เบฑเบšเบ›เบธเบ‡เป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เป‚เบ”เบเป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐ. เบ›เบฐเป‚เบซเบเบ”เบ‚เบญเบ‡เบเบฒเบ™เบเบงเบ”เบชเบญเบš commits เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ™เปเบฒเปƒเบŠเป‰เบฎเบนเบšเปเบšเบšเบเบฒเบ™เบเบงเบ”เบชเบญเบšเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเป„เบŸเบฅเปŒเปƒเบ™เป„เบฅเบเบฐเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบฎเบนเบšเปเบšเบšเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ incremental เปเบกเปˆเบ™เบงเปˆเบฒเบ—เปˆเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบเบฒเบ™ cache เป„เบŸเบฅเปŒเบ™เบฑเป‰เบ™เปเบฅเบฐเบšเปเปˆเปเบกเปˆเบ™เป„เบŸเบฅเปŒเบงเบฑเบ”เบ–เบธ.

เบซเบผเบฑเบเบเบฒเบ™เบ—เบปเปˆเบงเป„เบ›เบ‚เบญเบ‡เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ”เบถเบ‡

เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเป‚เบ„เบ‡เบเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบŠเป‰เป€เบงเบฅเบฒเบซเบผเบฒเบ, เบชเบฐเบ™เบฑเป‰เบ™เบกเบฑเบ™เป€เบฎเบฑเบ”เปƒเบซเป‰เบ„เบงเบฒเบกเบฎเบนเป‰เบชเบถเบเบ—เบตเปˆเบˆเบฐเบเบงเบ”เบชเบญเบšเบžเบฝเบ‡เปเบ•เปˆเบšเบฒเบ‡เบชเปˆเบงเบ™เบ‚เบญเบ‡เบกเบฑเบ™. เบšเบฑเบ™เบซเบฒเปเบกเปˆเบ™เบงเปˆเบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เปเบเบเป„เบŸเบฅเปŒเปƒเบซเบกเปˆเบˆเบฒเบเบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบผเบทเบญเบ‚เบญเบ‡เป„เบŸเบฅเปŒเป‚เบ„เบ‡เบเบฒเบ™.

เบ‚เปเปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบ•เบปเป‰เบ™เป„เบกเป‰เบ—เบตเปˆเบกเบตเบชเบญเบ‡เบชเบฒเบ‚เบฒ:

เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเปเบฅเบฐเบ”เบถเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเปƒเบ™ Travis CI, Buddy เปเบฅเบฐ AppVeyor เป‚เบ”เบเปƒเบŠเป‰ PVS-Studio

เบ‚เปโ€‹เปƒเบซเป‰โ€‹เบ™เบถเบโ€‹เบžเบฒเบšโ€‹เป€เบ–เบดเบ‡โ€‹เบ„เบณโ€‹เปเบฑเป‰เบ™โ€‹เบชเบฑเบ™เบเบฒโ€‹เบ™เบฑเป‰เบ™ A1 เบ›เบฐเบเบญเบšเบกเบตเบˆเปเบฒเบ™เบงเบ™เบฅเบฐเบซเบฑเบ”เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเบžเปเบชเบปเบกเบ„เบงเบ™เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเปเบฅเป‰เบง. เบเปˆเบญเบ™โ€‹เปœเป‰เบฒโ€‹เบ™เบฑเป‰เบ™โ€‹เปœเป‰เบญเบโ€‹เปœเบถเปˆเบ‡โ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เป„เบ”เป‰โ€‹เบชเป‰เบฒเบ‡โ€‹เบชเบฒเบ‚เบฒโ€‹เบˆเบฒเบโ€‹เบ„เบณโ€‹เปเบฑเป‰เบ™โ€‹เบชเบฑเบ™เบเบฒ A1 เปเบฅเบฐเบ›เปˆเบฝเบ™เบšเบฒเบ‡เป„เบŸเบฅเปŒ.

เบ—เปˆเบฒเบ™, เปเบ™เปˆเบ™เบญเบ™, เบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบงเปˆเบฒเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ A1 เบชเบญเบ‡เบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเป€เบžเบตเปˆเบกเป€เบ•เบตเบกเป„เบ”เป‰เป€เบเบตเบ”เบ‚เบถเป‰เบ™, เปเบ•เปˆเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เบฅเบงเบกเบ•เบปเบงเบ‚เบญเบ‡เบชเบฒเบ‚เบฒเบญเบทเปˆเบ™เป†, เป€เบžเบฒเบฐเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒ. เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš. เปเบฅเบฐเบ”เบฝเบงเบ™เบตเป‰เป€เบ–เบดเบ‡เป€เบงเบฅเบฒเปเบฅเป‰เบง hotfix เบžเป‰เบญเบก. เบ™เบฑเป‰เบ™เปเบกเปˆเบ™เป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเบงเปˆเบฒเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ”เบถเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบฅเบงเบกเบ•เบปเบงเป„เบ”เป‰เบ›เบฒเบเบปเบ”เบ‚เบถเป‰เบ™ B3 ะธ A3.

เปเบ™เปˆเบ™เบญเบ™, เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบเบงเบ”เป€เบšเบดเปˆเบ‡เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบเบฒเบ™เบฅเบงเบกเบ•เบปเบงเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ, เปเบ•เปˆเบ™เบตเป‰เบˆเบฐเป€เบ›เบฑเบ™เบเบฒเบ™เปƒเบŠเป‰เป€เบงเบฅเบฒเบซเบผเบฒเบเป€เบเบตเบ™เป„เบ›เปเบฅเบฐเบšเปเปˆเบชเบปเบกเป€เบซเบ”เบชเบปเบกเบœเบปเบ™, เป€เบžเบฒเบฐเบงเปˆเบฒเบกเบตเบžเบฝเบ‡เปเบ•เปˆเป„เบŸเบฅเปŒเบˆเปเบฒเบ™เบงเบ™เบซเบ™เป‰เบญเบเบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบกเบฑเบ™เบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบซเบผเบฒเบเปƒเบ™เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบžเบฝเบ‡เปเบ•เปˆเบชเบดเปˆเบ‡เบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡.

เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เบฅเบฐเบซเบงเปˆเบฒเบ‡เบชเบฒเบ‚เบฒ, เบขเบนเปˆเปƒเบ™เบซเบปเบงเบ‚เบญเบ‡เบชเบฒเบ‚เบฒเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบฅเบงเบกเป€เบ‚เบปเป‰เบฒเป€เบ›เบฑเบ™เปเบกเปˆเบšเบปเบ”:

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 (-- เบŠเบตเป‰เบšเบญเบ-เป€เบ•เบทเบญเบ™). เบ–เป‰เบฒเบกเบตเบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบเบซเบ™เบถเปˆเบ‡เบ„เปเบฒเป€เบ•เบทเบญเบ™เบ‚เบญเบ‡เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ, เบฅเบฐเบซเบฑเบ”เบเบฑเบšเบ„เบทเบ™เบœเบปเบ™เบ›เบฐเป‚เบซเบเบ” เบ•เบปเบงเปเบ›เบ‡เบชเบฑเบ™เบเบฒเบ™ เบˆเบฐเบ›เปˆเบฝเบ™เป€เบ›เบฑเบ™ 2, เป€เบŠเบดเปˆเบ‡เปƒเบ™เบ™เบฑเป‰เบ™เบˆเบฐเปเบˆเป‰เบ‡เปƒเบซเป‰เบšเปเบฅเบดเบเบฒเบ™ CI เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ›เบฐเบเบปเบ”เบ•เบปเบงเบ‚เบญเบ‡เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเบญเบฒเบ”เบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เป„เบŸเบฅเปŒเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบเบฒเบ™เบ”เบถเบ‡.

Travis C.I.

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเปเบกเปˆเบ™เป€เบฎเบฑเบ”เป€เบ›เบฑเบ™เป„เบŸเบฅเปŒ .travis.yml. เป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเบชเบฐเบ”เบงเบ, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบญเบปเบฒเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ script bash เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบ—เบตเปˆเบกเบตเบซเบ™เป‰เบฒเบ—เบตเปˆเบˆเบฐเบ–เบทเบเป€เบญเบตเป‰เบ™เบˆเบฒเบเป„เบŸเบฅเปŒ. .travis.yml (bash script_name.sh function_name).

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบžเบตเปˆเบกเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เปƒเบซเป‰เบเบฑเบš script เบขเบนเปˆ 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 เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ:

script:
  - bash .travis.sh travis_script

เปเบฅเบฐเปƒเบ™ bash script:

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 เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบŠเบทเปˆเบ‚เบญเบ‡ repository เป‚เบ„เบ‡เบเบฒเบ™.

เบชเบนเบ”เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบชเปเบฒเบฅเบฑเบšเบŸเบฑเบ‡เบŠเบฑเบ™เบ™เบตเป‰:

เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเปเบฅเบฐเบ”เบถเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเปƒเบ™ 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, เบŠเบถเปˆเบ‡เป€เบ›เบฑเบ™เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เป€เบ—เบดเบ‡เบ‚เบญเบ‡เบชเบฒเบ‚เบฒเบˆเบฒเบ เบ•เบปเป‰เบ™เบเปเบฒเป€เบ™เบตเบ”.

เบกเบตเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบญเบฑเบ™เบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญ - เบเบฒเบ™เป€เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบเบฒเบ™เบ‚เบถเป‰เบ™เบเบฑเบšเบ‚เบญเบ‡เป„เบŸเบฅเปŒ header เปƒเบ™เบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบเบฒเบ™เปเบ›เบ—เบตเปˆเบฅเบงเบšเบฅเบงเบก (*.c, *.cc, *.cpp, เปเบฅเบฐเบญเบทเปˆเบ™เป†). เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบเบฒเบ™เป€เบžเบดเปˆเบ‡เบžเบฒเบญเบฒเป„เบชเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เป€เบกเบทเปˆเบญเบกเบฑเบ™เบ–เบทเบเป€เบ›เบตเบ”เบ•เบปเบงเบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”เปƒเบ™เบฎเบนเบšเปเบšเบšเบ‚เบญเบ‡เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เป„เบŸเบฅเปŒเปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบšเบฑเบ™เบ—เบถเบเบžเบงเบเบกเบฑเบ™เป„เบงเป‰เปƒเบ™เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบต .PVS-Studio. Travis CI เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ” cache เป‚เบŸเบ™เป€เบ”เบต, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบšเบฑเบ™เบ—เบถเบเบ‚เปเป‰เบกเบนเบ™เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบต .PVS-Studio/:

cache:
  directories:
    - .PVS-Studio/

เบฅเบฐเบซเบฑเบ”เบ™เบตเป‰เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เป€เบžเบตเปˆเบกเปƒเบชเปˆเป„เบŸเบฅเปŒ .travis.yml. เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบ™เบตเป‰เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เปเป‰เบกเบนเบ™เบ•เปˆเบฒเบ‡เป†เบ—เบตเปˆเป€เบเบฑเบšเบเปเบฒเบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบŠเปˆเบงเบเป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเป„เบงเปƒเบ™เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบฅเบฒเบเบŠเบทเปˆเป„เบŸเบฅเปŒเบซเบผเบทเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™เบขเปˆเบฒเบ‡เบซเบผเบงเบ‡เบซเบผเบฒเบ. เบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบ™เบตเป‰เบšเปเปˆเป„เบ”เป‰เป€เบฎเบฑเบ”, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ™เบฑเบเบงเบดเป€เบ„เบฒเบฐเบ•เบปเบงเบˆเบดเบ‡เบˆเบฐเบงเบดเป€เบ„เบฒเบฐเป„เบŸเบฅเปŒเบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบธเบเบ„เบฑเป‰เบ‡.

Buddy

เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบš Travis CI, Buddy เบชเบฐเบซเบ™เบญเบ‡เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เปเบฅเบฐเบ—เบปเบ”เบชเบญเบšเป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™ GitHub เป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”. เบšเปเปˆเป€เบซเบกเบทเบญเบ™เบเบฑเบš Travis CI, เบกเบฑเบ™เบ–เบทเบเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเปƒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเป€เบงเบฑเบš (เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ bash เปเบกเปˆเบ™เบกเบตเบขเบนเปˆ), เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเป„เบŸเบฅเปŒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™.

เบเปˆเบญเบ™เบญเบทเปˆเบ™ เปเบปเบ”, เบžเบงเบเป€เบฎเบปเบฒ เบˆเบณ เป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบžเบตเปˆเบกเบเบฒเบ™เบเบฐ เบ—เบณ เปƒเปเปˆ เปƒเบชเปˆเบชเบฒเบเบ›เบฐเบเบญเบš:

เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเปเบฅเบฐเบ”เบถเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเปƒเบ™ Travis CI, Buddy เปเบฅเบฐ AppVeyor เป‚เบ”เบเปƒเบŠเป‰ PVS-Studio
เปƒเบซเป‰เป€เบฎเบปเบฒเบŠเบตเป‰เบšเบญเบเบ•เบปเบงเบชเบฑเบ‡เบฅเบงเบกเบ—เบตเปˆเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เป‚เบ„เบ‡เบเบฒเบ™. เบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™ docker container เบ—เบตเปˆเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบขเบนเปˆเปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ™เบตเป‰. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบกเบตเบ–เบฑเบ‡เบžเบดเป€เบชเบ”เบชเปเบฒเบฅเบฑเบš 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
เบ„เบงเบฒเบกโ€‹เบˆเบดเบ‡โ€‹เปเบฅเป‰เบงโ€‹เปเบกเปˆเบ™โ€‹เบงเปˆเบฒโ€‹เปƒเบ™โ€‹เบ›เบฑเบ”โ€‹เบˆเบธโ€‹เบšเบฑเบ™โ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบงเบดโ€‹เป€เบ„เบฒเบฐโ€‹เบšเปเปˆโ€‹เปเบกเปˆเบ™โ€‹เบœเบปเบ™โ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบฅเบงเบกโ€‹, เปเบ•เปˆโ€‹เบซเบปเบงโ€‹เบซเบ™เป‰เบฒโ€‹เบ‚เบญเบ‡โ€‹เบชเบฒโ€‹เบ‚เบฒโ€‹เบ—เบตเปˆโ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เบ”เบถเบ‡โ€‹เปเบกเปˆเบ™โ€‹เป€เบฎเบฑเบ”โ€‹เป„เบ”เป‰โ€‹:

เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเปเบฅเบฐเบ”เบถเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเปƒเบ™ 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 โ€” เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบชเบปเบกโ€‹เบ‚เบญเบ‡โ€‹เบŠเบทเปˆโ€‹เบœเบนเป‰โ€‹เปƒเบŠเป‰โ€‹เปเบฅเบฐ repository (เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบ•เบปเบงโ€‹เบขเปˆเบฒเบ‡โ€‹เบชเบนเบ‡โ€‹เบชเบธเบ” / เบเบฒเบ™โ€‹เบ—เบปเบ”โ€‹เบชเบญเบšโ€‹)โ€‹.

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบšเบฑเบ™เบ—เบถเบเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เป‚เบ”เบเปƒเบŠเป‰เบ›เบธเปˆเบกเบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เปเบฅเบฐเป€เบ›เบตเบ”เปƒเบŠเป‰เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ”เบถเบ‡:

เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเปเบฅเบฐเบ”เบถเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเปƒเบ™ Travis CI, Buddy เปเบฅเบฐ AppVeyor เป‚เบ”เบเปƒเบŠเป‰ PVS-Studio
เบšเปเปˆเป€เบซเบกเบทเบญเบ™เบเบฑเบš Travis CI, เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบฅเบฐเบšเบธ .pvs-studio เบชเปเบฒเบฅเบฑเบšเบ–เบฒเบ™เบ„เบงเบฒเบกเบˆเปเบฒ, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒ Buddy เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ” cache เป„เบŸเบฅเปŒเบ—เบฑเบ‡เบซเบกเบปเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบ•เปเปˆเป„เบ›. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบชเบดเปˆเบ‡เบชเบธเบ”เบ—เป‰เบฒเบเบ—เบตเปˆเป€เบซเบฅเบทเบญเป„เบงเป‰เปเบกเปˆเบ™เป€เบžเบทเปˆเบญเบšเบฑเบ™เบ—เบถเบเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเปเบฅเบฐเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบชเปเบฒเบฅเบฑเบš PVS-Studio เปƒเบ™ Buddy. เบซเบผเบฑเบ‡เบˆเบฒเบเบšเบฑเบ™เบ—เบถเบเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ–เบทเบเบ™เปเบฒเบเบฑเบšเบ„เบทเบ™เป„เบ›เบ—เปเปˆ. เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบเป‰เบฒเบงเป„เบ›เบชเบนเปˆเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ•เบปเบงเปเบ›เปเบฅเบฐเป€เบžเบตเปˆเบกเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเปเบฅเบฐเบฅเบฐเบซเบฑเบ”เบชเปเบฒเบฅเบฑเบš PVS-Studio:

เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเปเบฅเบฐเบ”เบถเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเปƒเบ™ Travis CI, Buddy เปเบฅเบฐ AppVeyor เป‚เบ”เบเปƒเบŠเป‰ PVS-Studio
เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบตเป‰, เบฎเบนเบšเบฅเบฑเบเบชเบฐเบ™เบฐเบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ”เบถเบ‡เปƒเบซเบกเปˆเบซเบผเบทเบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เป€เบเบตเบ”เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™. เบ–เป‰เบฒเบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”, Buddy เบˆเบฐเบŠเบตเป‰เบšเบญเบเบ™เบตเป‰เบขเบนเปˆเปƒเบ™เบซเบ™เป‰เบฒเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบเบฒเบ™เบ”เบถเบ‡.

AppVeyor

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ AppVeyor เปเบกเปˆเบ™เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบเบฑเบš Buddy, เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เป€เบเบตเบ”เบ‚เบทเป‰เบ™เปƒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ‚เบญเบ‡เป€เบงเบฑเบšเปเบฅเบฐเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบžเบตเปˆเบกเป„เบŸเบฅเปŒ *.yml เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบšเปˆเบญเบ™เป€เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เป‚เบ„เบ‡เบเบฒเบ™.

เปƒเบซเป‰เป„เบ›เบ—เบตเปˆเปเบ–เบšเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเปƒเบ™เบžเบฒเบšเบฅเบงเบกเบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™:

เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเปเบฅเบฐเบ”เบถเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเปƒเบ™ Travis CI, Buddy เปเบฅเบฐ AppVeyor เป‚เบ”เบเปƒเบŠเป‰ PVS-Studio
เปƒเบซเป‰เป€เบฅเบทเปˆเบญเบ™เบฅเบปเบ‡เบซเบ™เป‰เบฒเบ™เบตเป‰เปเบฅเบฐเป€เบ›เบตเบ”เปƒเบŠเป‰เบเบฒเบ™เบ›เบฐเบซเบเบฑเบ” cache เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบฅเบงเบšเบฅเบงเบกเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ”เบถเบ‡:

เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเปเบฅเบฐเบ”เบถเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเปƒเบ™ 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
เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเป€เบฎเบฑเบ”เปเบ™เบงเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบงเบดเป€เบ„เบฒเบฐเป‚เบ„เบ‡เบเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™เบชเบญเบ‡เป„เบŸเบฅเปŒ, เปเบ•เปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบœเบปเบ™เบœเบฐเบฅเบดเบ”เบˆเบฒเบเป„เบŸเบฅเปŒเบ—เบตเปˆเบเปเบฒเบ™เบปเบ”. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบˆเบฐเปƒเบชเปˆเบŠเบทเปˆเป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡.

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบกเบฑเบ™เป€เบ–เบดเบ‡เป€เบงเบฅเบฒเบชเปเบฒเบฅเบฑเบš script เบ—เบตเปˆเบˆเบฐเบ—เบปเบ”เบชเบญเบš. เป€เบ›เบตเบ”เปเบ–เบšเบ—เบปเบ”เบชเบญเบš เปเบฅเบฐเป€เบฅเบทเบญเบ Script:

เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเปเบฅเบฐเบ”เบถเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเปƒเบ™ 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 เปƒเบซเป‰เบเบฑเบšเบ•เบปเบงเปเบ›เบ—เบตเปˆเบ„เบงเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ™เบตเป‰เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเปเบ›เบเบขเบนเปˆ glance เบ—เปเบฒเบญเบดเบ”, เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบญเบฐเบ—เบดเบšเบฒเบเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™.

เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบ•เบฑเป‰เบ‡เป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐเปƒเบ™ AppVeyor, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบžเบปเบšเบเบฑเบšเบžเบถเบ”เบ•เบดเบเปเบฒเบ—เบตเปˆเปเบ›เบเบ›เบฐเบซเบฅเบฒเบ”เบ—เบตเปˆเบชเบธเบ”เบ‚เบญเบ‡เบ™เบฑเบเบงเบดเป€เบ„เบฒเบฐ. เปƒเบ™เบ”เป‰เบฒเบ™เบซเบ™เบถเปˆเบ‡, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡, เปเบ•เปˆเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบšเปเปˆเป„เบ”เป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™. เบ‚เป‰เบญเบเปƒเบŠเป‰เป€เบงเบฅเบฒเบซเบผเบฒเบเบ—เบตเปˆเบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบขเบนเปˆเปƒเบ™ /home/appveyor/projects/testcalc/ directory, เปเบฅเบฐเบ™เบฑเบเบงเบดเป€เบ„เบฒเบฐเปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบขเบนเปˆเปƒเบ™ /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 - เบŠเบทเปˆเบœเบนเป‰เปƒเบŠเป‰ เปเบฅเบฐเบšเปˆเบญเบ™เป€เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เป‚เบ„เบ‡เบเบฒเบ™.

เบชเบฐเบซเบฅเบธเบš

เปเบ™เปˆเบ™เบญเบ™, เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบšเปเปˆเป„เบ”เป‰เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบขเปˆเบฒเบ‡เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡เบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰, เปเบ™เบงเปƒเบ”เบเปเปˆเบ•เบฒเบก, เบžเบงเบเป€เบ‚เบปเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เบกเบตเบชเบฐเป€เบžเบฒเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบ—เบตเปˆเบชเบธเบ”เป€เบŠเบดเปˆเบ‡เบเบฑเบ™เปเบฅเบฐเบเบฑเบ™. เบกเบตเบ‚เปเป‰เบเบปเบเป€เบงเบฑเป‰เบ™เบ‚เบญเบ‡ caching, เปเบ•เปˆเบฅเบฐเบšเปเบฅเบดเบเบฒเบ™เป€เบฎเบฑเบ”เปƒเบซเป‰ "เบฅเบปเบ”เบ–เบตเบš" เบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡, เบชเบฐเบ™เบฑเป‰เบ™เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบชเบฐเป€เบซเบกเบต.

เบšเบฒเบ‡เบšเปˆเบญเบ™, เป€เบŠเบฑเปˆเบ™เปƒเบ™ Travis-CI, เบชเบญเบ‡เป€เบชเบฑเป‰เบ™เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เปเบฅเบฐเบ–เบฒเบ™เบ„เบงเบฒเบกเบˆเปเบฒเป€เบฎเบฑเบ”เบงเบฝเบ flawlessly; เบšเบฒเบ‡เบšเปˆเบญเบ™, เป€เบŠเบฑเปˆเบ™เปƒเบ™ AppVeyor, เบ—เปˆเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบฅเบฐเบšเบธเป‚เบŸเบ™เป€เบ”เบตเปƒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ; เปเบ•เปˆเบšเบฒเบ‡เบšเปˆเบญเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบชเป‰เบฒเบ‡เบเบฐเปเบˆเบ—เบตเปˆเป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบเปเบฅเบฐเบžเบฐเบเบฒเบเบฒเบกเบŠเบฑเบเบŠเบงเบ™เบฅเบฐเบšเบปเบšเป€เบžเบทเปˆเบญเปƒเบซเป‰เป€เบˆเบปเป‰เบฒเบกเบตเป‚เบญเบเบฒเบ”เบ—เบตเปˆเบˆเบฐเบ‚เบฝเบ™เบ—เบฑเบšเบŠเบดเป‰เบ™เบชเปˆเบงเบ™เบ—เบตเปˆเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เบ–เบฒเบ™เบ„เบงเบฒเบกเบˆเปเบฒ. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบเบฒเบ™เบ”เบถเบ‡เปƒเบ™เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบขเปˆเบฒเบ‡เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡เบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบชเบปเบ™เบ—เบฐเบ™เบฒเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปเบฒเบญเบดเบ”เปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบ—เปˆเบฒเบ™เบˆเบฐเบšเปเปˆเบกเบตเบšเบฑเบ™เบซเบฒเบเบฑเบšเบ–เบฒเบ™เบ„เบงเบฒเบกเบˆเปเบฒ.

เบ‚เบญเบšเปƒเบˆเบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเบ‚เบญเบ‡เบ—เปˆเบฒเบ™. เบ–เป‰เบฒโ€‹เบซเบฒเบโ€‹เบงเปˆเบฒโ€‹เบšเบฒเบ‡โ€‹เบชเบดเปˆเบ‡โ€‹เบšเบฒเบ‡โ€‹เบขเปˆเบฒเบ‡โ€‹เบšเปเปˆโ€‹เป„เบ”เป‰โ€‹เบญเบญเบโ€‹, เบเบฐโ€‹เบฅเบธโ€‹เบ™เบฒโ€‹เบ‚เบฝเบ™โ€‹เบซเบฒโ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เป„เบ”เป‰โ€‹เบ—เบตเปˆโ€‹ เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเปƒเบซเป‰เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเปเบฅเบฐเบเบฒเบ™เบŠเปˆเบงเบเป€เบซเบผเบทเบญ.

เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเปเบฅเบฐเบ”เบถเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเปƒเบ™ Travis CI, Buddy เปเบฅเบฐ AppVeyor เป‚เบ”เบเปƒเบŠเป‰ PVS-Studio

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เปเบšเปˆเบ‡เบ›เบฑเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบเบฑเบšเบœเบนเป‰เบŠเบปเบกเบ—เบตเปˆเป€เบงเบปเป‰เบฒเบžเบฒเบชเบฒเบญเบฑเบ‡เบเบดเบ”, เบเบฐเบฅเบธเบ™เบฒเปƒเบŠเป‰เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฒเบ™เปเบ›เบžเบฒเบชเบฒ: Maxim Zvyagintsev. เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเปเบฅเบฐเบ”เบถเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเปƒเบ™ Travis CI, Buddy เปเบฅเบฐ AppVeyor เป‚เบ”เบเปƒเบŠเป‰ PVS-Studio.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™