ื ื™ืชื•ื— ืฉืœ ื”ืชื—ื™ื™ื‘ื•ื™ื•ืช ื•ื‘ืงืฉื•ืช ืžืฉื™ื›ื” ื‘-Travis CI, Buddy ื•-AppVeyor ื‘ืืžืฆืขื•ืช PVS-Studio

ื ื™ืชื•ื— ืฉืœ ื”ืชื—ื™ื™ื‘ื•ื™ื•ืช ื•ื‘ืงืฉื•ืช ืžืฉื™ื›ื” ื‘-Travis CI, Buddy ื•-AppVeyor ื‘ืืžืฆืขื•ืช PVS-Studio
ื‘-PVS-Studio Analyzer ืœืฉืคื•ืช C ื•-C++ ื‘ืœื™ื ื•ืงืก ื•ื‘-macOS, ื”ื—ืœ ืžื’ืจืกื” 7.04, ื”ื•ืคื™ืขื” ืืคืฉืจื•ืช ื‘ื“ื™ืงื” ืœื‘ื“ื™ืงืช ืจืฉื™ืžืช ื”ืงื‘ืฆื™ื ืฉืฆื•ื™ื ื•. ื‘ืืžืฆืขื•ืช ื”ืžืฆื‘ ื”ื—ื“ืฉ, ืืชื” ื™ื›ื•ืœ ืœื”ื’ื“ื™ืจ ืืช ื”ื ืชื— ืœื‘ื“ื™ืงืช ื”ืชื—ื™ื™ื‘ื•ื™ื•ืช ื•ื‘ืงืฉื•ืช ืžืฉื™ื›ื”. ืžืืžืจ ื–ื” ื™ืกืคืจ ืœื›ื ื›ื™ืฆื“ ืœื”ื’ื“ื™ืจ ืืช ื‘ื“ื™ืงืช ืจืฉื™ืžืช ื”ืงื‘ืฆื™ื ืฉื”ืฉืชื ื• ืฉืœ ืคืจื•ื™ืงื˜ GitHub ื‘ืžืขืจื›ื•ืช CI (Intinuous Integration) ืคื•ืคื•ืœืจื™ื•ืช ื›ืžื• Travis CI, Buddy ื•-AppVeyor.

ืžืฆื‘ ื‘ื“ื™ืงืช ืจืฉื™ืžืช ืงื‘ืฆื™ื

ืกื˜ื•ื“ื™ื• PVS ื”ื•ื ื›ืœื™ ืœื–ื™ื”ื•ื™ ืฉื’ื™ืื•ืช ื•ืคื’ื™ืขื•ื™ื•ืช ืคื•ื˜ื ืฆื™ืืœื™ื•ืช ื‘ืงื•ื“ ื”ืžืงื•ืจ ืฉืœ ืชื•ื›ื ื™ื•ืช ื”ื›ืชื•ื‘ื•ืช ื‘-C, C++, C# ื•-Java. ืขื•ื‘ื“ ืขืœ ืžืขืจื›ื•ืช 64 ืกื™ื‘ื™ื•ืช ื‘-Windows, Linux ื•-macOS.

ื‘ื’ืจืกื” PVS-Studio 7.04 ืขื‘ื•ืจ ืœื™ื ื•ืงืก ื•-macOS, ื”ื•ืคื™ืข ืžืฆื‘ ืœื‘ื“ื™ืงืช ืจืฉื™ืžืช ืงื‘ืฆื™ ื”ืžืงื•ืจ. ื–ื” ืขื•ื‘ื“ ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ื™ื ืฉืžืขืจื›ืช ื”ื‘ื ื™ื™ื” ืฉืœื”ื ืžืืคืฉืจืช ืœืš ืœื™ืฆื•ืจ ืงื•ื‘ืฅ compile_commands.json. ื™ืฉ ืฆื•ืจืš ื‘ืžื ืชื— ื›ื“ื™ ืœื—ืœืฅ ืžื™ื“ืข ืขืœ ื”ื™ื“ื•ืจ ืฉืœ ื”ืงื‘ืฆื™ื ืฉืฆื•ื™ื ื•. ืื ืžืขืจื›ืช ื”ื‘ื ื™ื™ื” ืฉืœืš ืœื ืชื•ืžื›ืช ื‘ื™ืฆื™ืจืช ื”ืงื•ื‘ืฅ compile_commands.json, ืืชื” ื™ื›ื•ืœ ืœื ืกื•ืช ืœื™ืฆื•ืจ ืงื•ื‘ืฅ ื›ื–ื” ื‘ืืžืฆืขื•ืช ื›ืœื™ ื”ืฉื™ืจื•ืช ื“ื•ื‘.

ื›ืžื• ื›ืŸ, ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ืžืฆื‘ ื‘ื“ื™ืงืช ืจืฉื™ืžืช ื”ืงื‘ืฆื™ื ื™ื—ื“ ืขื ื™ื•ืžืŸ ื”-strace trace ืฉืœ ื”ืฉืงื•ืช ืžื”ื“ืจ (pvs-studio-analyzer trace). ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช, ืชื—ื™ืœื” ืชืฆื˜ืจืš ืœื‘ืฆืข ื‘ื ื™ื™ื” ืžืœืื” ืฉืœ ื”ืคืจื•ื™ืงื˜ ื•ืœืขืงื•ื‘ ืื—ืจื™ื• ื›ืš ืฉื”ื ืชื— ื™ืืกื•ืฃ ืžื™ื“ืข ืžืœื ืขืœ ืคืจืžื˜ืจื™ ื”ื”ื™ื“ื•ืจ ืฉืœ ื›ืœ ื”ืงื‘ืฆื™ื ื”ื ื‘ื“ืงื™ื.

ืขื ื–ืืช, ืœืืคืฉืจื•ืช ื–ื• ื™ืฉ ื—ื™ืกืจื•ืŸ ืžืฉืžืขื•ืชื™ - ืชืฆื˜ืจื›ื• ืœื‘ืฆืข ืžืขืงื‘ ื‘ื ื™ื™ื” ืžืœื ืฉืœ ื”ืคืจื•ื™ืงื˜ ื›ื•ืœื• ื‘ื›ืœ ืคืขื ืฉืชืคืขื™ืœื• ืื•ืชื•, ืžื” ื›ืฉืœืขืฆืžื• ืกื•ืชืจ ืืช ื”ืจืขื™ื•ืŸ ืฉืœ ื‘ื“ื™ืงื” ืžื”ื™ืจื” ืฉืœ commit. ืœื—ืœื•ืคื™ืŸ, ืื ืืชื” ืžืื—ืกืŸ ืืช ืชื•ืฆืืช ื”ืžืขืงื‘ ืขืฆืžื”, ื”ืจื™ืฆื•ืช ื”ื‘ืื•ืช ืฉืœ ื”ืžื ืชื— ืขืฉื•ื™ื•ืช ืœื”ื™ื•ืช ื—ืœืงื™ื•ืช ืื ืžื‘ื ื” ื”ืชืœื•ืช ืฉืœ ืงื•ื‘ืฆื™ ื”ืžืงื•ืจ ืžืฉืชื ื” ืœืื—ืจ ื”ืžืขืงื‘ (ืœื“ื•ื’ืžื”, ื ื•ืกืฃ #include ื—ื“ืฉ ืœืื—ื“ ืžืงื‘ืฆื™ ื”ืžืงื•ืจ).

ืœื›ืŸ, ืื™ื ื ื• ืžืžืœื™ืฆื™ื ืœื”ืฉืชืžืฉ ื‘ืžืฆื‘ ื‘ื“ื™ืงืช ืจืฉื™ืžืช ื”ืงื‘ืฆื™ื ืขื ื™ื•ืžืŸ ื”ืžืขืงื‘ ืœื‘ื“ื™ืงืช commits ืื• pull requests. ื‘ืžืงืจื” ืฉืืชื” ื™ื›ื•ืœ ืœื‘ืฆืข ื‘ื ื™ื™ื” ืžืฆื˜ื‘ืจืช ื‘ืขืช ื‘ื“ื™ืงืช commit, ืฉืงื•ืœ ืœื”ืฉืชืžืฉ ื‘ืžืฆื‘ ื ื™ืชื•ื— ืžืฆื˜ื‘ืจ.

ืจืฉื™ืžืช ืงื‘ืฆื™ ื”ืžืงื•ืจ ืœื ื™ืชื•ื— ื ืฉืžืจืช ื‘ืงื•ื‘ืฅ ื˜ืงืกื˜ ื•ืžื•ืขื‘ืจืช ืœื ืชื— ื‘ืืžืฆืขื•ืช ื”ืคืจืžื˜ืจ -S:

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

ืงื•ื‘ืฅ ื–ื” ืžืฆื™ื™ืŸ ื ืชื™ื‘ื™ื ื™ื—ืกื™ื™ื ืื• ืžื•ื—ืœื˜ื™ื ืœืงื‘ืฆื™ื, ื•ื›ืœ ืงื•ื‘ืฅ ื—ื“ืฉ ื—ื™ื™ื‘ ืœื”ื™ื•ืช ื‘ืฉื•ืจื” ื—ื“ืฉื”. ืžืงื•ื‘ืœ ืœืฆื™ื™ืŸ ืœื ืจืง ืฉืžื•ืช ืงื‘ืฆื™ื ืœื ื™ืชื•ื—, ืืœื ื’ื ื˜ืงืกื˜ื™ื ืฉื•ื ื™ื. ื”ืžื ืชื— ื™ืจืื” ืฉื–ื” ืœื ืงื•ื‘ืฅ ื•ื™ืชืขืœื ืžื”ืฉื•ืจื”. ื–ื” ื™ื›ื•ืœ ืœื”ื™ื•ืช ืฉื™ืžื•ืฉื™ ืœื”ืขืจื•ืช ืื ืงื‘ืฆื™ื ืžืฆื•ื™ื ื™ื ื‘ืื•ืคืŸ ื™ื“ื ื™. ืขื ื–ืืช, ืœืขืชื™ื ืงืจื•ื‘ื•ืช ืชื™ื•ื•ืฆืจ ืจืฉื™ืžื” ืฉืœ ืงื‘ืฆื™ื ื‘ืžื”ืœืš ื”ื ื™ืชื•ื— ื‘-CI, ืœืžืฉืœ, ืืœื” ื™ื›ื•ืœื™ื ืœื”ื™ื•ืช ืงื‘ืฆื™ื ืžื‘ืงืฉืช commit ืื• pull.

ื›ืขืช, ื‘ืืžืฆืขื•ืช ืžืฆื‘ ื–ื”, ืืชื” ื™ื›ื•ืœ ืœื‘ื“ื•ืง ื‘ืžื”ื™ืจื•ืช ืงื•ื“ ื—ื“ืฉ ืœืคื ื™ ืฉื”ื•ื ื ื›ื ืก ืœืขื ืฃ ื”ืคื™ืชื•ื— ื”ืจืืฉื™. ื›ื“ื™ ืœื”ื‘ื˜ื™ื— ืฉืžืขืจื›ืช ื”ืกืจื™ืงื” ืžื’ื™ื‘ื” ืœืื–ื”ืจื•ืช ืžื ืชื—, ืชื•ื›ื ื™ืช ื”ืฉื™ืจื•ืช ืžืžื™ืจ-plog ื“ื’ืœ ื ื•ืกืฃ --ืœืฆื™ื™ืŸ-ืื–ื”ืจื•ืช:

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

ืขื ื“ื’ืœ ื–ื”, ื”ืžืžื™ืจ ื™ื—ื–ื™ืจ ืงื•ื“ ืฉืื™ื ื• ืืคืก ืื ื™ืฉ ืื–ื”ืจื•ืช ื‘ื“ื•ื— ื”ื ืชื—. ื‘ืืžืฆืขื•ืช ืงื•ื“ ื”ื”ื—ื–ืจื”, ืืชื” ื™ื›ื•ืœ ืœื—ืกื•ื ื‘ืงืฉืช ื”ื•ืง, ื”ืชื—ื™ื™ื‘ื•ืช ืื• ืžืฉื™ื›ื” ืžืจืืฉ, ื•ื ื™ืชืŸ ืœื”ืฆื™ื’, ืœืฉืชืฃ ืื• ืœืฉืœื•ื— ืืช ื“ื•ื— ื”ื ืชื— ืฉื ื•ืฆืจ ื‘ื“ื•ื"ืœ.

ื”ืขืจื”. ื›ืืฉืจ ืืชื” ืžืชื—ื™ืœ ืœืจืืฉื•ื ื” ืœื ืชื— ืจืฉื™ืžื” ืฉืœ ืงื‘ืฆื™ื, ื”ืคืจื•ื™ืงื˜ ื›ื•ืœื• ื™ื ื•ืชื—, ื›ื™ ื”ืžื ืชื— ืฆืจื™ืš ืœื™ืฆื•ืจ ืงื•ื‘ืฅ ืชืœื•ืช ืฉืœ ืงื‘ืฆื™ ืžืงื•ืจ ื”ืคืจื•ื™ืงื˜ ื‘ืงื‘ืฆื™ ื”ื›ื•ืชืจื•ืช. ื–ื•ื”ื™ ืชื›ื•ื ื” ืฉืœ ื ื™ืชื•ื— ืงื‘ืฆื™ C ื•-C++. ื‘ืขืชื™ื“, ื ื™ืชืŸ ื™ื”ื™ื” ืœืฉืžื•ืจ ืืช ืงื•ื‘ืฅ ื”ืชืœื•ืช ื‘ืžื˜ืžื•ืŸ ื•ื”ื•ื ื™ืขื•ื“ื›ืŸ ืื•ื˜ื•ืžื˜ื™ืช ืขืœ ื™ื“ื™ ื”ืžื ืชื—. ื”ื™ืชืจื•ืŸ ืฉืœ ื‘ื“ื™ืงืช commits ื‘ืขืช ืฉื™ืžื•ืฉ ื‘ืžืฆื‘ ื‘ื“ื™ืงืช ืจืฉื™ืžืช ื”ืงื‘ืฆื™ื ื‘ืžืงื•ื ืฉื™ืžื•ืฉ ื‘ืžืฆื‘ ื”ื ื™ืชื•ื— ื”ืžืฆื˜ื‘ืจ ื”ื•ื ืฉืืชื” ืฆืจื™ืš ืจืง ืœืฉืžื•ืจ ืืช ื”ืงื•ื‘ืฅ ื”ื–ื” ื‘ืžื˜ืžื•ืŸ ื•ืœื ืืช ืงื‘ืฆื™ ื”ืื•ื‘ื™ื™ืงื˜.

ืขืงืจื•ื ื•ืช ื›ืœืœื™ื™ื ืฉืœ ื ื™ืชื•ื— ื‘ืงืฉืช ืžืฉื™ื›ื”

ื ื™ืชื•ื— ื”ืคืจื•ื™ืงื˜ ื›ื•ืœื• ืœื•ืงื— ื”ืจื‘ื” ื–ืžืŸ, ื•ืœื›ืŸ ื”ื’ื™ื•ื ื™ ืœื‘ื“ื•ืง ืจืง ื—ืœืง ืžืกื•ื™ื ืžืžื ื•. ื”ื‘ืขื™ื” ื”ื™ื ืฉืืชื” ืฆืจื™ืš ืœื”ืคืจื™ื“ ืืช ื”ืงื‘ืฆื™ื ื”ื—ื“ืฉื™ื ืžืฉืืจ ืงื‘ืฆื™ ื”ืคืจื•ื™ืงื˜.

ื‘ื•ืื• ื ืกืชื›ืœ ืขืœ ื“ื•ื’ืžื” ืฉืœ ืขืฅ commit ืขื ืฉื ื™ ืขื ืคื™ื:

ื ื™ืชื•ื— ืฉืœ ื”ืชื—ื™ื™ื‘ื•ื™ื•ืช ื•ื‘ืงืฉื•ืช ืžืฉื™ื›ื” ื‘-Travis CI, Buddy ื•-AppVeyor ื‘ืืžืฆืขื•ืช PVS-Studio

ื‘ื•ืื• ื ื“ืžื™ื™ืŸ ืืช ื”ื”ืชื—ื™ื™ื‘ื•ืช ื”ื–ื• A1 ืžื›ื™ืœ ื›ืžื•ืช ื“ื™ ื’ื“ื•ืœื” ืฉืœ ืงื•ื“ ืฉื›ื‘ืจ ื ื‘ื“ืง. ืงืฆืช ืงื•ื“ื ืขืฉื™ื ื• ืกื ื™ืฃ ืžื”ืงื•ืžืžื™ื˜ A1 ื•ืฉื™ื ื” ื›ืžื” ืงื‘ืฆื™ื.

ืืชื”, ื›ืžื•ื‘ืŸ, ืฉืžืช ืœื‘ ืœื–ื” ืื—ืจื™ A1 ื”ืชืจื—ืฉื• ืขื•ื“ ืฉืชื™ ื”ืชื—ื™ื™ื‘ื•ื™ื•ืช, ืื‘ืœ ืืœื” ื”ื™ื• ื’ื ืžื™ื–ื•ื’ื™ื ืฉืœ ืกื ื™ืคื™ื ืื—ืจื™ื, ื›ื™ ืื ื—ื ื• ืœื ืžืชื—ื™ื™ื‘ื™ื ืื‘. ื•ืขื›ืฉื™ื• ื”ื’ื™ืข ื”ื–ืžืŸ ืžืชื™ ืชื™ืงื•ืŸ ื—ื ืžื•ึผื›ึธืŸ. ืœื›ืŸ ื”ื•ืคื™ืขื” ื‘ืงืฉืช ืžืฉื™ื›ื” ืœืžื™ื–ื•ื’ 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

ืคืงื•ื“ื” ื–ื• ืชืคืจื˜ ืืช ื”ืฉื’ื™ืื•ืช ื‘ ืกื˜ื“ืจืจ (ืคืœื˜ ื”ื•ื“ืขืช ืฉื’ื™ืื” ืจื’ื™ืœื”).

ืจืง ืขื›ืฉื™ื• ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœื ืจืง ืœื”ืฆื™ื’ ืฉื’ื™ืื•ืช, ืืœื ื’ื ืœื”ื•ื“ื™ืข โ€‹โ€‹ืœืฉื™ืจื•ืช ืฉืœื ื• ืœื”ืจื›ื‘ื” ื•ื‘ื“ื™ืงื” ืขืœ ื ื•ื›ื—ื•ืช ืฉืœ ื‘ืขื™ื•ืช. ืœืฆื•ืจืš ื›ืš ื ื•ืกืฃ ื“ื’ืœ ืœืžืžื™ืจ -W (--ืœืฆื™ื™ืŸ-ืื–ื”ืจื•ืช). ืื ื™ืฉ ืœืคื—ื•ืช ืื–ื”ืจืช ืžื ืชื— ืื—ืช, ืงื•ื“ ื”ืฉื™ืจื•ืช ืžื—ื–ื™ืจ ืžืžื™ืจ-plog ื™ืฉืชื ื” ืœ-2, ืืฉืจ ื‘ืชื•ืจื• ื™ื•ื“ื™ืข ืœืฉื™ืจื•ืช CI ืขืœ ื ื•ื›ื—ื•ืชืŸ ืฉืœ ืฉื’ื™ืื•ืช ืคื•ื˜ื ืฆื™ืืœื™ื•ืช ื‘ืงื‘ืฆื™ ื‘ืงืฉืช ื”ืžืฉื™ื›ื”.

ื˜ืจื•ื•ื™ืก CI

ื”ืชืฆื•ืจื” ื ืขืฉื™ืช ื›ืงื•ื‘ืฅ .travis.yml. ืžื˜ืขืžื™ ื ื•ื—ื•ืช, ืื ื™ ืžืžืœื™ืฅ ืœืš ืœืฉื™ื ื”ื›ืœ ื‘ืกืงืจื™ืคื˜ bash ื ืคืจื“ ืขื ืคื•ื ืงืฆื™ื•ืช ืฉื™ื™ืงืจืื• ืžื”ืงื•ื‘ืฅ .travis.yml (bash script_name.sh function_name).

ื ื•ืกื™ืฃ ืืช ื”ืงื•ื“ ื”ื“ืจื•ืฉ ืœืกืงืจื™ืคื˜ ื‘ื›ืชื•ื‘ืช ืœื—ื‘ื•ื˜, ื›ืš ื ืงื‘ืœ ื™ื•ืชืจ ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช. ื‘ืกืขื™ืฃ ืœื”ืชืงื™ืŸ ื‘ื•ื ื ื›ืชื•ื‘ ืืช ื”ื“ื‘ืจื™ื ื”ื‘ืื™ื:

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

ื•ื‘ืชืกืจื™ื˜ ื”ื‘ืืฉ:

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
ื”ื‘ื” ื ืกืžืŸ ืืช ื”ืžื”ื“ืจ ืฉืฉื™ืžืฉ ืœื‘ื ื™ื™ืช ื”ืคืจื•ื™ืงื˜. ืฉื™ืžื• ืœื‘ ืœืžื™ื›ืœ ื”-docker ืฉืžื•ืชืงืŸ ื‘ืคืขื•ืœื” ื–ื•. ืœื“ื•ื’ืžื”, ื™ืฉ ืžื™ื›ืœ ืžื™ื•ื—ื“ ืขื‘ื•ืจ 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

ื›ืขืช ื ืขื‘ื•ืจ ืœืœืฉื•ื ื™ืช ื”ืคืขืœื” (ืกืžืœ ืจืืฉื•ืŸ) ื•ื ื•ืกื™ืฃ ืืช ื”ืงื•ื“ ื”ื‘ื ืœืฉื“ื” ื”ืขื•ืจืš ื”ืžืชืื™ื:

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_EXECUTION_PULL_REQEUST_NO - ืžืกืคืจ ื‘ืงืฉื” ืœืžืฉื•ืš;
  • $BUDDY_REPO_SLUG - ืฉื™ืœื•ื‘ ืฉืœ ืฉื ืžืฉืชืžืฉ ื•ืžืื’ืจ (ืœื“ื•ื’ืžื” max/test).

ื›ืขืช ื ืฉืžื•ืจ ืืช ื”ืฉื™ื ื•ื™ื™ื ื‘ืืžืฆืขื•ืช ื”ื›ืคืชื•ืจ ืœืžื˜ื” ื•ื ืืคืฉืจ ื ื™ืชื•ื— ืฉืœ ื‘ืงืฉืช ื”ืžืฉื™ื›ื”:

ื ื™ืชื•ื— ืฉืœ ื”ืชื—ื™ื™ื‘ื•ื™ื•ืช ื•ื‘ืงืฉื•ืช ืžืฉื™ื›ื” ื‘-Travis CI, Buddy ื•-AppVeyor ื‘ืืžืฆืขื•ืช PVS-Studio
ืฉืœื ื›ืžื• Travis CI, ืื ื—ื ื• ืœื ืฆืจื™ื›ื™ื ืœืคืจื˜ .pvs-studio ืขื‘ื•ืจ ืฉืžื™ืจื” ื‘ืžื˜ืžื•ืŸ, ืฉื›ืŸ Buddy ืฉื•ืžืจ ื‘ืื•ืคืŸ ืื•ื˜ื•ืžื˜ื™ ืืช ื›ืœ ื”ืงื‘ืฆื™ื ืขื‘ื•ืจ ื”ืฉืงื•ืช ืขื•ืงื‘ื•ืช. ืœื›ืŸ, ื”ื“ื‘ืจ ื”ืื—ืจื•ืŸ ืฉื ื•ืชืจ ื”ื•ื ืœืฉืžื•ืจ ืืช ื”ื›ื ื™ืกื” ื•ื”ืกื™ืกืžื” ืฉืœ PVS-Studio ื‘- Buddy. ืœืื—ืจ ืฉืžื™ืจืช ื”ืฉื™ื ื•ื™ื™ื, ื ื—ื–ื•ืจ ืœ-Pipeline. ืขืœื™ื ื• ืœืขื‘ื•ืจ ืœื”ื’ื“ืจืช ืžืฉืชื ื™ื ื•ื”ื•ืกืคืช ื›ื ื™ืกื” ื•ืžืคืชื— ืขื‘ื•ืจ PVS-Studio:

ื ื™ืชื•ื— ืฉืœ ื”ืชื—ื™ื™ื‘ื•ื™ื•ืช ื•ื‘ืงืฉื•ืช ืžืฉื™ื›ื” ื‘-Travis CI, Buddy ื•-AppVeyor ื‘ืืžืฆืขื•ืช PVS-Studio
ืœืื—ืจ ืžื›ืŸ, ื”ื•ืคืขืช ื‘ืงืฉืช ืžืฉื™ื›ื” ื—ื“ืฉื” ืื• ื”ืชื—ื™ื™ื‘ื•ืช ืชืคืขื™ืœ ืืช ื”ื‘ื™ืงื•ืจืช. ืื ื”ืชื—ื™ื™ื‘ื•ืช ืžื›ื™ืœื” ืฉื’ื™ืื•ืช, ื‘ืื“ื™ ื™ืฆื™ื™ืŸ ื–ืืช ื‘ื“ืฃ ื‘ืงืฉืช ื”ืžืฉื™ื›ื”.

AppVeyor

ื”ื’ื“ืจืช AppVeyor ื“ื•ืžื” ืœ-Baddy, ืžื›ื™ื•ื•ืŸ ืฉื”ื›ืœ ืงื•ืจื” ื‘ืžืžืฉืง ื”ืื™ื ื˜ืจื ื˜ ื•ืื™ืŸ ืฆื•ืจืš ืœื”ื•ืกื™ืฃ ืงื•ื‘ืฅ *.yml ืœืžืื’ืจ ื”ืคืจื•ื™ืงื˜ื™ื.

ื‘ื•ื ื ืขื‘ื•ืจ ืœืœืฉื•ื ื™ืช ื”ื’ื“ืจื•ืช ื‘ืกืงื™ืจืช ื”ืคืจื•ื™ืงื˜:

ื ื™ืชื•ื— ืฉืœ ื”ืชื—ื™ื™ื‘ื•ื™ื•ืช ื•ื‘ืงืฉื•ืช ืžืฉื™ื›ื” ื‘-Travis CI, Buddy ื•-AppVeyor ื‘ืืžืฆืขื•ืช PVS-Studio
ื‘ื•ืื• ื ื’ืœื•ืœ ืœืžื˜ื” ื‘ื“ืฃ ื–ื” ื•ื ืืคืฉืจ ืฉืžื™ืจืช ืžื˜ืžื•ืŸ ืœืื™ืกื•ืฃ ื‘ืงืฉื•ืช ืžืฉื™ื›ื”:

ื ื™ืชื•ื— ืฉืœ ื”ืชื—ื™ื™ื‘ื•ื™ื•ืช ื•ื‘ืงืฉื•ืช ืžืฉื™ื›ื” ื‘-Travis CI, Buddy ื•-AppVeyor ื‘ืืžืฆืขื•ืช PVS-Studio
ื›ืขืช ื ืขื‘ื•ืจ ืœืœืฉื•ื ื™ืช Environment, ืฉื ืื ื• ืžืฆื™ื™ื ื™ื ืืช ื”ืชืžื•ื ื” ืœื”ืจื›ื‘ื” ื•ืืช ืžืฉืชื ื™ ื”ืกื‘ื™ื‘ื” ื”ื“ืจื•ืฉื™ื:

ื ื™ืชื•ื— ืฉืœ ื”ืชื—ื™ื™ื‘ื•ื™ื•ืช ื•ื‘ืงืฉื•ืช ืžืฉื™ื›ื” ื‘-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, ืืชื” ืจืง ืฆืจื™ืš ืœืฆื™ื™ืŸ ืืช ื”ืชื™ืงื™ื” ื‘ื”ื’ื“ืจื•ืช; ืื‘ืœ ืื™ืคืฉื”ื• ืืชื” ืฆืจื™ืš ืœื™ืฆื•ืจ ืžืคืชื—ื•ืช ื™ื™ื—ื•ื“ื™ื™ื ื•ืœื ืกื•ืช ืœืฉื›ื ืข ืืช ื”ืžืขืจื›ืช ืœืชืช ืœืš ืืช ื”ื”ื–ื“ืžื ื•ืช ืœื”ื—ืœื™ืฃ ืืช ื”ืคืจื’ืžื ื˜ ื”ืฉืžื•ืจ. ืœื›ืŸ, ืื ื‘ืจืฆื•ื ืš ืœื”ื’ื“ื™ืจ ื ื™ืชื•ื— ืฉืœ ื‘ืงืฉื•ืช ืžืฉื™ื›ื” ื‘ืฉื™ืจื•ืช ืื™ื ื˜ื’ืจืฆื™ื” ืžืชืžืฉืš ืฉืœื ื ื“ื•ืŸ ืœืขื™ืœ, ืชื—ื™ืœื” ื•ื“ื ืฉืœื ื™ื”ื™ื• ืœืš ื‘ืขื™ื•ืช ื‘-caching.

ืชื•ื“ื” ืœืš ืขืœ ืชืฉื•ืžืช ื”ืœื‘. ืื ืžืฉื”ื• ืœื ืžืกืชื“ืจ, ืืชื” ืžื•ื–ืžืŸ ืœื›ืชื•ื‘ ืœื ื• ื‘ื›ืชื•ื‘ืช ืชืžื™ื›ื”. ืื ื• ื™ื™ืขืฅ ื•ื ืขื–ื•ืจ.

ื ื™ืชื•ื— ืฉืœ ื”ืชื—ื™ื™ื‘ื•ื™ื•ืช ื•ื‘ืงืฉื•ืช ืžืฉื™ื›ื” ื‘-Travis CI, Buddy ื•-AppVeyor ื‘ืืžืฆืขื•ืช PVS-Studio

ืื ืืชื” ืจื•ืฆื” ืœืฉืชืฃ ืืช ื”ืžืืžืจ ื”ื–ื” ืขื ืงื”ืœ ื“ื•ื‘ืจ ืื ื’ืœื™ืช, ืื ื ื”ืฉืชืžืฉ ื‘ืงื™ืฉื•ืจ ื”ืชืจื’ื•ื: ืžืงืกื™ื Zvyagintsev. ื ื™ืชื•ื— ืฉืœ ื”ืชื—ื™ื™ื‘ื•ื™ื•ืช ื•ื‘ืงืฉื•ืช ืžืฉื™ื›ื” ื‘-Travis CI, Buddy ื•-AppVeyor ื‘ืืžืฆืขื•ืช PVS-Studio.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”