Skip to main content

์ฝ”๋“œ ๊ฒ€์‚ฌ ๋ถ„์„ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค

code scanning ๊ตฌ์„ฑ์„ ๋ฏธ์„ธ ์กฐ์ •ํ•˜์—ฌ ๋ถ„์„ ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

code scanning ๋ถ„์„์˜ ๋นŒ๋“œ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๋˜๋Š” ์ฝ”์–ด ๋Š˜๋ฆฌ๊ธฐ

GitHub ํ˜ธ์ŠคํŒ… ์‹คํ–‰๊ธฐ๋ฅผ code scanning ๋ถ„์„์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋Œ€ํ˜• ๋Ÿฌ๋„ˆ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์‹คํ–‰๊ธฐ๋Š” ํ‘œ์ค€ ์‹คํ–‰๊ธฐ๋ณด๋‹ค RAM, CPU, ๋””์Šคํฌ ๊ณต๊ฐ„์ด ๋” ๋งŽ์€ GitHub ํ˜ธ์ŠคํŒ… ์‹คํ–‰๊ธฐ์ž…๋‹ˆ๋‹ค. ๋Œ€ํ˜• ๋Ÿฌ๋„ˆ ๋ฐ code scanning์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋” ํฐ ์‹คํ–‰๊ธฐ ์‚ฌ์šฉ ๋ฐ ๊ธฐ๋ณธ ์„ค์ •์— ๋Œ€ํ•ด ๋Œ€ํ˜• ๋Ÿฌ๋„ˆ ๊ตฌ์„ฑํ•˜๊ธฐ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

์ž์ฒด ํ˜ธ์ŠคํŒ… ์‹คํ–‰๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ code scanning ๋ถ„์„์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์‹คํ–‰๊ธฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋˜๋Š” ์ฝ”์–ด ์ˆ˜๋ฅผ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ„์„์„ ์œ„ํ•ด ๊ณ ๊ธ‰ ์„ค์ •์œผ๋กœ CodeQL์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, CodeQL์— ๊ถŒ์žฅ๋˜๋Š” ํ•˜๋“œ์›จ์–ด ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฒ€ํ† ํ•˜์—ฌ ์ž์ฒด ํ˜ธ์ŠคํŒ… ์‹คํ–‰๊ธฐ๊ฐ€ ์ด๋Ÿฌํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ CodeQL์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ถŒ์žฅ ํ•˜๋“œ์›จ์–ด ๋ฆฌ์†Œ์Šค์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

ํ–‰๋ ฌ ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ„์„ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ

์—ฌ๋Ÿฌ ์ž‘์—…์ด ํฌํ•จ๋œ ์›Œํฌํ”Œ๋กœ์˜ ๋ถ„์„ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ํ–‰๋ ฌ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์›Œํฌํ”Œ๋กœ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์›Œํฌํ”Œ๋กœ์—์„œ ์ž‘์—… ๋ณ€ํ˜• ์‹คํ–‰์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

๊ธฐ๋ณธ CodeQL ๋ถ„์„ ์›Œํฌํ”Œ๋กœ๋Š” ์–ธ์–ด ํ–‰๋ ฌ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๊ฐ ์–ธ์–ด์˜ ๋ถ„์„์ด ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ณ ๊ธ‰ ์„ค์ •์œผ๋กœ CodeQL์„ ์‚ฌ์šฉํ•˜๊ณ  "CodeQL ์ดˆ๊ธฐํ™”" ๋‹จ๊ณ„์—์„œ ์ง์ ‘ ๋ถ„์„ํ•  ์–ธ์–ด๋ฅผ ์ง€์ •ํ•œ ๊ฒฝ์šฐ ๊ฐ ์–ธ์–ด์— ๋Œ€ํ•œ ๋ถ„์„์ด ์ˆœ์ฐจ์ ์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด ๊ตฌ์„ฑ์—์„œ๋Š” ํ–‰๋ ฌ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ณ ๊ธ‰ ์„ค์ • ์›Œํฌํ”Œ๋กœ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ๋ถ„์„ ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์ œ๋Š” ์ผ๋ถ€ ์–ธ์–ด๋Š” CodeQL ๊ณ ๊ธ‰ ์„ค์ •์œผ๋กœ ๋ถ„์„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.์˜ ์›Œํฌํ”Œ๋กœ ์ถ”์ถœ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹จ์ผ ์›Œํฌํ”Œ๋กœ์—์„œ ๋ถ„์„๋˜๋Š” ์ฝ”๋“œ์˜ ์–‘์„ ์ค„์ž…๋‹ˆ๋‹ค.

๋ถ„์„ ์‹œ๊ฐ„์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ถ„์„๋˜๋Š” ์ฝ”๋“œ์˜ ์–‘์— ๋น„๋ก€ํ•ฉ๋‹ˆ๋‹ค. ๊ณ ๊ธ‰ ์„ค์ •์œผ๋กœ CodeQL์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ•œ ๋ฒˆ์— ๋ถ„์„๋˜๋Š” ์ฝ”๋“œ์˜ ์–‘์„ ์ค„์—ฌ ๋ถ„์„ ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ œ์™ธํ•˜๊ฑฐ๋‚˜ ํ•œ ๋ฒˆ์— ์ฝ”๋“œ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ๋งŒ ๋ถ„์„ํ•˜๋Š” ์—ฌ๋Ÿฌ ์›Œํฌํ”Œ๋กœ๋กœ ๋ถ„์„์„ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Java, Kotlin, Go, C, C++, C#๊ณผ ๊ฐ™์€ ์ปดํŒŒ์ผ๋œ ์–ธ์–ด์˜ ๊ฒฝ์šฐ CodeQL์€ ์›Œํฌํ”Œ๋กœ ์‹คํ–‰ ์ค‘์— ๋นŒ๋“œ๋œ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ๋ถ„์„๋˜๋Š” ์ฝ”๋“œ์˜ ์–‘์„ ์ œํ•œํ•˜๋ ค๋ฉด run ๋ธ”๋ก์— ๊ณ ์œ ํ•œ ๋นŒ๋“œ ๋‹จ๊ณ„๋ฅผ ์ง€์ •ํ•˜์—ฌ ๋ถ„์„ํ•˜๋ ค๋Š” ์ฝ”๋“œ๋งŒ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๊ณ ์œ ์˜ ๋นŒ๋“œ ๋‹จ๊ณ„ ์ง€์ •์„ pull_request ๋ฐ push ์ด๋ฒคํŠธ์—์„œ paths ๋˜๋Š” paths-ignore ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ์—๋งŒ ์›Œํฌํ”Œ๋กœ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GitHub Actions์— ๋Œ€ํ•œ ์›Œํฌํ”Œ๋กœ ๊ตฌ๋ฌธ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜์ง€ ์•Š๊ณ  CodeQL์ด ๋ถ„์„ํ•˜๋Š” JavaScript, Python ๋ฐ TypeScript์™€ ๊ฐ™์€ ์–ธ์–ด์˜ ๊ฒฝ์šฐ ๋ถ„์„ํ•  ์ฝ”๋“œ ์–‘์„ ์ œํ•œํ•˜๋Š” ์ถ”๊ฐ€ ๊ตฌ์„ฑ ์˜ต์…˜์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฝ”๋“œ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ๊ณ ๊ธ‰ ์„ค์ • ์‚ฌ์šฉ์ž ์ง€์ •์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

CodeQL ๋ถ„์„์„ ์—ฌ๋Ÿฌ ์›Œํฌํ”Œ๋กœ๋กœ ๋ถ„ํ• ํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๋Š” schedule์—์„œ ์‹คํ–‰๋˜๋Š” ์›Œํฌํ”Œ๋กœ๋ฅผ ํ•˜๋‚˜ ์ด์ƒ ๋ณด์œ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. CodeQL์€(๋Š”) ๊ตฌ์„ฑ ์š”์†Œ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋ถ„์„ํ•˜๋ฏ€๋กœ ์ผ๋ถ€ ๋ณต์žกํ•œ ๋ณด์•ˆ ๋™์ž‘์€ ์ „์ฒด ๋นŒ๋“œ์—์„œ๋งŒ ๊ฒ€์ƒ‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

schedule ์ด๋ฒคํŠธ ์ค‘์—๋งŒ ์‹คํ–‰

๋ถ„์„์ด push ๋˜๋Š” pull_request ์ด๋ฒคํŠธ ์ค‘ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด schedule ์ด๋ฒคํŠธ์—์„œ๋งŒ ํŠธ๋ฆฌ๊ฑฐ๋˜๋„๋ก ๋ถ„์„์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CodeQL์„ code scanning ๋ถ„์„์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ณ ๊ธ‰ ์„ค์น˜ ์›Œํฌํ”Œ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ธฐ๋ณธ ์„ค์ •์—์„œ๋Š” ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GitHub Actions ์ดํ•ด์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

์›Œํฌํ”Œ๋กœ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ฟผ๋ฆฌ ๋˜๋Š” ๊ทœ์น™ ํ™•์ธ

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

CodeQL์—๋Š” ๊ฐ ์–ธ์–ด์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐœ์˜ ๊ธฐ๋ณธ ์ฟผ๋ฆฌ ๋„๊ตฌ ๋ชจ์Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋นŒ๋“œ๋ฅผ ์ตœ์ ํ™”ํ–ˆ๋Š”๋ฐ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ์—ฌ์ „ํžˆ ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๊ฒฝ์šฐ ์‹คํ–‰ํ•˜๋Š” ์ฟผ๋ฆฌ ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ฟผ๋ฆฌ ๋„๊ตฌ ๋ชจ์Œ์€ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ ํ’ˆ์งˆ๊ณผ ์†๋„ ์‚ฌ์ด์—์„œ ๊ฐ€๋Šฅํ•œ ์ตœ์ƒ์˜ ์ ˆ์ถฉ์•ˆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ณ ๊ธ‰ ์„ค์ •์œผ๋กœ CodeQL์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ ์ฟผ๋ฆฌ ์™ธ์—๋„ ์ถ”๊ฐ€ ์ฟผ๋ฆฌ ๋˜๋Š” ์ฟผ๋ฆฌ ๋„๊ตฌ ๋ชจ์Œ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›Œํฌํ”Œ๋กœ๊ฐ€ queries ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•  ์ถ”๊ฐ€ ์ฟผ๋ฆฌ ๋„๊ตฌ ๋ชจ์Œ ๋˜๋Š” ์ถ”๊ฐ€ ์ฟผ๋ฆฌ๋ฅผ ์ •์˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์ฟผ๋ฆฌ ๋„๊ตฌ ๋ชจ์Œ ๋˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์„ค์ •ํ•˜์—ฌ ์‹คํ—˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฝ”๋“œ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ๊ณ ๊ธ‰ ์„ค์ • ์‚ฌ์šฉ์ž ์ง€์ •์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.