PVS-Studio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI, Buddy ๋ฐ AppVeyor์˜ ์ปค๋ฐ‹ ๋ฐ ํ’€ ์š”์ฒญ ๋ถ„์„

PVS-Studio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI, Buddy ๋ฐ AppVeyor์˜ ์ปค๋ฐ‹ ๋ฐ ํ’€ ์š”์ฒญ ๋ถ„์„
Linux ๋ฐ macOS์˜ C ๋ฐ C++ ์–ธ์–ด์šฉ PVS-Studio ๋ถ„์„๊ธฐ ๋ฒ„์ „ 7.04๋ถ€ํ„ฐ ์ง€์ •๋œ ํŒŒ์ผ ๋ชฉ๋ก์„ ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ ์˜ต์…˜์ด ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ƒˆ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปค๋ฐ‹๊ณผ ํ’€ ์š”์ฒญ์„ ํ™•์ธํ•˜๋„๋ก ๋ถ„์„๊ธฐ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” Travis CI, Buddy ๋ฐ AppVeyor์™€ ๊ฐ™์€ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” CI(์ง€์†์  ํ†ตํ•ฉ) ์‹œ์Šคํ…œ์—์„œ GitHub ํ”„๋กœ์ ํŠธ์˜ ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ ๋ชฉ๋ก ํ™•์ธ์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ๋ชฉ๋ก ํ™•์ธ ๋ชจ๋“œ

PVS-์ŠคํŠœ๋””์˜ค C, C++, C# ๋ฐ Java๋กœ ์ž‘์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ ์†Œ์Šค ์ฝ”๋“œ์˜ ์˜ค๋ฅ˜์™€ ์ž ์žฌ์ ์ธ ์ทจ์•ฝ์ ์„ ์‹๋ณ„ํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. Windows, Linux ๋ฐ macOS์˜ 64๋น„ํŠธ ์‹œ์Šคํ…œ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

Linux ๋ฐ macOS์šฉ PVS-Studio 7.04 ๋ฒ„์ „์—๋Š” ์†Œ์Šค ํŒŒ์ผ ๋ชฉ๋ก์„ ํ™•์ธํ•˜๋Š” ๋ชจ๋“œ๊ฐ€ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋นŒ๋“œ ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. compile_commands.json. ๋ถ„์„๊ธฐ๊ฐ€ ์ง€์ •๋œ ํŒŒ์ผ์˜ ์ปดํŒŒ์ผ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ ์‹œ์Šคํ…œ์ด compile_commands.json ํŒŒ์ผ ์ƒ์„ฑ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณฐ.

๋˜ํ•œ ํŒŒ์ผ ๋ชฉ๋ก ํ™•์ธ ๋ชจ๋“œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์‹คํ–‰์˜ strace ์ถ”์  ๋กœ๊ทธ(pvs-studio-analyzer ์ถ”์ )์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ๋จผ์ € ํ”„๋กœ์ ํŠธ์˜ ์ „์ฒด ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ด๋ฅผ ์ถ”์ ํ•˜์—ฌ ๋ถ„์„๊ธฐ๊ฐ€ ๊ฒ€์‚ฌ ์ค‘์ธ ๋ชจ๋“  ํŒŒ์ผ์˜ ์ปดํŒŒ์ผ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ „์ฒด ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด ์˜ต์…˜์—๋Š” ์‹ฌ๊ฐํ•œ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์ „์ฒด ํ”„๋กœ์ ํŠธ์˜ ์ „์ฒด ๋นŒ๋“œ ์ถ”์ ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋ฉฐ, ์ด๋Š” ๊ทธ ์ž์ฒด๋กœ ์ปค๋ฐ‹์„ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•œ๋‹ค๋Š” ์•„์ด๋””์–ด์™€ ๋ชจ์ˆœ๋ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ์ถ”์  ๊ฒฐ๊ณผ ์ž์ฒด๋ฅผ ์บ์‹œํ•˜๋Š” ๊ฒฝ์šฐ ์ถ”์  ํ›„ ์†Œ์Šค ํŒŒ์ผ์˜ ์ข…์†์„ฑ ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ถ„์„๊ธฐ์˜ ํ›„์† ์‹คํ–‰์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ์†Œ์Šค ํŒŒ์ผ ์ค‘ ํ•˜๋‚˜์— ์ƒˆ๋กœ์šด #include๊ฐ€ ์ถ”๊ฐ€๋จ).

๋”ฐ๋ผ์„œ ์ปค๋ฐ‹์ด๋‚˜ ํ’€ ์š”์ฒญ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ถ”์  ๋กœ๊ทธ์™€ ํ•จ๊ป˜ ํŒŒ์ผ ๋ชฉ๋ก ํ™•์ธ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ปค๋ฐ‹์„ ํ™•์ธํ•  ๋•Œ ์ฆ๋ถ„ ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ชจ๋“œ ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•˜์„ธ์š”. ์ฆ๋ถ„ ๋ถ„์„.

๋ถ„์„์„ ์œ„ํ•œ ์†Œ์Šค ํŒŒ์ผ ๋ชฉ๋ก์€ ํ…์ŠคํŠธ ํŒŒ์ผ๋กœ ์ €์žฅ๋˜๋ฉฐ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ„์„๊ธฐ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. -S:

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

์ด ํŒŒ์ผ์€ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ƒ๋Œ€ ๋˜๋Š” ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜๋ฉฐ ๊ฐ๊ฐ์˜ ์ƒˆ ํŒŒ์ผ์€ ์ƒˆ ์ค„์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ถ„์„์„ ์œ„ํ•œ ํŒŒ์ผ๋ช…๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค์–‘ํ•œ ํ…์ŠคํŠธ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ถ„์„๊ธฐ๋Š” ์ด๊ฒƒ์ด ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  ํ•ด๋‹น ํ–‰์„ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ์ˆ˜๋™์œผ๋กœ ์ง€์ •ํ•œ ๊ฒฝ์šฐ ์ฃผ์„์„ ๋‹ฌ ๋•Œ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ CI ๋ถ„์„ ์ค‘์— ํŒŒ์ผ ๋ชฉ๋ก์ด ์ƒ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋Ÿฌํ•œ ํŒŒ์ผ์€ ์ปค๋ฐ‹ ๋˜๋Š” ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์˜ ํŒŒ์ผ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์ด ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒˆ ์ฝ”๋“œ๊ฐ€ ๊ธฐ๋ณธ ๊ฐœ๋ฐœ ๋ถ„๊ธฐ์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šค์บ๋‹ ์‹œ์Šคํ…œ์ด ๋ถ„์„๊ธฐ ๊ฒฝ๊ณ ์— ์‘๋‹ตํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ํ”Œ๋กœ๊ทธ ๋ณ€ํ™˜๊ธฐ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ถ”๊ฐ€๋จ --๊ฒฝ๊ณ  ํ‘œ์‹œ:

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

์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ถ„์„๊ธฐ ๋ณด๊ณ ์„œ์— ๊ฒฝ๊ณ ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ณ€ํ™˜๊ธฐ๊ฐ€ XNUMX์ด ์•„๋‹Œ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์ „ ์ปค๋ฐ‹ ํ›„ํฌ, ์ปค๋ฐ‹ ๋˜๋Š” ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์„ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ƒ์„ฑ๋œ ๋ถ„์„๊ธฐ ๋ณด๊ณ ์„œ๋ฅผ ํ‘œ์‹œ, ๊ณต์œ ํ•˜๊ฑฐ๋‚˜ ์ด๋ฉ”์ผ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”๋ชจ. ์ฒ˜์Œ ํŒŒ์ผ ๋ชฉ๋ก ๋ถ„์„์„ ์‹œ์ž‘ํ•˜๋ฉด ์ „์ฒด ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ถ„์„๋ฉ๋‹ˆ๋‹ค. ๋ถ„์„๊ธฐ๋Š” ํ—ค๋” ํŒŒ์ผ์— ๋Œ€ํ•œ ํ”„๋กœ์ ํŠธ ์†Œ์Šค ํŒŒ์ผ์˜ ์ข…์†์„ฑ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. C, C++ ํŒŒ์ผ์„ ๋ถ„์„ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์•ž์œผ๋กœ๋Š” ์ข…์†์„ฑ ํŒŒ์ผ์„ ์บ์‹œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ถ„์„๊ธฐ์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ์ฆ๋ถ„ ๋ถ„์„ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํŒŒ์ผ ๋ชฉ๋ก ๊ฒ€์‚ฌ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ปค๋ฐ‹์„ ๊ฒ€์‚ฌํ•˜๋ฉด ๊ฐœ์ฒด ํŒŒ์ผ์ด ์•„๋‹Œ ํ•ด๋‹น ํŒŒ์ผ๋งŒ ์บ์‹œํ•˜๋ฉด ๋œ๋‹ค๋Š” ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ’€ ์š”์ฒญ ๋ถ„์„์˜ ์ผ๋ฐ˜ ์›์น™

์ „์ฒด ํ”„๋กœ์ ํŠธ๋ฅผ ๋ถ„์„ํ•˜๋ ค๋ฉด ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฌ๋ฏ€๋กœ ํŠน์ • ๋ถ€๋ถ„๋งŒ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ƒˆ ํŒŒ์ผ์„ ๋‚˜๋จธ์ง€ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ๊ณผ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‘ ๊ฐœ์˜ ๋ถ„๊ธฐ๊ฐ€ ์žˆ๋Š” ์ปค๋ฐ‹ ํŠธ๋ฆฌ์˜ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

PVS-Studio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI, Buddy ๋ฐ AppVeyor์˜ ์ปค๋ฐ‹ ๋ฐ ํ’€ ์š”์ฒญ ๋ถ„์„

์ปค๋ฐ‹์„ ์ƒ์ƒํ•ด ๋ด…์‹œ๋‹ค A1 ์ด๋ฏธ ํ…Œ์ŠคํŠธ๋œ ์ƒ๋‹นํžˆ ๋งŽ์€ ์–‘์˜ ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ๊ธˆ ๋” ์ผ์ฐ ์ปค๋ฐ‹์—์„œ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. A1 ์ผ๋ถ€ ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๋‹น์‹ ์€ ๊ทธ ํ›„์— A1 ๋‘ ๊ฐœ์˜ ์ปค๋ฐ‹์ด ๋” ๋ฐœ์ƒํ–ˆ์ง€๋งŒ ์ด๊ฒƒ๋„ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์˜ ํ•ฉ๋ณ‘์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์„์‚ฌ. ๊ทธ๋ฆฌ๊ณ  ์ด์ œ ๋•Œ๊ฐ€ ์™”์Šต๋‹ˆ๋‹ค. ํ•ซํ”ฝ์Šค ์ค€๋น„๊ฐ€ ๋œ. ๊ทธ๋ž˜์„œ ํ•ฉ๋ณ‘ ์š”์ฒญ์ด ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค B3 ะธ A3.

๋ฌผ๋ก  ํ•ฉ๋ณ‘ ๊ฒฐ๊ณผ ์ „์ฒด๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๊ฒ ์ง€๋งŒ, ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ์ด ๋ช‡ ๊ฐœ์— ๋ถˆ๊ณผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ๋งŽ์ด ๊ฑธ๋ฆฌ๊ณ  ์ •๋‹นํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณ€๊ฒฝ๋œ ๊ฒƒ๋งŒ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ด๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ๋งˆ์Šคํ„ฐ๋กœ ๋ณ‘ํ•ฉํ•˜๋ ค๋Š” ๋ธŒ๋žœ์น˜์˜ HEAD์— ์žˆ๋Š” ๋ธŒ๋žœ์น˜ ๊ฐ„์˜ ์ฐจ์ด์ ์„ ์–ป์Šต๋‹ˆ๋‹ค.

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 (--๊ฒฝ๊ณ  ํ‘œ์‹œ). ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ถ„์„๊ธฐ ๊ฒฝ๊ณ ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฐ˜ํ™˜ ์ฝ”๋“œ ํ”Œ๋กœ๊ทธ ๋ณ€ํ™˜๊ธฐ 2๋กœ ๋ณ€๊ฒฝ๋˜์–ด CI ์„œ๋น„์Šค์— ํ’€ ์š”์ฒญ ํŒŒ์ผ์— ์ž ์žฌ์ ์ธ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Œ์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

ํŠธ๋ž˜๋น„์Šค CI

๊ตฌ์„ฑ์€ ํŒŒ์ผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. .travis.yml. ํŽธ์˜๋ฅผ ์œ„ํ•ด ํŒŒ์ผ์—์„œ ํ˜ธ์ถœ๋  ํ•จ์ˆ˜๊ฐ€ ํฌํ•จ๋œ ๋ณ„๋„์˜ bash ์Šคํฌ๋ฆฝํŠธ์— ๋ชจ๋“  ๊ฒƒ์„ ๋„ฃ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. .travis.yml (bash ์Šคํฌ๋ฆฝํŠธ_์ด๋ฆ„.sh ํ•จ์ˆ˜_์ด๋ฆ„).

์Šคํฌ๋ฆฝํŠธ์— ํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์„ธ๊ฒŒ ๋•Œ๋ฆฌ๋‹ค, ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„น์…˜์—์„œ ์„ค์น˜ ๋‹ค์Œ์„ ์ž‘์„ฑํ•ด ๋ด…์‹œ๋‹ค:

install:
  - bash .travis.sh travis_install

์ง€์นจ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ํ•˜์ดํ”ˆ์„ ์ œ๊ฑฐํ•˜์—ฌ ํ•ด๋‹น ์ง€์นจ์„ ์Šคํฌ๋ฆฝํŠธ๋กœ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ์„ ์—ด์–ด๋ณด์ž .travis.sh ํ•จ์ˆ˜์— ๋ถ„์„๊ธฐ ์„ค์ •์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋ž˜๋น„์Šค_์„ค์น˜():

travis_install() {
  wget -q -O - https://files.viva64.com/etc/pubkey.txt 
    | sudo apt-key add -
  sudo wget -O /etc/apt/sources.list.d/viva64.list 
    https://files.viva64.com/etc/viva64.list
  
  sudo apt-get update -qq
  sudo apt-get install -qq pvs-studio 
}

์ด์ œ ์„น์…˜์— ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ ๋ถ„์„ ์‹คํ–‰:

script:
  - bash .travis.sh travis_script

๊ทธ๋ฆฌ๊ณ  Bash ์Šคํฌ๋ฆฝํŠธ์—์„œ:

travis_script() {
  pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY
  
  if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
    git diff --name-only origin/HEAD > .pvs-pr.list
    pvs-studio-analyzer analyze -j8 
                                -o PVS-Studio.log 
                                -S .pvs-pr.list 
                                --disableLicenseExpirationCheck
  else
    pvs-studio-analyzer analyze -j8 
                                -o PVS-Studio.log 
                                --disableLicenseExpirationCheck
  fi
  
  plog-converter -t errorfile PVS-Studio.log --cerr -w
}

์˜ˆ๋ฅผ ๋“ค์–ด CMake์—์„œ ๋นŒ๋“œํ•œ ๊ฒฝ์šฐ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•œ ํ›„์— ์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

travis_script() {
  CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
  cmake $CMAKE_ARGS CMakeLists.txt
  make -j8
}

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

travis_script() {
  CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
  cmake $CMAKE_ARGS CMakeLists.txt
  make -j8
  
  pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY
  
  if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
    git diff --name-only origin/HEAD > .pvs-pr.list
    pvs-studio-analyzer analyze -j8 
                                -o PVS-Studio.log 
                                -S .pvs-pr.list 
                                --disableLicenseExpirationCheck
  else
    pvs-studio-analyzer analyze -j8 
                                -o PVS-Studio.log 
                                --disableLicenseExpirationCheck
  fi
  
  plog-converter -t errorfile PVS-Studio.log --cerr -w
}

์•„๋งˆ๋„ ์ด๋ฏธ ์ด๋Ÿฌํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์•Œ์•„์ฐจ๋ ธ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. $TRAVIS_PULL_REQUEST ะธ $TRAVIS_BRANCH. Travis CI๋Š” ์ด๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

  • $TRAVIS_PULL_REQUEST ํ’€ ์š”์ฒญ ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๊ทธ๋ฆ‡๋œ, ์ด๊ฒƒ์ด ์ผ๋ฐ˜ ์ง€์ ์ธ ๊ฒฝ์šฐ;
  • $TRAVIS_REPO_SLUG ํ”„๋กœ์ ํŠธ ์ €์žฅ์†Œ์˜ ์ด๋ฆ„์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์ด ํ•จ์ˆ˜์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

PVS-Studio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI, Buddy ๋ฐ AppVeyor์˜ ์ปค๋ฐ‹ ๋ฐ ํ’€ ์š”์ฒญ ๋ถ„์„
Travis CI๋Š” ๋ฐ˜ํ™˜ ์ฝ”๋“œ์— ์‘๋‹ตํ•˜๋ฏ€๋กœ ๊ฒฝ๊ณ ๊ฐ€ ์žˆ์œผ๋ฉด ์„œ๋น„์Šค๊ฐ€ ์ปค๋ฐ‹์— ์˜ค๋ฅ˜๊ฐ€ ํฌํ•จ๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜๋„๋ก ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์ด ์ฝ”๋“œ ์ค„์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

์‚ฌ์‹ค Travis CI๋Š” ํ’€ ์š”์ฒญ์„ ๋ถ„์„ํ•˜๋Š” ๋™์•ˆ ์ž๋™์œผ๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

PVS-Studio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI, Buddy ๋ฐ AppVeyor์˜ ์ปค๋ฐ‹ ๋ฐ ํ’€ ์š”์ฒญ ๋ถ„์„
๊ทธ๋Ÿฌ๋ฏ€๋กœ ์šฐ๋ฆฌ๋Š” ๋ถ„์„ํ•œ๋‹ค A4์•„๋‹ˆ๋ผ B3->A3. ์ด ๊ธฐ๋Šฅ์œผ๋กœ ์ธํ•ด ๋‹ค์Œ๊ณผ์˜ ์ฐจ์ด๋ฅผ ๊ณ„์‚ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. A3, ์ด๋Š” ์ •ํ™•ํžˆ ์—์„œ ๋ถ„๊ธฐ์˜ ์ƒ๋‹จ์ž…๋‹ˆ๋‹ค. ์ถœ๋ฐœ์ง€.

ํ•œ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋œ ๋ฒˆ์—ญ ๋‹จ์œ„(*.c, *.cc, *.cpp ๋“ฑ)์— ๋Œ€ํ•œ ํ—ค๋” ํŒŒ์ผ์˜ ์ข…์†์„ฑ์„ ์บ์‹ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ถ„์„๊ธฐ๋Š” ํŒŒ์ผ ๋ชฉ๋ก์„ ํ™•์ธํ•˜๋Š” ๋ชจ๋“œ๋กœ ์ฒ˜์Œ ์‹คํ–‰๋  ๋•Œ ์ด๋Ÿฌํ•œ ์ข…์†์„ฑ์„ ๊ณ„์‚ฐํ•œ ๋‹ค์Œ ์ด๋ฅผ .PVS-Studio ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. Travis CI๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํด๋”๋ฅผ ์บ์‹œํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. .PVS-์ŠคํŠœ๋””์˜ค/:

cache:
  directories:
    - .PVS-Studio/

์ด ์ฝ”๋“œ๋ฅผ ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. .travis.yml. ์ด ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” ๋ถ„์„ ํ›„ ์ˆ˜์ง‘๋œ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ฏ€๋กœ ํ›„์† ํŒŒ์ผ ๋ชฉ๋ก ๋ถ„์„ ๋˜๋Š” ์ฆ๋ถ„ ๋ถ„์„ ์‹คํ–‰ ์†๋„๊ฐ€ ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์œผ๋ฉด ๋ถ„์„๊ธฐ๋Š” ์‹ค์ œ๋กœ ๋งค๋ฒˆ ๋ชจ๋“  ํŒŒ์ผ์„ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.

๋™๋ฃŒ

ํŠธ๋ž˜๋น„์Šค CI์ฒ˜๋Ÿผ, ๋™๋ฃŒ GitHub์— ์ €์žฅ๋œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ž๋™์œผ๋กœ ๋นŒ๋“œํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Travis CI์™€ ๋‹ฌ๋ฆฌ ์›น ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๊ตฌ์„ฑ๋˜๋ฏ€๋กœ(bash ์ง€์› ๊ฐ€๋Šฅ) ํ”„๋กœ์ ํŠธ์— ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์šฐ์„ , ์กฐ๋ฆฝ ๋ผ์ธ์— ์ƒˆ๋กœ์šด ์ž‘์—…์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

PVS-Studio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI, Buddy ๋ฐ AppVeyor์˜ ์ปค๋ฐ‹ ๋ฐ ํ’€ ์š”์ฒญ ๋ถ„์„
ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ง€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ์ž‘์—…์— ์„ค์น˜๋œ Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, GCC๋ฅผ ์œ„ํ•œ ํŠน๋ณ„ํ•œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

PVS-Studio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI, Buddy ๋ฐ AppVeyor์˜ ์ปค๋ฐ‹ ๋ฐ ํ’€ ์š”์ฒญ ๋ถ„์„
์ด์ œ PVS-Studio์™€ ํ•„์š”ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์„ค์น˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

PVS-Studio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI, Buddy ๋ฐ AppVeyor์˜ ์ปค๋ฐ‹ ๋ฐ ํ’€ ์š”์ฒญ ๋ถ„์„
ํŽธ์ง‘๊ธฐ์— ๋‹ค์Œ ์ค„์„ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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 ์„น์…˜์„ ์ฝ์—ˆ๋‹ค๋ฉด ์ด ์ฝ”๋“œ๋Š” ์ด๋ฏธ ์ต์ˆ™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ ์ƒˆ๋กœ์šด ๋‹จ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

PVS-Studio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI, Buddy ๋ฐ AppVeyor์˜ ์ปค๋ฐ‹ ๋ฐ ํ’€ ์š”์ฒญ ๋ถ„์„
์‚ฌ์‹ค ์ด์ œ ์šฐ๋ฆฌ๋Š” ๋ณ‘ํ•ฉ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹ˆ๋ผ ํ’€ ์š”์ฒญ์ด ์ด๋ฃจ์–ด์ง„ ๋ธŒ๋žœ์น˜์˜ HEAD๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.

PVS-Studio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI, Buddy ๋ฐ AppVeyor์˜ ์ปค๋ฐ‹ ๋ฐ ํ’€ ์š”์ฒญ ๋ถ„์„
๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์กฐ๊ฑด๋ถ€ ์ปค๋ฐ‹์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. B3 ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ์ฐจ์ด์ ์„ ์–ป์–ด์•ผํ•ฉ๋‹ˆ๋‹ค A3:

PULL_REQUEST_ID="pulls/$BUDDY_EXECUTION_PULL_REQUEST_NO"
  MERGE_BASE=`wget -qO - 
    https://api.github.com/repos/${BUDDY_REPO_SLUG}/${PULL_REQUEST_ID} 
    | jq -r ".base.ref"`
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list

๊ฒฐ์ •ํ•˜๊ธฐ A3 GitHub API๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

https://api.github.com/repos/${USERNAME}/${REPO}/pulls/${PULL_REQUEST_ID}

Buddy๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋‹ค์Œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

  • $BUDDY_EXECUTION_PULL_REQEUST_NO โ€” ํ’€ ์š”์ฒญ ๋ฒˆํ˜ธ
  • $BUDDY_REPO_SLUG โ€” ์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ์ €์žฅ์†Œ์˜ ์กฐํ•ฉ(์˜ˆ: max/test)

์ด์ œ ์•„๋ž˜ ๋ฒ„ํŠผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ €์žฅํ•˜๊ณ  ํ’€ ์š”์ฒญ ๋ถ„์„์„ ํ™œ์„ฑํ™”ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

PVS-Studio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI, Buddy ๋ฐ AppVeyor์˜ ์ปค๋ฐ‹ ๋ฐ ํ’€ ์š”์ฒญ ๋ถ„์„
Travis CI์™€ ๋‹ฌ๋ฆฌ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. .pvs-์ŠคํŠœ๋””์˜ค ์บ์‹ฑ์„ ์œ„ํ•ด Buddy๋Š” ํ›„์† ์‹คํ–‰์„ ์œ„ํ•ด ๋ชจ๋“  ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ์บ์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋งˆ์ง€๋ง‰์œผ๋กœ PVS-Studio์˜ ๋กœ๊ทธ์ธ๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ Buddy์— ์ €์žฅํ•˜๋Š” ์ผ๋งŒ ๋‚จ์•˜์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ €์žฅํ•œ ํ›„ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๊ณ  PVS-Studio์— ๋Œ€ํ•œ ๋กœ๊ทธ์ธ ๋ฐ ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

PVS-Studio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI, Buddy ๋ฐ AppVeyor์˜ ์ปค๋ฐ‹ ๋ฐ ํ’€ ์š”์ฒญ ๋ถ„์„
๊ทธ ํ›„ ์ƒˆ๋กœ์šด ํ’€ ์š”์ฒญ์ด๋‚˜ ์ปค๋ฐ‹์ด ๋‚˜ํƒ€๋‚˜๋ฉด ๊ฒ€ํ† ๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์ปค๋ฐ‹์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฉด Buddy๋Š” ํ’€ ์š”์ฒญ ํŽ˜์ด์ง€์— ์ด๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

์•ฑ๋ฒ ์ด์–ด

AppVeyor ์„ค์ •์€ ๋ชจ๋“  ๊ฒƒ์ด ์›น ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ด๋ฃจ์–ด์ง€๊ณ  ํ”„๋กœ์ ํŠธ ์ €์žฅ์†Œ์— *.yml ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— Buddy์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ๊ฐœ์š”์˜ ์„ค์ • ํƒญ์œผ๋กœ ์ด๋™ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

PVS-Studio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI, Buddy ๋ฐ AppVeyor์˜ ์ปค๋ฐ‹ ๋ฐ ํ’€ ์š”์ฒญ ๋ถ„์„
์ด ํŽ˜์ด์ง€๋ฅผ ์•„๋ž˜๋กœ ์Šคํฌ๋กคํ•˜์—ฌ ํ’€ ์š”์ฒญ ์ˆ˜์ง‘์„ ์œ„ํ•œ ์บ์‹œ ์ €์žฅ์„ ํ™œ์„ฑํ™”ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

PVS-Studio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI, Buddy ๋ฐ AppVeyor์˜ ์ปค๋ฐ‹ ๋ฐ ํ’€ ์š”์ฒญ ๋ถ„์„
์ด์ œ ์–ด์…ˆ๋ธ”๋ฆฌ์šฉ ์ด๋ฏธ์ง€์™€ ํ•„์š”ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋Š” ํ™˜๊ฒฝ ํƒญ์œผ๋กœ ์ด๋™ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

PVS-Studio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI, Buddy ๋ฐ AppVeyor์˜ ์ปค๋ฐ‹ ๋ฐ ํ’€ ์š”์ฒญ ๋ถ„์„
์ด์ „ ์„น์…˜์„ ์ฝ์—ˆ๋‹ค๋ฉด ๋‹ค์Œ ๋‘ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ๋งค์šฐ ์ž˜ ์•Œ๊ณ  ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. PVS_KEY ะธ PVS_USERNAME. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ PVS-Studio ๋ถ„์„๊ธฐ์˜ ๋ผ์ด์„ผ์Šค๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐ ํ•„์š”ํ•จ์„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‚˜์ค‘์— Bash ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋‹ค์‹œ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„๋ž˜ ๊ฐ™์€ ํŽ˜์ด์ง€์— ์บ์‹ฑ ํด๋”๊ฐ€ ํ‘œ์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

PVS-Studio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI, Buddy ๋ฐ AppVeyor์˜ ์ปค๋ฐ‹ ๋ฐ ํ’€ ์š”์ฒญ ๋ถ„์„
์ด๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ช‡ ๊ฐœ์˜ ํŒŒ์ผ ๋Œ€์‹  ์ „์ฒด ํ”„๋กœ์ ํŠธ๋ฅผ ๋ถ„์„ํ•˜์ง€๋งŒ ์ง€์ •๋œ ํŒŒ์ผ์—์„œ ์ถœ๋ ฅ์„ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ฌ๋ฐ”๋ฅธ ๋””๋ ‰ํ„ฐ๋ฆฌ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ํƒญ์„ ์—ด๊ณ  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

PVS-Studio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI, Buddy ๋ฐ AppVeyor์˜ ์ปค๋ฐ‹ ๋ฐ ํ’€ ์š”์ฒญ ๋ถ„์„
์ด ์–‘์‹์— ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋ถ™์—ฌ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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 ๋ณ€์ˆ˜๊ฐ€ ์•ฝ๊ฐ„ ๊ฑฐ์ง“๋ง์„ ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ๋ถ„์„์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ํ•ด๋‹น ๊ฐ’์„ ์ˆ˜๋™์œผ๋กœ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์ด์ „๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

PVS-Studio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI, Buddy ๋ฐ AppVeyor์˜ ์ปค๋ฐ‹ ๋ฐ ํ’€ ์š”์ฒญ ๋ถ„์„
์ด์ œ ๋‹ค์Œ ๋ถ€๋ถ„์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”.

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์™€ ๊ฐ™์€ ๊ณณ์—์„œ๋Š” ์„ค์ •์—์„œ ํด๋”๋ฅผ ์ง€์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์–ด๋”˜๊ฐ€์—์„œ ๊ณ ์œ ํ•œ ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์บ์‹œ๋œ ์กฐ๊ฐ์„ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ์ œ๊ณตํ•˜๋„๋ก ์‹œ์Šคํ…œ์„ ์„ค๋“ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์—์„œ ๋…ผ์˜๋˜์ง€ ์•Š์€ ์ง€์†์ ์ธ ํ†ตํ•ฉ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ํ’€ ์š”์ฒญ ๋ถ„์„์„ ์„ค์ •ํ•˜๋ ค๋ฉด ๋จผ์ € ์บ์‹ฑ์— ๋ฌธ์ œ๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๊ด€์‹ฌ์„ ๊ฐ€์ ธ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์œผ๋ฉด ์–ธ์ œ๋“ ์ง€ ๋‹ค์Œ ์ฃผ์†Œ๋กœ ๋ฌธ์˜ํ•ด ์ฃผ์„ธ์š”. ์ง€์ง€. ์กฐ์–ธํ•˜๊ณ  ๋„์™€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

PVS-Studio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI, Buddy ๋ฐ AppVeyor์˜ ์ปค๋ฐ‹ ๋ฐ ํ’€ ์š”์ฒญ ๋ถ„์„

์ด ๊ธฐ์‚ฌ๋ฅผ ์˜์–ด๊ถŒ ์ฒญ์ค‘๊ณผ ๊ณต์œ ํ•˜๋ ค๋ฉด ๋ฒˆ์—ญ ๋งํฌ์ธ Maxim Zvyagintsev๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. PVS-Studio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis CI, Buddy ๋ฐ AppVeyor์˜ ์ปค๋ฐ‹ ๋ฐ ํ’€ ์š”์ฒญ ๋ถ„์„.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€