ืึทื ืึทืœื™ืกื™ืก ืคื•ืŸ ืงืึทืžื™ืฅ ืื•ืŸ ืฆื™ืขืŸ ืจื™ืงื•ื•ืขืก ืื™ืŸ Travis CI, Buddy ืื•ืŸ AppVeyor ื ื™ืฆืŸ PVS-Studio

ืึทื ืึทืœื™ืกื™ืก ืคื•ืŸ ืงืึทืžื™ืฅ ืื•ืŸ ืฆื™ืขืŸ ืจื™ืงื•ื•ืขืก ืื™ืŸ Travis CI, Buddy ืื•ืŸ AppVeyor ื ื™ืฆืŸ PVS-Studio
ืื™ืŸ ื“ื™ PVS-Studio ืึทื ืึทืœื™ื–ืขืจ ืคึฟืึทืจ C ืื•ืŸ C ++ ืฉืคึผืจืึทื›ืŸ ืื•ื™ืฃ ืœื™ื ื•ืงืก ืื•ืŸ ืžืึทืงืึธืก, ืกื˜ืึทืจื˜ื™ื ื’ ืคื•ืŸ ื•ื•ืขืจืกื™ืข 7.04, ืึท ืคึผืจื•ื‘ื™ืจืŸ ืึธืคึผืฆื™ืข ืื™ื– ืืจื•ื™ืก ืฆื• ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื“ื™ ืจืฉื™ืžื” ืคื•ืŸ ืกืคึผืขืกื™ืคื™ืขื“ ื˜ืขืงืขืก. ื ื™ืฆืŸ ื“ื™ ื ื™ื™ึทืข ืžืึธื“ืข, ืื™ืจ ืงืขื ืขืŸ ืงืึทื ืคื™ื’ื™ืขืจ ื“ื™ ืึทื ืึทืœื™ื–ืขืจ ืฆื• ืงืึธื ื˜ืจืึธืœื™ืจืŸ ืงืึทืžื™ืฅ ืื•ืŸ ืฆื™ืขืŸ ืจื™ืงื•ื•ืขืก. ื“ืขืจ ืึทืจื˜ื™ืงืœ ื•ื•ืขื˜ ื–ืึธื’ืŸ ืื™ืจ ื•ื•ื™ ืฆื• ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื“ื™ ืจืฉื™ืžื” ืคื•ืŸ ื˜ืฉื™ื™ื ื“ื–ืฉื“ ื˜ืขืงืขืก ืคื•ืŸ ืึท GitHub ืคึผืจื•ื™ืขืงื˜ ืื™ืŸ ืึทื–ืึท ืคืึธืœืงืก ืกื™ (ืงืึธื ื˜ื™ื ื•ืึธื•ืก ื™ื ื˜ืขื’ืจืึทื˜ื™ืึธืŸ) ืกื™ืกื˜ืขืžืขืŸ ื•ื•ื™ Travis CI, Buddy ืื•ืŸ AppVeyor.

ื˜ืขืงืข ืจืฉื™ืžื” ืงืึธื ื˜ืจืึธืœื™ืจื•ื ื’ ืžืึธื“ืข

ืคึผื•ื•ืก-ืกื˜ื•ื“ื™ืึธ ืื™ื– ืึท ื’ืขืฆื™ื™ึทื’ ืฆื• ื™ื“ืขื ื˜ื™ืคื™ืฆื™ืจืŸ ืขืจืจืึธืจืก ืื•ืŸ ืคึผืึธื˜ืขื ืฆื™ืขืœ ื•ื•ืึทืœื ืขืจืึทื‘ื™ืœื™ื˜ื™ื– ืื™ืŸ ื“ื™ ืžืงื•ืจ ืงืึธื“ ืคื•ืŸ ืžื’ื™ืœื” ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ C, C ++, C # ืื•ืŸ Java. ืึทืจื‘ืขื˜ ืื•ื™ืฃ 64-ื‘ื™ืกืœ ืกื™ืกื˜ืขืžืขืŸ ืื•ื™ืฃ ื•ื•ื™ื ื“ืึธื•ื–, ืœื™ื ื•ืงืก ืื•ืŸ ืžืึทืงืึธืก.

ืื™ืŸ ื•ื•ืขืจืกื™ืข PVS-Studio 7.04 ืคึฟืึทืจ ืœื™ื ื•ืงืก ืื•ืŸ ืžืึทืงืึธืก, ืึท ืžืึธื“ืข ืคึฟืึทืจ ืงืึธื ื˜ืจืึธืœื™ืจื•ื ื’ ื“ื™ ืจืฉื™ืžื” ืคื•ืŸ ืžืงื•ืจ ื˜ืขืงืขืก ืื™ื– ืืจื•ื™ืก. ื“ืึธืก ืึทืจื‘ืขื˜ ืคึฟืึทืจ ืคึผืจืึทื“ื–ืฉืขืงืก ื•ื•ืขืžืขื ืก ื‘ื•ื™ืขืŸ ืกื™ืกื˜ืขื ืึทืœืึทื•ื– ืื™ืจ ืฆื• ื“ื–ืฉืขื ืขืจื™ื™ื˜ ืึท ื˜ืขืงืข compile_commands.json. ืขืก ืื™ื– ื ื•ื™ื˜ื™ืง ืคึฟืึทืจ ื“ื™ ืึทื ืึทืœื™ื–ืขืจ ืฆื• ืขืงืกื˜ืจืึทืงื˜ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ื•ื•ืขื’ืŸ ื“ื™ ื–ืึทืžืœื•ื ื’ ืคื•ืŸ ื“ื™ ืกืคึผืขืกืึทืคื™ื™ื“ ื˜ืขืงืขืก. ืื•ื™ื‘ ื“ื™ื™ืŸ ื‘ื•ื™ืขืŸ ืกื™ืกื˜ืขื ืฉื˜ื™ืฆื˜ ื ื™ืฉื˜ ื“ื–ืฉืขื ืขืจื™ื™ื˜ื™ื ื’ ื“ื™ compile_commands.json ื˜ืขืงืข, ืื™ืจ ืงืขื ืขืŸ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ื“ื–ืฉืขื ืขืจื™ื™ื˜ ืึทื–ืึท ืึท ื˜ืขืงืข ืžื™ื˜ ื“ื™ ื ื•ืฆืŸ. ื‘ืขืจ.

ืื•ื™ืš, ื“ื™ ื˜ืขืงืข ืจืฉื™ืžื” ืงืึธื ื˜ืจืึธืœื™ืจื•ื ื’ ืžืึธื“ืข ืงืขื ืขืŸ ื•ื•ืขืจืŸ ื’ืขื ื•ืฆื˜ ืฆื•ื–ืึทืžืขืŸ ืžื™ื˜ ื“ื™ ื˜ืจืึทืกืข ืฉืคึผื•ืจ ืงืœืึธืฅ ืคื•ืŸ ืงืึทืžืคึผื™ื™ืœืขืจ ืœืึธื ื˜ืฉื™ื– (pvs-studio-analyzer trace). ืฆื• ื˜ืึธืŸ ื“ืึธืก, ืื™ืจ ืžื•ื–ืŸ ืขืจืฉื˜ืขืจ ื“ื•ืจื›ืคื™ืจืŸ ืึท ื’ืึทื ืฅ ื‘ื•ื™ืขืŸ ืคื•ืŸ ื“ื™ ืคึผืจื•ื™ืขืงื˜ ืื•ืŸ ืฉืคึผื•ืจ ืขืก ืึทื–ื•ื™ ืึทื– ื“ื™ ืึทื ืึทืœื™ื–ืขืจ ืงืึทืœืขืงืฅ ื’ืึทื ืฅ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ื•ื•ืขื’ืŸ ื“ื™ ื–ืึทืžืœื•ื ื’ ืคึผืึทืจืึทืžืขื˜ืขืจืก ืคื•ืŸ ืึทืœืข ื˜ืขืงืขืก ื•ื•ืึธืก ื–ืขื ืขืŸ ืึธืคึผื’ืขืฉื˜ืขืœื˜.

ืึธื‘ืขืจ, ื“ื™ ืึธืคึผืฆื™ืข ื”ืื˜ ืึท ื‘ืึทื˜ื™ื™ื˜ื™ืง ืฉื˜ืขืจื•ื ื’ - ืื™ืจ ื•ื•ืขื˜ ื“ืึทืจืคึฟืŸ ืฆื• ื“ื•ืจื›ืคื™ืจืŸ ืึท ื’ืึทื ืฅ ืฉืคึผื•ืจ ืคื•ืŸ ื“ื™ ื’ืื ืฆืข ืคึผืจื•ื™ืขืงื˜ ื™ืขื“ืขืจ ืžืึธืœ ืื™ืจ ืœื•ื™ืคืŸ ืขืก, ื•ื•ืึธืก ืื™ืŸ ื–ื™ืš ืงืึทื ื˜ืจืึทื“ื™ืงืฅ ื“ื™ ื’ืขื“ืึทื ืง ืคื•ืŸ ื’ืขืฉื•ื•ื™ื ื“ ืงืึธื ื˜ืจืึธืœื™ืจืŸ ืึท ื™ื‘ืขืจื’ืขื‘ืŸ. ืึธื“ืขืจ, ืื•ื™ื‘ ืื™ืจ ืงืึทืฉ ื“ื™ ืฉืคึผื•ืจ ืจืขื–ื•ืœื˜ืึทื˜ ื–ื™ืš, ื“ื™ ืกืึทื‘ืกืึทืงื•ื•ืึทื ื˜ ืจืึทื ื– ืคื•ืŸ ื“ื™ ืึทื ืึทืœื™ื–ืขืจ ืงืขืŸ ื–ื™ื™ืŸ ื“ืขืจืขื ื“ื™ืงื˜ ืื•ื™ื‘ ื“ื™ ื“ืขืคึผืขื ื“ืขื ืกื™ ืกื˜ืจื•ืงื˜ื•ืจ ืคื•ืŸ ื“ื™ ืžืงื•ืจ ื˜ืขืงืขืก ืขื ื“ืขืจื•ื ื’ืขืŸ ื ืึธืš ื“ื™ ืฉืคึผื•ืจ (ืœืžืฉืœ, ืึท ื ื™ื™ึทืข # ื™ื ืงืœื•ื“ืข ืื™ื– ืžื•ืกื™ืฃ ืฆื• ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ืžืงื•ืจ ื˜ืขืงืขืก).

ื“ืขืจื™ื‘ืขืจ, ืžื™ืจ ื˜ืึธืŸ ื ื™ืฉื˜ ืจืขืงืึธืžืขื ื“ื™ืจืŸ ื ื™ืฆืŸ ื“ื™ ื˜ืขืงืข ืจืฉื™ืžื” ื˜ืฉืขืง ืžืึธื“ืข ืžื™ื˜ ื“ื™ ืฉืคึผื•ืจ ืงืœืึธืฅ ืฆื• ืงืึธื ื˜ืจืึธืœื™ืจืŸ ืงืึทืžื™ืฅ ืึธื“ืขืจ ืฆื™ืขืŸ ืจื™ืงื•ื•ืขืก. ืื•ื™ื‘ ืื™ืจ ืงืขื ืขืŸ ืžืึทื›ืŸ ืึท ื™ื ืงืจืึทืžืขื ื˜ืึทืœ ื‘ื•ื™ืขืŸ ื•ื•ืขืŸ ืงืึธื ื˜ืจืึธืœื™ืจืŸ ืึท ื™ื‘ืขืจื’ืขื‘ืŸ, ื‘ืึทื˜ืจืึทื›ื˜ืŸ ื ื™ืฆืŸ ื“ืขื ืžืึธื“ืข ื™ื ืงืจืึทืžืขื ื˜ืึทืœ ืึทื ืึทืœื™ืกื™ืก.

ื“ื™ ืจืฉื™ืžื” ืคื•ืŸ ืžืงื•ืจ ื˜ืขืงืขืก ืคึฟืึทืจ ืึทื ืึทืœื™ืกื™ืก ืื™ื– ื’ืขืจืื˜ืขื•ื•ืขื˜ ืื™ืŸ ืึท ื˜ืขืงืกื˜ ื˜ืขืงืข ืื•ืŸ ื“ื•ืจื›ื’ืขื’ืื ื’ืขืŸ ืฆื• ื“ื™ ืึทื ืึทืœื™ื–ืขืจ ืžื™ื˜ ื“ืขื ืคึผืึทืจืึทืžืขื˜ืขืจ -S:

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

ื“ืขืจ ื˜ืขืงืข ืกืคึผืขืฆื™ืคื™ืฆื™ืจื˜ ืงืึธืจืขื•ื• ืึธื“ืขืจ ืึทื‘ืกืึธืœื•ื˜ ืคึผืึทื˜ืก ืฆื• ื˜ืขืงืขืก, ืื•ืŸ ื™ืขื“ืขืจ ื ื™ื™ึท ื˜ืขืงืข ืžื•ื–ืŸ ื–ื™ื™ืŸ ืื•ื™ืฃ ืึท ื ื™ื™ึทืข ืฉื•ืจื”. ืขืก ืื™ื– ืคึผืึทืกื™ืง ืฆื• ืกืคึผืขืฆื™ืคื™ืฆื™ืจืŸ ื ื™ื˜ ื‘ืœื•ื™ื– ื˜ืขืงืข ื ืขืžืขืŸ ืคึฟืึทืจ ืึทื ืึทืœื™ืกื™ืก, ืึธื‘ืขืจ ืื•ื™ืš ืคืึทืจืฉื™ื“ืŸ ื˜ืขืงืกื˜. ื“ืขืจ ืึทื ืึทืœื™ื–ืขืจ ื•ื•ืขื˜ ื–ืขืŸ ืึทื– ื“ืึธืก ืื™ื– ื ื™ืฉื˜ ืึท ื˜ืขืงืข ืื•ืŸ ืื™ื’ื ืึธืจื™ืจืŸ ื“ื™ ืฉื•ืจื”. ื“ืึธืก ืงืขืŸ ื–ื™ื™ืŸ ื ื•ืฆื™ืง ืคึฟืึทืจ ืงืึทืžืขื ื˜ื™ื ื’ ืื•ื™ื‘ ื˜ืขืงืขืก ื–ืขื ืขืŸ ืกืคึผืขืกื™ืคื™ืขื“ ืžืึทื ื™ื•ืึทืœื™. ืึธื‘ืขืจ, ืึธืคื˜ ืึท ืจืฉื™ืžื” ืคื•ืŸ ื˜ืขืงืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ื“ื–ืฉืขื ืขืจื™ื™ื˜ืึทื“ ื‘ืขืฉืึทืก ืึทื ืึทืœื™ืกื™ืก ืื™ืŸ ืกื™, ืœืžืฉืœ, ื“ืึธืก ืงืขืŸ ื–ื™ื™ืŸ ื˜ืขืงืขืก ืคึฟื•ืŸ ืึท ื™ื‘ืขืจื’ืขื‘ืŸ ืึธื“ืขืจ ืฆื™ืขืŸ ื‘ืขื˜ืŸ.

ืื™ืฆื˜, ื ื™ืฆืŸ ื“ืขื ืžืึธื“ืข, ืื™ืจ ืงืขื ืขืŸ ื’ืขืฉื•ื•ื™ื ื“ ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื ื™ื™ึท ืงืึธื“ ืื™ื™ื“ืขืจ ืขืก ืงื•ืžื˜ ืื™ืŸ ื“ื™ ื”ื•ื™ืคึผื˜ ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืฆื•ื•ื™ื™ึทื’. ืฆื• ืขื ืฉื•ืจ ืึทื– ื“ื™ ืกืงืึทื ื™ื ื’ ืกื™ืกื˜ืขื ืจื™ืกืคึผืึทื ื“ื– ืฆื• ืึทื ืึทืœื™ื–ืขืจ ื•ื•ืึธืจื ื™ื ื’ื–, ื“ื™ ื ื•ืฆืŸ ืคึผืœืึธื’-ืงืึทื ื•ื•ืขืจื˜ืขืจ ืคืึธืŸ ืฆื•ื’ืขื’ืขื‘ืŸ --ืึธื ื•ื•ื™ื™ึทื–ืŸ-ื•ื•ืึธืจื ื™ื ื’ื–:

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

ืžื™ื˜ ื“ืขื ืคืึธืŸ, ื“ืขืจ ืงืึทื ื•ื•ืขืจื˜ืขืจ ื•ื•ืขื˜ ืฆื•ืจื™ืงืงื•ืžืขืŸ ืึท ื ื™ื˜-ื ื•ืœ ืงืึธื“ ืื•ื™ื‘ ืขืก ื–ืขื ืขืŸ ื•ื•ืึธืจื ื™ื ื’ื– ืื™ืŸ ื“ื™ ืึทื ืึทืœื™ื–ืขืจ ื‘ืึทืจื™ื›ื˜. ื ื™ืฆืŸ ื“ื™ ืฆื•ืจื™ืงืงืขืจ ืงืึธื“, ืื™ืจ ืงืขื ืขืŸ ืคืึทืจืฉืคึผืึทืจืŸ ืึท ืคึผืจื™ืงืึธืžืžื™ื˜ ืคืึทืจื˜ืฉืขืคึผืขืŸ, ื˜ื•ืขืŸ ืึธื“ืขืจ ืฆื™ืขืŸ ื‘ืขื˜ืŸ, ืื•ืŸ ื“ื™ ื“ื–ืฉืขื ืขืจื™ื™ื˜ืึทื“ ืึทื ืึทืœื™ื–ืขืจ ื‘ืึทืจื™ื›ื˜ ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื–ืŸ, ืฉืขืจื“ ืึธื“ืขืจ ื’ืขืฉื™ืงื˜ ื“ื•ืจืš E- ื‘ืจื™ื•ื•.

ื ืื˜ื™ืฅ. ื•ื•ืขืŸ ืื™ืจ ืขืจืฉื˜ืขืจ ืึธื ื”ื™ื™ื‘ืŸ ืึทื ืึทืœื™ื™ื–ื™ื ื’ ืึท ืจืฉื™ืžื” ืคื•ืŸ ื˜ืขืงืขืก, ื“ื™ ื’ืื ืฆืข ืคึผืจื•ื™ืขืงื˜ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืึทื ืึทืœื™ื™ื–ื“, ื•ื•ื™ื™ึทืœ ื“ืขืจ ืึทื ืึทืœื™ื–ืขืจ ื“ืึทืจืฃ ื“ื–ืฉืขื ืขืจื™ื™ื˜ ืึท ื˜ืขืงืข ืคื•ืŸ โ€‹โ€‹ื“ื™ืคึผืขื ื“ืึทื ืกื™ื– ืคื•ืŸ ื“ื™ ืคึผืจื•ื™ืขืงื˜ ืžืงื•ืจ ื˜ืขืงืขืก ืื•ื™ืฃ ื“ื™ ื›ืขื“ืขืจ ื˜ืขืงืขืก. ื“ืึธืก ืื™ื– ืึท ืฉื˜ืจื™ืš ืคื•ืŸ ืึทื ืึทืœื™ื™ื–ื™ื ื’ C ืื•ืŸ C ++ ื˜ืขืงืขืก. ืื™ืŸ ื“ืขืจ ืฆื•ืงื•ื ืคึฟื˜, ื“ื™ ื“ืขืคึผืขื ื“ืขื ืกื™ ื˜ืขืงืข ืงืขื ืขืŸ ื–ื™ื™ืŸ ืงืึทืฉื˜ ืื•ืŸ ืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงื˜ ืื•ื™ื˜ืึธืžืึทื˜ื™ืฉ ื“ื•ืจืš ื“ื™ ืึทื ืึทืœื™ื–ืขืจ. ื“ื™ ืžื™ื™ึทืœืข ืคื•ืŸ โ€‹โ€‹ืงืึธื ื˜ืจืึธืœื™ืจื•ื ื’ ืงืึทืžื™ืฅ ื•ื•ืขืŸ ื ื™ืฆืŸ ื˜ืขืงืข ืจืฉื™ืžื” ืงืึธื ื˜ืจืึธืœื™ืจื•ื ื’ ืžืึธื“ืข ืื™ื‘ืขืจ ื ื™ืฆืŸ ื™ื ืงืจืึทืžืขื ื˜ืึทืœ ืึทื ืึทืœื™ืกื™ืก ืžืึธื“ืข ืื™ื– ืึทื– ืื™ืจ ื ืึธืจ ื“ืึทืจืคึฟืŸ ืฆื• ืงืึทืฉ ื“ื™ ื˜ืขืงืข ืื•ืŸ ื ื™ืฉื˜ ื“ื™ ื›ื™ื™ืคืขืฅ ื˜ืขืงืขืก.

ืึทืœื’ืขืžื™ื™ื ืข ืคึผืจื™ื ืกืึทืคึผืึทืœื– ืคื•ืŸ ืฆื™ืขืŸ ื‘ืขื˜ืŸ ืึทื ืึทืœื™ืกื™ืก

ืึทื ืึทืœื™ื™ื–ื™ื ื’ ื“ื™ ื’ืื ืฆืข ืคึผืจื•ื™ืขืงื˜ ื ืขืžื˜ ืึท ืคึผืœืึทืฅ ืคื•ืŸ ืฆื™ื™ื˜, ืึทื–ื•ื™ ืขืก ืื™ื– ื–ื™ื ืขืŸ ืฆื• ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื‘ืœื•ื™ื– ืึท ื–ื™ื›ืขืจ ื˜ื™ื™ืœ ืคื•ืŸ ืขืก. ื“ื™ ืคึผืจืึธื‘ืœืขื ืื™ื– ืึทื– ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื‘ืึทื–ื•ื ื“ืขืจ ื“ื™ ื ื™ื™ึทืข ื˜ืขืงืขืก ืคื•ืŸ ื“ื™ ืจืขืฉื˜ ืคื•ืŸ ื“ื™ ืคึผืจื•ื™ืขืงื˜ ื˜ืขืงืขืก.

ื–ืืœ ืก ืงื•ืง ื‘ื™ื™ึท ืึท ื‘ื™ื™ึทืฉืคึผื™ืœ ืคื•ืŸ ืึท ื™ื‘ืขืจื’ืขื‘ืŸ ื‘ื•ื™ื ืžื™ื˜ ืฆื•ื•ื™ื™ ืฆื•ื•ื™ื™ื’ืŸ:

ืึทื ืึทืœื™ืกื™ืก ืคื•ืŸ ืงืึทืžื™ืฅ ืื•ืŸ ืฆื™ืขืŸ ืจื™ืงื•ื•ืขืก ืื™ืŸ 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 ืžื™ืจ ื•ื•ืขืœืŸ ืงื•ืงืŸ ืื™ืŸ ืขืก ืื™ืŸ ื“ืขื˜ืึทืœ ืฉืคึผืขื˜ืขืจ. ื“ืขืจ ืคืึทืงื˜ ืื™ื– ืึทื– ื ื™ื˜ ื™ืขื“ืขืจ ืกื™ ืกืขืจื•ื•ื™ืก ื’ื™ื˜ ื“ื™ ื ื™ื™ื˜ื™ืง ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ื•ื•ืขื’ืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก ืคึฟืึทืจ ืžืขืจื“ื–ืฉื™ื ื’, ืึทื–ื•ื™ ื™ืขื“ืขืจ ืžืึธืœ ืื™ืจ ื”ืึธื‘ืŸ ืฆื• ื’ืขืคึฟื™ื ืขืŸ ื ื™ื™ึทืข ื•ื•ืขื’ืŸ ืฆื• ื‘ืึทืงื•ืžืขืŸ ื“ื™ ื“ืึทื˜ืŸ. ื“ืึธืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ื“ื™ืกืงืจื™ื™ื‘ื“ ืื™ืŸ ื“ืขื˜ืึทืœ ืื•ื ื˜ืŸ ืื™ืŸ ื™ืขื“ืขืจ ืคื•ืŸ ื“ื™ ื“ื™ืกืงืจื™ื™ื‘ื“ ื•ื•ืขื‘ ื‘ืึทื“ื™ื ื•ื ื’ืก.

ืึทื–ื•ื™, ืžื™ืจ ื”ืึธื‘ืŸ ื“ื™ ื—ื™ืœื•ืง ืฆื•ื•ื™ืฉืŸ ื“ื™ ืฆื•ื•ื™ื™ื’ืŸ, ืึธื“ืขืจ ื’ืึทื ืฅ, ืึท ืจืฉื™ืžื” ืคื•ืŸ ื˜ืขืงืข ื ืขืžืขืŸ ื•ื•ืึธืก ื–ืขื ืขืŸ ื’ืขื‘ื™ื˜ืŸ. ืื™ืฆื˜ ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื’ืขื‘ืŸ ื“ื™ ื˜ืขืงืข .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 (--ืึธื ื•ื•ื™ื™ึทื–ืŸ-ื•ื•ืึธืจื ื™ื ื’ื–). ืื•ื™ื‘ ืขืก ืื™ื– ื‘ื™ื™ึท ืžื™ื ื“ืกื˜ืขืจ ืื™ื™ืŸ ืึทื ืึทืœื™ื–ืขืจ ื•ื•ืืจืขื ื•ื ื’, ื“ื™ ื ื•ืฆืŸ ืฆื•ืจื™ืงืงื•ืžืขืŸ ืงืึธื“ ืคึผืœืึธื’-ืงืึทื ื•ื•ืขืจื˜ืขืจ ื•ื•ืขื˜ ื˜ื•ื™ืฉืŸ ืฆื• 2, ื•ื•ืึธืก ืื™ืŸ ืงืขืจ ื•ื•ืขื˜ ืžื™ื˜ื˜ื™ื™ืœืŸ ื“ื™ ืกื™ ื“ื™ื ืกื˜ ื•ื•ืขื’ืŸ ื“ืขื ื‘ื™ื™ึทื–ื™ื™ึทืŸ ืคื•ืŸ ืคึผืึธื˜ืขื ืฆื™ืขืœ ืขืจืจืึธืจืก ืื™ืŸ ื“ื™ ืฆื™ืขืŸ ื‘ืขื˜ืŸ ื˜ืขืงืขืก.

ื˜ืจืึทื•ื•ื™ืก ืกื™

ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื™ื– ื’ืขืžืื›ื˜ ื•ื•ื™ ืึท ื˜ืขืงืข .travis.yml. ืคึฟืึทืจ ืงืึทื ื•ื•ื™ื ื™ืึทื ืก, ืื™ืš ืจืขืงืึธืžืขื ื“ื™ืจืŸ ืื™ืจ ืฆื• ืฉื˜ืขืœืŸ ืึทืœืฅ ืื™ืŸ ืึท ื‘ืึทื–ื•ื ื“ืขืจ ื‘ืึทืฉ ืฉืจื™ืคื˜ ืžื™ื˜ ืคืึทื ื’ืงืฉืึทื ื– ื•ื•ืึธืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืขืจื•ืคึฟืŸ ืคึฟื•ืŸ ื“ืขืจ ื˜ืขืงืข .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ืื•ืŸ ื ื™ืฉื˜ ื‘3->ืึท3. ื•ื•ื™ื™ึทืœ ืคื•ืŸ ื“ืขื ืฉื˜ืจื™ืš, ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืจืขื›ืขื ืขืŸ ื“ื™ ื—ื™ืœื•ืง ืžื™ื˜ A3, ื•ื•ืึธืก ืื™ื– ื“ื•ื•ืงื ื“ืขืจ ืฉืคึผื™ืฅ ืคื•ืŸ ื“ื™ ืฆื•ื•ื™ื™ึทื’ ืคื•ืŸ ืึธื ื”ื™ื™ื‘.

ืขืก ืื™ื– ืื™ื™ืŸ ื•ื•ื™ื›ื˜ื™ืง ื“ืขื˜ืึทืœ ืœื™ื ืงืก - ืงืึทื˜ืฉื™ื ื’ ื“ื™ ื“ื™ืคึผืขื ื“ืึทื ืกื™ื– ืคื•ืŸ ื›ืขื“ืขืจ ื˜ืขืงืขืก ืื•ื™ืฃ ืงืึทืžืคึผื™ื™ืœื“ ืื™ื‘ืขืจื–ืขืฆื•ื ื’ ื•ื ื™ืฅ (*.c, *.cc, *.cpp, ืืื–"ื• ื•). ื“ื™ ืึทื ืึทืœื™ื–ืขืจ ืงืึทืœืงื™ืึทืœื™ื™ืฅ ื“ื™ ื“ื™ืคึผืขื ื“ืึทื ืกื™ื– ื•ื•ืขืŸ ืขืก ืื™ื– ืขืจืฉื˜ืขืจ ืœืึธื ื˜ืฉื˜ ืื™ืŸ ื“ื™ ืžืึธื“ืข ืคื•ืŸ โ€‹โ€‹ืงืึธื ื˜ืจืึธืœื™ืจื•ื ื’ ืึท ืจืฉื™ืžื” ืคื•ืŸ ื˜ืขืงืขืก ืื•ืŸ ื“ืขืžืึธืœื˜ ืกืึทื•ื•ืขืก ื–ื™ื™ ืื™ืŸ ื“ื™ .PVS-Studio Directory. Travis CI ืึทืœืึทื•ื– ืื™ืจ ืฆื• ืงืึทืฉ ืคืึธืœื“ืขืจืก, ืึทื–ื•ื™ ืžื™ืจ ื•ื•ืขืœืŸ ืจืึทื˜ืขื•ื•ืขืŸ ื“ื™ ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ ื“ืึทื˜ืŸ .PVS-Studio/:

cache:
  directories:
    - .PVS-Studio/

ื“ืขื ืงืึธื“ ื“ืึทืจืฃ ืฆื• ื–ื™ื™ืŸ ืžื•ืกื™ืฃ ืฆื• ื“ืขืจ ื˜ืขืงืข .travis.yml. ื“ืขืจ ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ ืกื˜ืึธืจื– ืคืึทืจืฉื™ื“ืŸ ื“ืึทื˜ืŸ ื’ืขื–ืืžืœื˜ ื ืึธืš ืึทื ืึทืœื™ืกื™ืก, ื•ื•ืึธืก ื•ื•ืขื˜ ื‘ืื˜ื™ื™ื˜ื™ืง ืคืึทืจื’ื™ื›ืขืจืŸ ืกืึทื‘ืกืึทืงื•ื•ืึทื ื˜ ืจืึทื ื– ืคื•ืŸ ื˜ืขืงืข ืจืฉื™ืžื” ืึทื ืึทืœื™ืกื™ืก ืึธื“ืขืจ ื™ื ืงืจืึทืžืขื ื˜ืึทืœ ืึทื ืึทืœื™ืกื™ืก. ืื•ื™ื‘ ื“ืึธืก ืื™ื– ื ื™ืฉื˜ ื’ืขื˜ืืŸ, ื“ืขืจ ืึทื ืึทืœื™ื–ืขืจ ื•ื•ืขื˜ ืึทืงืฉืœื™ ืึทื ืึทืœื™ื™ื– ืึทืœืข ื˜ืขืงืขืก ื™ืขื“ืขืจ ืžืึธืœ.

ื‘ืึทื“ื™

ื•ื•ื™ Travis CI, ื‘ืึทื“ื™ ื’ื™ื˜ ื“ื™ ืคื™ื™ื™ืงื™ื™ื˜ ืฆื• ืื•ื™ื˜ืึธืžืึทื˜ื™ืฉ ื‘ื•ื™ืขืŸ ืื•ืŸ ืคึผืจื•ื‘ื™ืจืŸ ืคึผืจืึทื“ื–ืฉืขืงืก ืกื˜ืึธืจื“ ืื•ื™ืฃ GitHub. ื ื™ื˜ ืขื ืœืขืš Travis CI, ืขืก ืื™ื– ืงืึทื ืคื™ื’ื™ืขืจื“ ืื™ืŸ ื“ื™ ื•ื•ืขื‘ ืฆื•ื‘ื™ื ื“ (ื‘ืึทืฉ ืฉื˜ื™ืฆืŸ ืื™ื– ื‘ื ื™ืžืฆื), ืึทื–ื•ื™ ืขืก ืื™ื– ื ื™ื˜ ื“ืึทืจืคึฟืŸ ืฆื• ืงืจืึธื ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื˜ืขืงืขืก ืื™ืŸ ื“ื™ ืคึผืจื•ื™ืขืงื˜.

ืขืจืฉื˜ืขืจ ืคื•ืŸ ืึทืœืข, ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืœื™ื™ื’ืŸ ืึท ื ื™ื™ึทืข ืงืึทืžืฃ ืฆื• ื“ื™ ืคึฟืึทืจื–ืึทืžืœื•ื ื’ ืฉื•ืจื”:

ืึทื ืึทืœื™ืกื™ืก ืคื•ืŸ ืงืึทืžื™ืฅ ืื•ืŸ ืฆื™ืขืŸ ืจื™ืงื•ื•ืขืก ืื™ืŸ Travis CI, Buddy ืื•ืŸ AppVeyor ื ื™ืฆืŸ PVS-Studio
ืœืึธืžื™ืจ ืึธื ื•ื•ื™ื™ึทื–ืŸ ื“ืขื ืงืึทืžืคึผื™ื™ืœืขืจ ื•ื•ืึธืก ืื™ื– ื’ืขื ื™ืฆื˜ ืฆื• ื‘ื•ื™ืขืŸ ื“ืขื ืคึผืจื•ื™ืขืงื˜. ื‘ืึทืžืขืจืงืŸ ื“ื™ ื“ืึธืงืงืขืจ ืงืึทื ื˜ื™ื™ื ืขืจ ื•ื•ืึธืก ืื™ื– ืื™ื ืกื˜ืึทืœื™ืจืŸ ืื™ืŸ ื“ืขื ืงืึทืžืฃ. ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ืขืก ืื™ื– ืึท ืกืคึผืขืฆื™ืขืœ ืงืึทื ื˜ื™ื™ื ืขืจ ืคึฟืึทืจ GCC:

ืึทื ืึทืœื™ืกื™ืก ืคื•ืŸ ืงืึทืžื™ืฅ ืื•ืŸ ืฆื™ืขืŸ ืจื™ืงื•ื•ืขืก ืื™ืŸ Travis CI, Buddy ืื•ืŸ AppVeyor ื ื™ืฆืŸ PVS-Studio
ืื™ืฆื˜ ืœืึธื–ืŸ ืื•ื ื“ื– ื™ื ืกื˜ืึทืœื™ืจืŸ PVS-Studio ืื•ืŸ ื“ื™ ื ื™ื™ื˜ื™ืง ื™ื•ื˜ื™ืœืึทื˜ื™ื–:

ืึทื ืึทืœื™ืกื™ืก ืคื•ืŸ ืงืึทืžื™ืฅ ืื•ืŸ ืฆื™ืขืŸ ืจื™ืงื•ื•ืขืก ืื™ืŸ Travis CI, Buddy ืื•ืŸ AppVeyor ื ื™ืฆืŸ PVS-Studio
ืœืืžื™ืจ ืฆื•ื’ืขื‘ืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ืฉื•ืจื•ืช ืฆื•ื ืจืขื“ืืงื˜ืืจ:

apt-get update && apt-get -y install wget gnupg jq

wget -q -O - https://files.viva64.com/etc/pubkey.txt | apt-key add -
wget -O /etc/apt/sources.list.d/viva64.list 
  https://files.viva64.com/etc/viva64.list

apt-get update && apt-get -y install pvs-studio

ืื™ืฆื˜ ืœืึธื–ืŸ ืื•ื ื“ื– ื’ื™ื™ืŸ ืฆื• ื“ื™ ืจืึทืŸ ืงื•ื•ื™ื˜ืœ (ืขืจืฉื˜ืขืจ ื™ื™ืงืึทืŸ) ืื•ืŸ ืœื™ื™ื’ืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ืงืึธื“ ืฆื• ื“ื™ ืงืึธืจืึทืกืคึผืึทื ื“ื™ื ื’ ืจืขื“ืึทืงื˜ืึธืจ ืคืขืœื“:

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 - ืึท ืงืึธืžื‘ื™ื ืึทืฆื™ืข ืคื•ืŸ โ€‹โ€‹ื ืืžืขืŸ ืื•ืŸ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ (ืœืžืฉืœ ืžืึทืงืก / ืคึผืจื•ื‘ื™ืจืŸ).

ืื™ืฆื˜ ืœืึธื–ืŸ ืื•ื ื“ื– ืจืึทื˜ืขื•ื•ืขืŸ ื“ื™ ืขื ื“ืขืจื•ื ื’ืขืŸ ื ื™ืฆืŸ ื“ื™ ืงื ืขืคึผืœ ืื•ื ื˜ืŸ ืื•ืŸ ื’ืขื‘ืŸ ืึทื ืึทืœื™ืกื™ืก ืคื•ืŸ ื“ื™ ืฆื™ืขืŸ ื‘ืขื˜ืŸ:

ืึทื ืึทืœื™ืกื™ืก ืคื•ืŸ ืงืึทืžื™ืฅ ืื•ืŸ ืฆื™ืขืŸ ืจื™ืงื•ื•ืขืก ืื™ืŸ Travis CI, Buddy ืื•ืŸ AppVeyor ื ื™ืฆืŸ PVS-Studio
ื ื™ื˜ ืขื ืœืขืš Travis CI, ืžื™ืจ ื˜ืึธืŸ ื ื™ื˜ ื“ืึทืจืคึฟืŸ ืฆื• ืกืคึผืขืฆื™ืคื™ืฆื™ืจืŸ .pvs-studio ืคึฟืึทืจ ืงืึทื˜ืฉื™ื ื’, ื–ื™ื ื˜ ื‘ืึทื“ื™ ืื•ื™ื˜ืึธืžืึทื˜ื™ืฉ ืงืึทืฉ ืึทืœืข ื˜ืขืงืขืก ืคึฟืึทืจ ืกืึทื‘ืกืึทืงื•ื•ืึทื ื˜ ืœืึธื ื˜ืฉื™ื–. ื“ืขืจื™ื‘ืขืจ, ื“ื™ ืœืขืฆื˜ืข ื–ืึทืš ืื™ื– ืฆื• ืจืึทื˜ืขื•ื•ืขืŸ ื“ื™ ืœืึธื’ื™ืŸ ืื•ืŸ ืคึผืึทืจืึธืœ ืคึฟืึทืจ PVS-Studio ืื™ืŸ ื‘ืึทื“ื™. ื ืึธืš ืฉืคึผืึธืจืŸ ื“ื™ ืขื ื“ืขืจื•ื ื’ืขืŸ, ืžื™ืจ ื•ื•ืขืœืŸ ื–ื™ื™ืŸ ืฆื•ืจื™ืง ืฆื• ืจืขืจื  - ืœื™ื ื™ืข. ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืžืึทืš ืื•ื™ืฃ ืฆื• ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ื•ื•ืขืจื™ืึทื‘ืึทืœื– ืื•ืŸ ืึทื“ื™ื ื’ ืึท ืœืึธื’ื™ืŸ ืื•ืŸ ืฉืœื™ืกืœ ืคึฟืึทืจ PVS-Studio:

ืึทื ืึทืœื™ืกื™ืก ืคื•ืŸ ืงืึทืžื™ืฅ ืื•ืŸ ืฆื™ืขืŸ ืจื™ืงื•ื•ืขืก ืื™ืŸ Travis CI, Buddy ืื•ืŸ AppVeyor ื ื™ืฆืŸ PVS-Studio
ื ืึธืš ื“ืขื, ื“ื™ ืื•ื™ืกื–ืขืŸ ืคื•ืŸ ืึท ื ื™ื™ึท ืฆื™ืขืŸ ื‘ืขื˜ืŸ ืึธื“ืขืจ ื™ื‘ืขืจื’ืขื‘ืŸ ื•ื•ืขื˜ ืฆื™ื ื’ืœ ื“ื™ ืจืขืฆืขื ื–ื™ืข. ืื•ื™ื‘ ืึท ืงืึทืžื™ื˜ ื›ึผื•ืœืœ ืขืจืจืึธืจืก, ื‘ืึทื“ื™ ื•ื•ืขื˜ ืึธื ื•ื•ื™ื™ึทื–ืŸ ื“ืขื ืื•ื™ืฃ ื“ื™ ืฆื™ืขืŸ ื‘ืขื˜ืŸ ื‘ืœืึทื˜.

AppVeyor

ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ืึทืคึผื•ื•ื™ื™ืึธืจ ืื™ื– ืขื ืœืขืš ืฆื• ื‘ืึทื“ื™, ื•ื•ื™ื™ึทืœ ืึทืœืฅ ื›ืึทืคึผืึทื ื– ืื™ืŸ ื“ื™ ื•ื•ืขื‘ ืฆื•ื‘ื™ื ื“ ืื•ืŸ ืขืก ืื™ื– ื ื™ื˜ ื“ืึทืจืคึฟืŸ ืฆื• ืœื™ื™ื’ืŸ ืึท *.yml ื˜ืขืงืข ืฆื• ื“ื™ ืคึผืจื•ื™ืขืงื˜ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™.

ืœืึธืžื™ืจ ื’ื™ื™ืŸ ืฆื• ื“ื™ ืกืขื˜ื˜ื™ื ื’ืก ืงื•ื•ื™ื˜ืœ ืื™ืŸ ื“ื™ ืคึผืจื•ื™ืขืงื˜ ืื™ื‘ืขืจื‘ืœื™ืง:

ืึทื ืึทืœื™ืกื™ืก ืคื•ืŸ ืงืึทืžื™ืฅ ืื•ืŸ ืฆื™ืขืŸ ืจื™ืงื•ื•ืขืก ืื™ืŸ Travis CI, Buddy ืื•ืŸ AppVeyor ื ื™ืฆืŸ PVS-Studio
ืœืึธืžื™ืจ ืžืขื’ื™ืœืข ืึทืจืึธืคึผ ื“ืขื ื‘ืœืึทื˜ ืื•ืŸ ื’ืขื‘ืŸ ืงืึทืฉ ืฉืคึผืึธืจืŸ ืคึฟืึทืจ ืงืึทืœืขืงื˜ื™ื ื’ ืฆื™ืขืŸ ืจื™ืงื•ื•ืขืก:

ืึทื ืึทืœื™ืกื™ืก ืคื•ืŸ ืงืึทืžื™ืฅ ืื•ืŸ ืฆื™ืขืŸ ืจื™ืงื•ื•ืขืก ืื™ืŸ Travis CI, Buddy ืื•ืŸ AppVeyor ื ื™ืฆืŸ PVS-Studio
ืื™ืฆื˜ ืœืึธื–ืŸ ืื•ื ื“ื– ื’ื™ื™ืŸ ืฆื• ื“ื™ ืกื•ื•ื™ื•ื•ืข ืงื•ื•ื™ื˜ืœ, ื•ื•ื• ืžื™ืจ ืกืคึผืขืฆื™ืคื™ืฆื™ืจืŸ ื“ื™ ื‘ื™ืœื“ ืคึฟืึทืจ ืคึฟืึทืจื–ืึทืžืœื•ื ื’ ืื•ืŸ ื“ื™ ื ื™ื™ื˜ื™ืง ื™ื ื•ื•ื™ื™ืจืึทื ืžืขื ืึทืœ ื•ื•ืขืจื™ืึทื‘ืึทืœื–:

ืึทื ืึทืœื™ืกื™ืก ืคื•ืŸ ืงืึทืžื™ืฅ ืื•ืŸ ืฆื™ืขืŸ ืจื™ืงื•ื•ืขืก ืื™ืŸ Travis CI, Buddy ืื•ืŸ AppVeyor ื ื™ืฆืŸ PVS-Studio
ืื•ื™ื‘ ืื™ืจ ื”ืึธื˜ ืœื™ื™ืขื ืขืŸ ื“ื™ ืคืจื™ืขืจื“ื™ืงืข ืกืขืงืฉืึทื ื–, ืื™ืจ ื–ืขื ื˜ ื–ื™ื™ืขืจ ื‘ืึทืงืึทื ื˜ ืžื™ื˜ ื“ื™ ืฆื•ื•ื™ื™ ื•ื•ืขืจื™ืึทื‘ืึทืœื– - PVS_KEY ะธ PVS_USERNAME. ืื•ื™ื‘ ื ื™ื˜, ืœืึธื–ืŸ ืžื™ืจ ื“ืขืจืžืึธื ืขืŸ ืื™ืจ ืึทื– ื–ื™ื™ ื–ืขื ืขืŸ ื ื™ื™ื˜ื™ืง ืฆื• ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ื“ื™ ื“ืขืจืœื•ื™ื‘ืขื ื™ืฉ ืคื•ืŸ ื“ื™ PVS-Studio ืึทื ืึทืœื™ื–ืขืจ. ืžื™ืจ ื•ื•ืขืœืŸ ื–ื™ื™ ื•ื•ื™ื“ืขืจ ื–ืขืŸ ืื™ืŸ ื‘ืึทืฉ ืกืงืจื™ืคึผืก ืื™ืŸ ื“ืขืจ ืฆื•ืงื•ื ืคึฟื˜.

ืื•ื™ืฃ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ื‘ืœืึทื˜ ืื•ื ื˜ืŸ ืžื™ืจ ืึธื ื•ื•ื™ื™ึทื–ืŸ ื“ื™ ื˜ืขืงืข ืคึฟืึทืจ ืงืึทื˜ืฉื™ื ื’:

ืึทื ืึทืœื™ืกื™ืก ืคื•ืŸ ืงืึทืžื™ืฅ ืื•ืŸ ืฆื™ืขืŸ ืจื™ืงื•ื•ืขืก ืื™ืŸ Travis CI, Buddy ืื•ืŸ AppVeyor ื ื™ืฆืŸ PVS-Studio
ืื•ื™ื‘ ืžื™ืจ ื˜ืึธืŸ ื ื™ื˜ ื˜ืึธืŸ ื“ืึธืก, ืžื™ืจ ื•ื•ืขืœืŸ ืึทื ืึทืœื™ื™ื– ื“ื™ ื’ืื ืฆืข ืคึผืจื•ื™ืขืงื˜ ืึทื ืฉื˜ืึธื˜ ืคื•ืŸ ืึท ืคึผืึธืจ ืคื•ืŸ ื˜ืขืงืขืก, ืึธื‘ืขืจ ืžื™ืจ ื•ื•ืขืœืŸ ื‘ืึทืงื•ืžืขืŸ ื“ื™ ืจืขื–ื•ืœื˜ืึทื˜ ืคื•ืŸ ื“ื™ ืกืคึผืขืกืึทืคื™ื™ื“ ื˜ืขืงืขืก. ื“ืขืจื™ื‘ืขืจ, ืขืก ืื™ื– ื•ื•ื™ื›ื˜ื™ืง ืฆื• ืึทืจื™ื™ึทืŸ ื“ื™ ืจื™ื›ื˜ื™ืง ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ ื ืึธืžืขืŸ.

ืื™ืฆื˜ ืขืก ืื™ื– ืฆื™ื™ื˜ ืคึฟืึทืจ ื“ื™ ืฉืจื™ืคื˜ ืฆื• ืคึผืจื•ื‘ื™ืจืŸ. ืขืคึฟืขื ืขืŸ ื“ื™ ื˜ืขืกืฅ ืงื•ื•ื™ื˜ืœ ืื•ืŸ ืกืขืœืขืงื˜ื™ืจืŸ ืกืงืจื™ืคึผื˜:

ืึทื ืึทืœื™ืกื™ืก ืคื•ืŸ ืงืึทืžื™ืฅ ืื•ืŸ ืฆื™ืขืŸ ืจื™ืงื•ื•ืขืก ืื™ืŸ Travis CI, Buddy ืื•ืŸ AppVeyor ื ื™ืฆืŸ PVS-Studio
ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืคึผืึทืคึผ ื“ื™ ืคืืœื’ืขื ื“ืข ืงืึธื“ ืื™ืŸ ื“ืขื ืคืึธืจืขื:

sudo apt-get update && sudo apt-get -y install jq

wget -q -O - https://files.viva64.com/etc/pubkey.txt 
  | sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list 
  https://files.viva64.com/etc/viva64.list

sudo apt-get update && sudo apt-get -y install pvs-studio

pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY

PWD=$(pwd -L)
if [ "$APPVEYOR_PULL_REQUEST_NUMBER" != '' ]; then
  PULL_REQUEST_ID="pulls/$APPVEYOR_PULL_REQUEST_NUMBER"
  MERGE_BASE=`wget -qO - 
    https://api.github.com/repos/${APPVEYOR_REPO_NAME}/${PULL_REQUEST_ID} 
    | jq -r ".base.ref"`

  git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
  pvs-studio-analyzer analyze -j8 
                              -o PVS-Studio.log 
                              --disableLicenseExpirationCheck 
                              --dump-files --dump-log pvs-dump.log 
                              -S .pvs-pr.list
else
  pvs-studio-analyzer analyze -j8 
                              -o PVS-Studio.log 
                              --disableLicenseExpirationCheck
fi

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

ืœืึธืžื™ืจ ื‘ืึทืฆืึธืœืŸ ื•ืคืžืขืจืงื–ืึทืžืงื™ื™ื˜ ืฆื• ื“ื™ ืคืืœื’ืขื ื“ืข ื˜ื™ื™ืœ ืคื•ืŸ ื“ื™ ืงืึธื“:

PWD=$(pwd -L)
if [ "$APPVEYOR_PULL_REQUEST_NUMBER" != '' ]; then
  PULL_REQUEST_ID="pulls/$APPVEYOR_PULL_REQUEST_NUMBER"
  MERGE_BASE=`wget -qO - 
   https://api.github.com/repos/${APPVEYOR_REPO_NAME}/${PULL_REQUEST_ID} 
   | jq -r ".base.ref"`

  git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
  pvs-studio-analyzer analyze -j8 
                              -o PVS-Studio.log 
                              --disableLicenseExpirationCheck 
                              --dump-files --dump-log pvs-dump.log 
                              -S .pvs-pr.list
else
  pvs-studio-analyzer analyze -j8 
                              -o PVS-Studio.log 
                              --disableLicenseExpirationCheck
fi

ื“ื™ ื’ืึทื ืฅ ืกืคึผืขืฆื™ืคื™ืฉ ืึทืกื™ื™ื ืžืึทื ื˜ ืคื•ืŸ ื“ื™ ื•ื•ืขืจื˜ ืคื•ืŸ ื“ื™ pwd ื‘ืึทืคึฟืขืœ ืฆื• ืึท ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง ื•ื•ืึธืก ื–ืึธืœ ืงืจืึธื ื“ืขื ืคืขืœื™ืงื™ื™ึทื˜ ื•ื•ืขืจื˜ ืžื™ื™ื ื˜ ืžืึธื“ื ืข ื‘ื™ื™ึท ืขืจืฉื˜ืขืจ ื‘ืœื™ืง, ืึธื‘ืขืจ, ืื™ืš ื•ื•ืขื˜ ื“ืขืจืงืœืขืจืŸ ืึทืœืฅ ืื™ืฆื˜.

ื‘ืฉืขืช ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ื“ื™ ืึทื ืึทืœื™ื–ืขืจ ืื™ืŸ AppVeyor, ืื™ืš ื’ืขืคึผืœืึธื ื˜ืขืจื˜ ื’ืึธืจ ืžืึธื“ื ืข ื ืึทื˜ื•ืจ ืคื•ืŸ ื“ื™ ืึทื ืึทืœื™ื–ืขืจ. ืื•ื™ืฃ ื“ื™ ืื™ื™ืŸ ื”ืึทื ื˜, ืึทืœืฅ ื’ืขืืจื‘ืขื˜ ืจื™ื›ื˜ื™ืง, ืึธื‘ืขืจ ื“ื™ ืึทื ืึทืœื™ืกื™ืก ื”ืื˜ ื ื™ืฉื˜ ืึธื ื”ื™ื™ื‘ืŸ. ืื™ืš ืคืืจื‘ืจืื›ื˜ ืึท ืคึผืœืึทืฅ ืคื•ืŸ ืฆื™ื™ื˜ ืฆื• ื‘ืึทืžืขืจืงืŸ ืึทื– ืžื™ืจ ื–ืขื ืขืŸ ืื™ืŸ ื“ื™ /home/appveyor/projects/testcalc/ ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ, ืื•ืŸ ื“ืขืจ ืึทื ืึทืœื™ื–ืขืจ ืื™ื– ื–ื™ื›ืขืจ ืึทื– ืžื™ืจ ื–ืขื ืขืŸ ืื™ืŸ /opt/appveyor/build-agent/. ื“ืขืžืึธืœื˜ ืื™ืš ืื™ื™ื ื’ืขื–ืขืŸ ืึทื– ื“ื™ $ PWD ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง ืื™ื– ืœื™ื’ื ืขืจื™ืฉ ืึท ื‘ื™ืกืœ. ืคึฟืึทืจ ื“ืขื ืกื™ื‘ื”, ืื™ืš ืžืึทื ื™ื•ืึทืœื™ ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงื˜ ื–ื™ื™ืŸ ื•ื•ืขืจื˜ ืื™ื™ื“ืขืจ ืื™ืš ืึธื ื”ื™ื™ื‘ืŸ ื“ื™ ืึทื ืึทืœื™ืกื™ืก.

ืื•ืŸ ื“ืขืžืึธืœื˜ ืึทืœืฅ ืื™ื– ื•ื•ื™ ืคืจื™ืขืจ:

ืึทื ืึทืœื™ืกื™ืก ืคื•ืŸ ืงืึทืžื™ืฅ ืื•ืŸ ืฆื™ืขืŸ ืจื™ืงื•ื•ืขืก ืื™ืŸ Travis CI, Buddy ืื•ืŸ AppVeyor ื ื™ืฆืŸ PVS-Studio
ืื™ืฆื˜ ื‘ืึทื˜ืจืึทื›ื˜ืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ืคืจืึทื’ืžืขื ื˜:

PULL_REQUEST_ID="pulls/$APPVEYOR_PULL_REQUEST_NUMBER"
MERGE_BASE=`wget -qO - 
  https://api.github.com/repos/${APPVEYOR_REPO_NAME}/${PULL_REQUEST_ID} 
  | jq -r ".base.ref"`

ืื™ืŸ ืขืก ืžื™ืจ ื‘ืึทืงื•ืžืขืŸ ื“ื™ ื—ื™ืœื•ืง ืฆื•ื•ื™ืฉืŸ ื“ื™ ืฆื•ื•ื™ื™ื’ืŸ ืื™ื‘ืขืจ ื•ื•ืึธืก ื“ื™ ืฆื™ืขืŸ ื‘ืขื˜ืŸ ืื™ื– ื“ืขืจืงืœืขืจื˜. ืฆื• ื˜ืึธืŸ ื“ืึธืก, ืžื™ืจ ื“ืึทืจืคึฟืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ืกื•ื•ื™ื•ื•ืข ื•ื•ืขืจื™ืึทื‘ืึทืœื–:

  • $ APPVEYOR_PULL_REQUEST_NUMBER - ืฆื™ืขืŸ ื‘ืขื˜ืŸ ื ื•ืžืขืจ;
  • $APPVEYOR_REPO_NAME - ื‘ืึทื ื™ืฆืขืจ ื ืึธืžืขืŸ ืื•ืŸ ืคึผืจื•ื™ืขืงื˜ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™.

ืกืึธืฃ

ืคื•ืŸ ืงื•ืจืก, ืžื™ืจ ื”ืึธื‘ืŸ ื ื™ืฉื˜ ื‘ืึทื˜ืจืึทื›ื˜ ืึทืœืข ื“ื™ ืžืขื’ืœืขืš ืงืขืกื™ื™ื“ืขืจื“ื™ืง ื™ื ื˜ืึทื’ืจื™ื™ืฉืึทืŸ ื‘ืึทื“ื™ื ื•ื ื’ืก, ืึธื‘ืขืจ, ื–ื™ื™ ืึทืœืข ื”ืึธื‘ืŸ ื’ืึธืจ ืขื ืœืขืš ืึทืคึผืขืจื™ื™ื˜ื™ื ื’ ืกืคึผืขืกื™ืคื™ืงืก ืฆื• ื™ืขื“ืขืจ ืื ื“ืขืจืขืจ. ืžื™ื˜ ื“ื™ ื•ื™ืกื ืขื ืคื•ืŸ ืงืึทื˜ืฉื™ื ื’, ื™ืขื“ืขืจ ื“ื™ื ืกื˜ ืžืื›ื˜ ื–ื™ื™ืŸ ืื™ื™ื’ืขื ืข "ื•ื•ืขืœืึธืกื™ืคึผืขื“", ืึทื–ื•ื™ ืึทืœืฅ ืื™ื– ืฉื˜ืขื ื“ื™ืง ืึทื ื“ืขืจืฉ.

ืขืจื’ืขืฅ, ื•ื•ื™ ืื™ืŸ Travis-CI, ืึท ืคึผืึธืจ ืคื•ืŸ ืฉื•ืจื•ืช ืคื•ืŸ ืงืึธื“ ืื•ืŸ ืงืึทื˜ืฉื™ื ื’ ืึทืจื‘ืขื˜ ืคืœืึธืœืึทืกืœื™; ืขืจื’ืขืฅ, ื•ื•ื™ ืื™ืŸ AppVeyor, ืื™ืจ ื ืึธืจ ื“ืึทืจืคึฟืŸ ืฆื• ืกืคึผืขืฆื™ืคื™ืฆื™ืจืŸ ื“ื™ ื˜ืขืงืข ืื™ืŸ ื“ื™ ืกืขื˜ื˜ื™ื ื’ืก; ืึธื‘ืขืจ ืขืจื’ืขืฅ ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืฉืึทืคึฟืŸ ื™ื™ื ืฆื™ืง ืฉืœื™ืกืœืขืŸ ืื•ืŸ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ืื™ื‘ืขืจืฆื™ื™ื’ืŸ ื“ื™ ืกื™ืกื˜ืขื ืฆื• ื’ืขื‘ืŸ ืื™ืจ ื“ื™ ื’ืขืœืขื’ื ื”ื™ื™ื˜ ืฆื• ืึธื•ื•ื•ืขืจืจื™ื™ื˜ ื“ื™ ืงืึทืฉื˜ ืคืจืึทื’ืžืขื ื˜. ื“ืขืจื™ื‘ืขืจ, ืื•ื™ื‘ ืื™ืจ ื•ื•ื™ืœืŸ ืฆื• ืฉื˜ืขืœืŸ ืึทืŸ ืึทื ืึทืœื™ืกื™ืก ืคื•ืŸ ืฆื™ืขืŸ ืจื™ืงื•ื•ืขืก ืื•ื™ืฃ ืึท ืงืขืกื™ื™ื“ืขืจื“ื™ืง ื™ื ื˜ืึทื’ืจื™ื™ืฉืึทืŸ ื“ื™ื ืกื˜ ื•ื•ืึธืก ืื™ื– ื ื™ืฉื˜ ื“ื™ืกืงืึทืกื˜ ืื•ื™ื‘ืŸ, ืขืจืฉื˜ืขืจ ืžืึทื›ืŸ ื–ื™ื›ืขืจ ืึทื– ืื™ืจ ื•ื•ืขื˜ ื ื™ืฉื˜ ื”ืึธื‘ืŸ ืคึผืจืึธื‘ืœืขืžืก ืžื™ื˜ ืงืึทื˜ืฉื™ื ื’.

ื“ืื ืง ืื™ืจ ืคึฟืึทืจ ื“ื™ื™ืŸ ื•ืคืžืขืจืงื–ืึทืžืงื™ื™ึทื˜. ืื•ื™ื‘ ืขืคึผืขืก ื˜ื•ื˜ ื ื™ืฉื˜ ืึทืจื‘ืขื˜ืŸ, ืคื™ืœืŸ ืคืจื™ื™ ืฆื• ืฉืจื™ื™ึทื‘ืŸ ืฆื• ืื•ื ื“ื– ืื™ืŸ ืฉื˜ื™ืฆืŸ. ืžื™ืจ ื•ื•ืขืœืŸ ืจืขืงืึธืžืขื ื“ื™ืจืŸ ืื•ืŸ ื”ืขืœืคืŸ.

ืึทื ืึทืœื™ืกื™ืก ืคื•ืŸ ืงืึทืžื™ืฅ ืื•ืŸ ืฆื™ืขืŸ ืจื™ืงื•ื•ืขืก ืื™ืŸ Travis CI, Buddy ืื•ืŸ AppVeyor ื ื™ืฆืŸ PVS-Studio

ืื•ื™ื‘ ืื™ืจ ื•ื•ื™ืœืŸ ืฆื• ื˜ื™ื™ืœืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืžื™ื˜ ืึทืŸ ืขื ื’ืœื™ืฉ-ื’ืขืจืขื“ื˜ ื•ื™ืœืขื, ื‘ื™ื˜ืข ื ื•ืฆืŸ ื“ื™ ืื™ื‘ืขืจื–ืขืฆื•ื ื’ ืœื™ื ืง: ืžืึทืงืกื™ื ื–ื•ื•ื™ืึทื’ื™ื ื˜ืกืขื•ื•. ืึทื ืึทืœื™ืกื™ืก ืคื•ืŸ ืงืึทืžื™ืฅ ืื•ืŸ ืฆื™ืขืŸ ืจื™ืงื•ื•ืขืก ืื™ืŸ Travis CI, Buddy ืื•ืŸ AppVeyor ื ื™ืฆืŸ PVS-Studio.

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

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’