Skip to main content

CodeQL ๋ถ„์„์„ ์œ„ํ•œ ์ฝ”๋“œ ์ค€๋น„

์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ฐ€ ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋Œ€ํ•œ ์ฝ๊ธฐ ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž

CodeQL์€(๋Š”) ๋‹ค์Œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์œ ํ˜•์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • GitHub.com์˜ ํผ๋ธ”๋ฆญ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ, GitHub CodeQL ์‚ฌ์šฉ ์•ฝ๊ด€ ์ฐธ์กฐ
  • GitHub Code Security๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •๋œ GitHub Team์˜ ์กฐ์ง ์†Œ์œ  ๋ฆฌํฌ์ง€ํ† ๋ฆฌ

๋ถ„์„์„ ์œ„ํ•œ ์ฝ”๋“œ ์ค€๋น„ ์ •๋ณด

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

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

CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์ „ ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. CodeQL CLI(์„)๋ฅผ ์„ค์น˜ ๋ฐ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ CodeQL CLI ์„ค์ •ํ•˜๊ธฐ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.
  2. ๋ถ„์„ํ•˜๋ ค๋Š” ์ฝ”๋“œ๋ฅผ ์ฒดํฌ ์•„์›ƒํ•ฉ๋‹ˆ๋‹ค.
    • ๋ถ„๊ธฐ์˜ ๊ฒฝ์šฐ ๋ถ„์„ํ•˜๋ ค๋Š” ๋ถ„๊ธฐ์˜ ํ—ค๋“œ๋ฅผ ์ฒดํฌ ์•„์›ƒํ•ฉ๋‹ˆ๋‹ค.
    • ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์˜ ๊ฒฝ์šฐ ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์˜ ํ—ค๋“œ ์ปค๋ฐ‹์„ ์ฒดํฌ ์•„์›ƒํ•˜๊ฑฐ๋‚˜, ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์˜ GitHub ์ƒ์„ฑ ๋ณ‘ํ•ฉ ์ปค๋ฐ‹์„ ์ฒดํฌ ์•„์›ƒํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ชจ๋“  ์ข…์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  4. ์ปดํŒŒ์ผ๋œ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์ƒ์˜ ๊ฒฐ๊ณผ๋ฅผ ์–ป์œผ๋ ค๋ฉด ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ๋นŒ๋“œ ๋ช…๋ น(์žˆ๋Š” ๊ฒฝ์šฐ)์„ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด ๋ช…๋ น์€ CI ์‹œ์Šคํ…œ์˜ ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์ค€๋น„๋˜๋ฉด codeql database create(์„)๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์€ ์–ธ์–ด์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งŒ๋“ค๊ธฐ ๋ฐ ์ปดํŒŒ์ผ๋œ ์–ธ์–ด์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งŒ๋“ค๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

codeql database create ์‹คํ–‰ ์ค‘

CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ํ”„๋กœ์ ํŠธ์˜ ์ฒดํฌ ์•„์›ƒ ๋ฃจํŠธ์—์„œ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

codeql database create <database> --language=<language-identifier>

๋‹ค์Œ ํ•ญ๋ชฉ์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • <database>๋Š” ์ƒ์„ฑํ•  ์ƒˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ์ด ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค. ๊ธฐ์กด ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ง€์ •ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

  • --language: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ์— ์‚ฌ์šฉ๋˜๋Š” ์–ธ์–ด์˜ ์‹๋ณ„์ž์ž…๋‹ˆ๋‹ค. --db-cluster์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์˜ต์…˜์€ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ๋ชฉ๋ก์„ ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ ๋‘ ๋ฒˆ ์ด์ƒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CodeQL(์€)๋Š” ๋‹ค์Œ ์–ธ์–ด์šฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งŒ๋“ค๊ธฐ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

    ์–ธ์–ด์‹๋ณ„์ž์„ ํƒ์  ์–ผํ„ฐ๋„ˆํ‹ฐ๋ธŒ ์‹๋ณ„์ž(์žˆ๋Š” ๊ฒฝ์šฐ)
    C/C++c-cppc ๋˜๋Š” cpp
    C#csharp
    Gogo
    Java/Kotlinjava-kotlinjava ๋˜๋Š” kotlin
    JavaScript/TypeScriptjavascript-typescriptjavascript ๋˜๋Š” typescript
    Pythonpython
    Rubyruby
    Swiftswift
    GitHub Actions ์›Œํฌํ”Œ๋กœactions

    ์ฐธ๊ณ  ํ•ญ๋ชฉ

    ๋Œ€์ฒด ์‹๋ณ„์ž ์ค‘ ํ•˜๋‚˜๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ ํ‘œ์ค€ ์–ธ์–ด ์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด javascript ๋Œ€์‹  javascript-typescript๋ฅผ ์ง€์ •ํ•ด๋„ TypeScript ์ฝ”๋“œ์˜ ๋ถ„์„์€ ์ œ์™ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. --paths-ignore ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ๊ธ‰ ์„ค์ • ์›Œํฌํ”Œ๋กœ์—์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฝ”๋“œ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ๊ณ ๊ธ‰ ์„ค์ • ์‚ฌ์šฉ์ž ์ง€์ •์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋นŒ๋“œ ๋ช…๋ น ๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

   codeql database create <database> --command <build> \
         --language=<language-identifier>

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์˜ต์…˜

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

์˜ต์…˜ํ•„์ˆ˜์‚ฌ์šฉ
<database>CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด ๋งŒ๋“ค ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ์ด๋ฆ„๊ณผ ์œ„์น˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋ฎ์–ด์“ฐ๋ ค๊ณ  ํ•˜๋ฉด ๋ช…๋ น์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ --db-cluster๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋Š” ๋ถ€๋ชจ ๋””๋ ‰ํ„ฐ๋ฆฌ์ด๋ฉฐ ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” ๋ถ„์„๋œ ๊ฐ ์–ธ์–ด์— ๋Œ€ํ•ด ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.
--language๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค ์–ธ์–ด์˜ ์‹๋ณ„์ž๋ฅผ c-cpp, csharp, go, java-kotlin, javascript-typescript, python, ruby, swift ์ค‘ ํ•˜๋‚˜๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. --db-cluster์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์˜ต์…˜์€ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ๋ชฉ๋ก์„ ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ ๋‘ ๋ฒˆ ์ด์ƒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
--command๊ถŒ์žฅ. ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋นŒ๋“œ ๋ช…๋ น ๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์€ ํ˜„์žฌ ํด๋”์—์„œ ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ์ •์˜๋œ ๊ฒฝ์šฐ --source-root์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. Python ๋ฐ JavaScript/TypeScript ๋ถ„์„์—๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
--build-mode๊ถŒ์žฅ. --command์„ ์ œ๊ณตํ•˜์ง€ ์•Š์„ ๋•Œ C/C++, C# ๋ฐ Java๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ ์—†์ด CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ• ์ง€(none) ์•„๋‹ˆ๋ฉด ๋นŒ๋“œ ๋ช…๋ น์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๋ ค๊ณ  ์‹œ๋„ํ• ์ง€(autobuild) ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž๋™ ๋นŒ๋“œ ๊ฒ€์ƒ‰์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ ๋ชจ๋“œ ๋น„๊ต๋Š” CodeQL ๋นŒ๋“œ ๋ชจ๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
--db-cluster๋‹ค๊ตญ์–ด ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ --language์— ์˜ํ•ด ์ง€์ •๋œ ๊ฐ ์–ธ์–ด์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
--no-run-unnecessary-builds๊ถŒ์žฅ. CodeQL CLI๊ฐ€ ๋นŒ๋“œ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ์–ธ์–ด(์˜ˆ: Python ๋ฐ JavaScript/TypeScript)์˜ ๋นŒ๋“œ ๋ช…๋ น์„ ํ‘œ์‹œํ•˜์ง€ ์•Š๋Š” ๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
--source-root๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ์ฒดํฌ ์•„์›ƒ ๋ฃจํŠธ ์™ธ๋ถ€์—์„œ CLI๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ database create ๋ช…๋ น์€ ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์›๋ณธ ํŒŒ์ผ์˜ ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์œ„์น˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
--codescanning-config๊ณ ๊ธ‰. CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ดํ›„ ๋‹จ๊ณ„์—์„œ ์‹คํ–‰ํ•  ์ฟผ๋ฆฌ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฝ”๋“œ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ๊ณ ๊ธ‰ ์„ค์ • ์‚ฌ์šฉ์ž ์ง€์ • ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งŒ๋“ค๊ธฐ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

์ถ”์ถœ๊ธฐ ์˜ต์…˜์„ ์ง€์ •ํ•˜์—ฌ CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ์ถ”์ถœ๊ธฐ์˜ ๋™์ž‘์„ ์‚ฌ์šฉ์ž ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ถ”์ถœ๊ธฐ ์˜ต์…˜์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์˜ต์…˜์— ๋Œ€ํ•œ ์ „์ฒด ๋‚ด์šฉ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งŒ๋“ค๊ธฐ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹จ์ผ ์–ธ์–ด ์˜ˆ์‹œ

๋‹ค์Œ์€ /checkouts/example-repo์—์„œ ์ฒดํฌ ์•„์›ƒ๋œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋Œ€ํ•œ ๋‹จ์ผ CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. JavaScript ์ถ”์ถœ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— JavaScript ๋ฐ TypeScript ์ฝ”๋“œ์˜ ๊ณ„์ธต์  ํ‘œํ˜„์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” /codeql-dbs/example-repo์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

$ codeql database create /codeql-dbs/example-repo --language=javascript-typescript \
    --source-root /checkouts/example-repo

> Initializing database at /codeql-dbs/example-repo.
> Running command [/codeql-home/codeql/javascript/tools/autobuild.cmd]
    in /checkouts/example-repo.
> [build-stdout] Single-threaded extraction.
> [build-stdout] Extracting
...
> Finalizing database at /codeql-dbs/example-repo.
> Successfully created database at /codeql-dbs/example-repo.

๋‹ค์ค‘ ์–ธ์–ด ์˜ˆ์‹œ

๋‹ค์Œ์€ /checkouts/example-repo-multi์—์„œ ์ฒดํฌ ์•„์›ƒ๋œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋Œ€ํ•œ CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค 2๊ฐœ๋ฅผ ๋งŒ๋“œ๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • --db-cluster - ๋‘ ๊ฐœ ์ด์ƒ ์–ธ์–ด์˜ ๋ถ„์„์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
  • --language - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค ์–ธ์–ด๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • --command - ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ๋นŒ๋“œ ๋ช…๋ น์„ ๋„๊ตฌ์— ์•Œ๋ฆฝ๋‹ˆ๋‹ค(์—ฌ๊ธฐ์„œ๋Š” make).
  • --no-run-unnecessary-builds - ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์–ธ์–ด(์˜ˆ: Python)์˜ ๋นŒ๋“œ ๋ช…๋ น์„ ๊ฑด๋„ˆ๋›ฐ๋„๋ก ๋„๊ตฌ์— ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” /codeql-dbs/example-repo-multi์˜ python ๋ฐ cpp ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

$ codeql database create /codeql-dbs/example-repo-multi \
    --db-cluster --language python,c-cpp \
    --command make --no-run-unnecessary-builds \
    --source-root /checkouts/example-repo-multi
Initializing databases at /codeql-dbs/example-repo-multi.
Running build command: [make]
[build-stdout] Calling python3 /codeql-bundle/codeql/python/tools/get_venv_lib.py
[build-stdout] Calling python3 -S /codeql-bundle/codeql/python/tools/python_tracer.py -v -z all -c /codeql-dbs/example-repo-multi/python/working/trap_cache -p ERROR: 'pip' not installed.
[build-stdout] /usr/local/lib/python3.6/dist-packages -R /checkouts/example-repo-multi
[build-stdout] [INFO] Python version 3.6.9
[build-stdout] [INFO] Python extractor version 5.16
[build-stdout] [INFO] [2] Extracted file /checkouts/example-repo-multi/hello.py in 5ms
[build-stdout] [INFO] Processed 1 modules in 0.15s
[build-stdout] <output from calling 'make' to build the C/C++ code>
Finalizing databases at /codeql-dbs/example-repo-multi.
Successfully created databases at /codeql-dbs/example-repo-multi.
$

์ง„ํ–‰๋ฅ  ๋ฐ ๊ฒฐ๊ณผ

์ง€์ •ํ•œ ์˜ต์…˜์— ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ณด๊ณ ๋ฉ๋‹ˆ๋‹ค. ํ•ด์„๋œ ์–ธ์–ด์˜ ๊ฒฝ์šฐ C/C++, C# ๋ฐ Java์— --build-mode none์„ ์ง€์ •ํ•˜๋ฉด ์ถ”์ถœ ์ง„ํ–‰๋ฅ ์ด ์ฝ˜์†”์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ์›๋ณธ ํŒŒ์ผ์— ๋Œ€ํ•ด ์ฝ˜์†”์€ ์ถ”์ถœ์— ์„ฑ๊ณตํ–ˆ๋Š”์ง€ ๋˜๋Š” ์‹คํŒจํ–ˆ๋Š”์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋œ ์–ธ์–ด๊ฐ€ ๋นŒ๋“œ๋˜๋ฉด ์ฝ˜์†”์— ๋นŒ๋“œ ์‹œ์Šคํ…œ์˜ ์ถœ๋ ฅ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

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

์ปดํŒŒ์ผ๋˜์ง€ ์•Š์€ ์–ธ์–ด์šฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งŒ๋“ค๊ธฐ

CodeQL CLI์—๋Š” ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์€ ์–ธ์–ด, ํŠนํžˆ JavaScript(๋ฐ TypeScript), Python ๋ฐ Ruby์šฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ์ถ”์ถœ๊ธฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ถ”์ถœ๊ธฐ๋Š” JavaScript, Python ๋˜๋Š” Ruby๋ฅผ --language ์˜ต์…˜์œผ๋กœ ์ง€์ •ํ•˜๊ณ  database create(์„)๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด๋“ค ์–ธ์–ด์šฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ๋Š” ์ถ”๊ฐ€์ ์ธ ์ข…์†์„ฑ์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ  ํ•ญ๋ชฉ

JavaScript, TypeScript, Python ๋ฐ Ruby์šฉ์œผ๋กœ database create๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ --command ์˜ต์…˜์„ ์ง€์ •ํ•ด์„  ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ผ๋ฐ˜ ์ถ”์ถœ๊ธฐ ํ˜ธ์ถœ์„ ์žฌ์ •์˜ํ•˜์—ฌ ๋นˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์–ธ์–ด์šฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ปดํŒŒ์ผ๋œ ์–ธ์–ด์ธ ๊ฒฝ์šฐ, --no-run-unnecessary-builds ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ์–ธ์–ด์— ๋Œ€ํ•œ ๋ช…๋ น์„ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.

JavaScript ๋ฐ TypeScript

JavaScript์šฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ๋Š” ์ถ”๊ฐ€ ์ข…์†์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ํ”„๋กœ์ ํŠธ์— TypeScript ํŒŒ์ผ์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ Node.js 14 ์ด์ƒ์ด ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•˜๋ฉฐ PATH์—์„œ node๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์ค„์—์„œ JavaScript ๋ฐ TypeScript ํŒŒ์ผ์„ ๋ชจ๋‘ ์ถ”์ถœํ•˜๋„๋ก --language=javascript-typescript(์„)๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

codeql database create --language=javascript-typescript --source-root <folder-to-extract> <output-folder>/javascript-database

์—ฌ๊ธฐ์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งŒ๋“ค๊ธฐ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์œ„์น˜์ธ --source-root ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ–ˆ์ง€๋งŒ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์ฒดํฌ ์•„์›ƒ ๋ฃจํŠธ์ผ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ node_modules ๋ฐ bower_components ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ์˜ ํŒŒ์ผ์€ ์ถ”์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Python

Python์šฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ๋Š” ๋‹ค์Œ์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • Python 3์ด ์„ค์น˜๋˜์–ด ์žˆ์œผ๋ฉฐ CodeQL ์ถ”์ถœ๊ธฐ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ์— ์‚ฌ์šฉํ•˜๋Š” Python ๋ฒ„์ „์ด ์„ค์น˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ช…๋ น์ค„์—์„œ --language=python(์„)๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ:

codeql database create --language=python <output-folder>/python-database

๊ทธ๋Ÿฌ๋ฉด ์ฝ”๋“œ์˜ ์ฒดํฌ ์•„์›ƒ ๋ฃจํŠธ์—์„œ database create ํ•˜์œ„ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ <output-folder>/python-database์—์„œ ์ƒˆ Python ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Ruby

Ruby์šฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ์ถ”๊ฐ€ ์ข…์†์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ช…๋ น์ค„์—์„œ --language=ruby(์„)๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ:

codeql database create --language=ruby --source-root <folder-to-extract> <output-folder>/ruby-database

์—ฌ๊ธฐ์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งŒ๋“ค๊ธฐ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์œ„์น˜์ธ --source-root ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ–ˆ์ง€๋งŒ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์ฒดํฌ ์•„์›ƒ ๋ฃจํŠธ์ผ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋œ ์–ธ์–ด์šฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งŒ๋“ค๊ธฐ

์ปดํŒŒ์ผ๋œ ์–ธ์–ด์˜ ๊ฒฝ์šฐ CodeQL์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋นŒ๋“œ ์‹œ์Šคํ…œ์„ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋ฏ€๋กœ CLI์—์„œ ๋นŒ๋“œ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. CodeQL์—๋Š” ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ C/C++, C# ๋ฐ Java์˜ ๊ฒฝ์šฐ ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•˜์ง€ ์•Š๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ๋งŽ์€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋Œ€ํ•ด code scanning์„(๋ฅผ) ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์— ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ CodeQL ๋นŒ๋“œ ๋ชจ๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋นŒ๋“œ ์‹œ์Šคํ…œ ์ž๋™ ๊ฒ€์ƒ‰

CodeQL CLI์—๋Š” C/C++, C#, Go, Java, Kotlin, Rust(๊ณต๊ฐœ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ), ๋ฐ Swift ์ฝ”๋“œ์šฉ ์ž๋™ ๋นŒ๋“œ๊ธฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. CodeQL ์ž๋™ ๋นŒ๋“œ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋นŒ๋“œ ๋ช…๋ น์„ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ์ปดํŒŒ์ผ๋œ ์–ธ์–ด์šฉ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž๋™ ๋นŒ๋“œ๊ธฐ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ CodeQL์—์„œ๋Š” ์›๋ณธ์„ ๊ฒ€์‚ฌํ•˜์—ฌ ๋นŒ๋“œ ์‹œ์Šคํ…œ์˜ ๊ทผ๊ฑฐ๋ฅผ ํ™•์ธํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ถ”์ถœ์— ํ•„์š”ํ•œ ์ตœ์ ์˜ ๋ช…๋ น ์ง‘ํ•ฉ์„ ์‹คํ–‰ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ปดํŒŒ์ผ๋œ ์–ธ์–ด์— ๋Œ€ํ•œ CodeQL ์ฝ”๋“œ ๊ฒ€์‚ฌํ•˜๊ธฐ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

--command ์˜ต์…˜์„ ํฌํ•จํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ --build-mode none์„ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ๋œ ์–ธ์–ด์— ๋Œ€ํ•ด codeql database create๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ž๋™ ๋นŒ๋”๊ธฐ๊ฐ€ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Swift ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

codeql database create --language=swift <output-folder>/swift-database

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

์ฐธ๊ณ  ํ•ญ๋ชฉ

  • Go ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒฝ์šฐ Go ๋„๊ตฌ ์ฒด์ธ(๋ฒ„์ „ 1.11 ์ด์ƒ)์„ ์„ค์น˜ํ•˜๊ณ  ์ข…์†์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ ์ ˆํ•œ ์ข…์†์„ฑ ๊ด€๋ฆฌ์ž(์˜ˆ: dep)๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • Go ์ž๋™ ๋นŒ๋“œ๊ธฐ๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ Go๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ  ์ข…์†์„ฑ์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๋งŒ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. CodeQL์—์„œ ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ์— ์˜ํ•ด ์ปดํŒŒ์ผ๋œ ํŒŒ์ผ๋กœ ์ถ”์ถœ์„ ์ œํ•œํ•˜๋ ค๋ฉด ํ™˜๊ฒฝ ๋ณ€์ˆ˜ CODEQL_EXTRACTOR_GO_BUILD_TRACING=on(์„)๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ --command ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ ๋ช…๋ น์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

๋นŒ๋“œ ๋ช…๋ น ์ง€์ •

๋‹ค์Œ ์˜ˆ์‹œ๋Š” ์ปดํŒŒ์ผ๋œ ์–ธ์–ด์šฉ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋นŒ๋“œ ๋ช…๋ น ์ค‘ ์ผ๋ถ€์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ์ œ๊ณตํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  ํ•ญ๋ชฉ

์ด --command ์˜ต์…˜์€ ๋‹จ์ผ ์ธ์ˆ˜๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ์ด์ƒ์˜ ๋ช…๋ น์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ --command๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์œ„ ๋ช…๋ น ๋ฐ ์˜ต์…˜์„ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ์ „์ฒด ์ธ์ˆ˜๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•ด์„ํ•˜๋ ค๋ฉด ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • make๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ๋œ C/C++ ํ”„๋กœ์ ํŠธ:

    # Disable parallel execution via `-j1` or other techniques: https://www.gnu.org/software/make/manual/make.html#Parallel-Execution
    codeql database create cpp-database --language=c-cpp --command=make
    
  • dotnet build๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ๋œ C# ํ”„๋กœ์ ํŠธ:

    ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ๋นŒ๋“œ๋˜๋„๋ก /t:rebuild๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ด์ „ dotnet clean์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค(๋นŒ๋“œ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ๋Š” CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ํฌํ•จ๋˜์ง€ ์•Š์Œ).

    codeql database create csharp-database --language=csharp --command='dotnet build /t:rebuild'
    
  • CODEQL_EXTRACTOR_GO_BUILD_TRACING=on ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ๋œ Go ํ”„๋กœ์ ํŠธ:

    CODEQL_EXTRACTOR_GO_BUILD_TRACING=on codeql database create go-database --language=go
    
  • ์‚ฌ์šฉ์ž ์ง€์ • ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ๋œ Go ํ”„๋กœ์ ํŠธ:

    codeql database create go-database --language=go --command='./scripts/build.sh'
    
  • Gradle์„ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ๋œ Java ํ”„๋กœ์ ํŠธ:

    # Use `--no-daemon` because a build delegated to an existing daemon cannot be detected by CodeQL.
    # To ensure isolated builds without caching, add `--no-build-cache` on persistent machines.
    codeql database create java-database --language=java-kotlin --command='gradle --no-daemon clean test'
    
  • Maven์„ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ๋œ Java ํ”„๋กœ์ ํŠธ:

    codeql database create java-database --language=java-kotlin --command='mvn clean install'
    
  • Ant๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ๋œ Java ํ”„๋กœ์ ํŠธ:

    codeql database create java-database --language=java-kotlin --command='ant -f build.xml'
    
  • Xcode ํ”„๋กœ์ ํŠธ ๋˜๋Š” ์ž‘์—… ์˜์—ญ์—์„œ ๋นŒ๋“œ๋œ Swift ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๊ฐ€์žฅ ํฐ Swift ๋Œ€์ƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค.

    ํ”„๋กœ์ ํŠธ๊ฐ€ ํด๋ฆฐ ์ƒํƒœ์ด๊ณ  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋นŒ๋“œ ์•„ํ‹ฐํŒฉํŠธ๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

    xcodebuild clean -all
    codeql database create -l swift swift-database
    
  • swift build๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ๋œ Swift ํ”„๋กœ์ ํŠธ:

    codeql database create -l swift -c "swift build" swift-database
    
  • xcodebuild๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ๋œ Swift ํ”„๋กœ์ ํŠธ:

    codeql database create -l swift -c "xcodebuild build -target your-target" swift-database
    

    archive ๋ฐ test ์˜ต์…˜์„ xcodebuild์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ‘œ์ค€ xcodebuild ๋ช…๋ น์€ ๊ฐ€์žฅ ๋น ๋ฅด๋ฉฐ ์„ฑ๊ณต์ ์ธ ๊ฒ€์‚ฌ๋ฅผ ์œ„ํ•ด CodeQL์— ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž ์ง€์ • ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ๋œ Swift ํ”„๋กœ์ ํŠธ:

    codeql database create -l swift -c "./scripts/build.sh" swift-database
    
  • Bazel์„ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ๋œ ํ”„๋กœ์ ํŠธ:

    # Navigate to the Bazel workspace.
    
    # Before building, remove cached objects
    # and stop all running Bazel server processes.
    bazel clean --expunge
    
    # Build using the following Bazel flags, to help CodeQL detect the build:
    # `--spawn_strategy=local`: build locally, instead of using a distributed build
    # `--nouse_action_cache`: turn off build caching, which might prevent recompilation of source code
    # `--noremote_accept_cached`, `--noremote_upload_local_results`: avoid using a remote cache
    # `--disk_cache=`: avoid using a disk cache. Note that a disk cache is no longer considered a remote cache as of Bazel 6.
    codeql database create new-database --language=<language> \
    --command='bazel build --spawn_strategy=local --nouse_action_cache --noremote_accept_cached --noremote_upload_local_results --disk_cache= //path/to/package:target'
    
    # After building, stop all running Bazel server processes.
    # This ensures future build commands start in a clean Bazel server process
    # without CodeQL attached.
    bazel shutdown
    
  • ์‚ฌ์šฉ์ž ์ง€์ • ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ๋œ ํ”„๋กœ์ ํŠธ:

    codeql database create new-database --language=<language> --command='./scripts/build.sh'
    

์ด ๋ช…๋ น์€ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๋ช…๋ น์„ ํฌํ•จํ•˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ„์ ‘ ๋นŒ๋“œ ์ถ”์  ์‚ฌ์šฉ

์ปดํŒŒ์ผ๋œ ์–ธ์–ด์šฉ CodeQL CLI ์ž๋™ ๋นŒ๋“œ๊ธฐ๊ฐ€ CI ์›Œํฌํ”Œ๋กœ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  codeql database trace-command๋กœ ๋นŒ๋“œ ๋ช…๋ น ํ˜ธ์ถœ์„ ๋ž˜ํ•‘ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ๊ฐ„์ ‘ ๋นŒ๋“œ ์ถ”์ ์„ ์‚ฌ์šฉํ•˜์—ฌ CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„์ ‘ ๋นŒ๋“œ ์ถ”์ ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด CI ์‹œ์Šคํ…œ์—์„œ ๊ฐ ๋นŒ๋“œ ์ž‘์—…์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ„์ ‘ ๋นŒ๋“œ ์ถ”์ ์„ ์‚ฌ์šฉํ•˜์—ฌ CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ํ”„๋กœ์ ํŠธ์˜ ์ฒดํฌ ์•„์›ƒ ๋ฃจํŠธ์—์„œ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

codeql database init ... --begin-tracing <database>

๋‹ค์Œ ํ•ญ๋ชฉ์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • <database>๋Š” ์ƒ์„ฑํ•  ์ƒˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ์ด ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค. ๊ธฐ์กด ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ง€์ •ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.
  • --begin-tracing์€ ๋นŒ๋“œ ๋ช…๋ น์„ ์ถ”์ ํ•  ํ™˜๊ฒฝ์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

codeql database init ๋ช…๋ น์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์˜ต์…˜์„ ์ •์ƒ์ ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  ํ•ญ๋ชฉ

๋นŒ๋“œ๊ฐ€ Windows์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ --trace-process-level <number> ๋˜๋Š” --trace-process-name <parent process name>๋ฅผ ์„ค์ •ํ•˜์—ฌ ํ•ด๋‹น ์˜ต์…˜์ด ๋ถ„์„ ์ค‘์ธ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ชจ๋“  ๋นŒ๋“œ ๋‹จ๊ณ„๋ฅผ ๊ด€์ฐฐํ•˜๋Š” ๋ถ€๋ชจ CI ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด codeql database init ๋ช…๋ น์€ ๋‹ค์Œ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

Created skeleton <database>. This in-progress database is ready to be populated by an extractor. In order to initialise tracing, some environment variables need to be set in the shell your build will run in. A number of scripts to do this have been created in <database>/temp/tracingEnvironment. Please run one of these scripts before invoking your build command.

Based on your operating system, we recommend you run: ...

์ด codeql database init ๋ช…๋ น์€ CodeQL์ด ๋นŒ๋“œ ๋‹จ๊ณ„ ์‹œํ€€์Šค๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ฐ ๊ฐ’์ด ํฌํ•จ๋œ ํŒŒ์ผ๋กœ <database>/temp/tracingEnvironment๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŒŒ์ผ์˜ ์ด๋ฆ„์€ start-tracing.{json,sh,bat,ps1}์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด CI ์‹œ์Šคํ…œ์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ํ•จ๊ป˜ ์ด๋Ÿฌํ•œ ํŒŒ์ผ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ผ€ํŒ… ๋ชฉ๋ก์˜ ๊ตฌ์„ฑ์›์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • JSON ํŒŒ์ผ์„ ์ฝ๊ณ , ์ฒ˜๋ฆฌํ•˜๊ณ , CI ์‹œ์Šคํ…œ์—์„œ ์˜ˆ์ƒํ•˜๋Š” ํ˜•์‹์œผ๋กœ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Azure DevOps์—๋Š” echo "##vso[task.setvariable variable=NAME]VALUE"๋ฅผ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ๋˜๋Š” CI ์‹œ์Šคํ…œ์˜ ํ™˜๊ฒฝ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒฝ์šฐ ์ ์ ˆํ•œ start-tracing ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์†Œ์‹ฑํ•˜์—ฌ CI ์‹œ์Šคํ…œ์˜ ์…ธ ํ™˜๊ฒฝ์—์„œ CodeQL ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ์ ์œผ๋กœ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ end-tracing.{json,sh,bat,ps1} ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ start-tracing ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ €์žฅ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ • ํ•ด์ œํ•œ ๋‹ค์Œ codeql database finalize <database> ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

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

๊ฐ„์ ‘ ๋นŒ๋“œ ์ถ”์ ์„ ์‚ฌ์šฉํ•œ CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ ์˜ˆ์‹œ

์ฐธ๊ณ  ํ•ญ๋ชฉ

Azure DevOps ํŒŒ์ดํ”„๋ผ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ GitHub Advanced Security for Azure DevOps๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„ค๋ช…์„œ๋Š” Microsoft Learn์—์„œ GitHub Advanced Security for Azure DevOps ๊ตฌ์„ฑ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” Azure DevOps ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๊ฐ„์ ‘ ๋นŒ๋“œ ์ถ”์ ์„ ์‚ฌ์šฉํ•˜์—ฌ CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค.

steps:
    # Download the CodeQL CLI and query packs...
    # Check out the repository ...

    # Run any pre-build tasks, for example, restore NuGet dependencies...

    # Initialize the CodeQL database.
    # In this example, the CodeQL CLI has been downloaded and placed on the PATH.
    - task: CmdLine@1
       displayName: Initialize CodeQL database
      inputs:
          # Assumes the source code is checked out to the current working directory.
          # Creates a database at `<current working directory>/db`.
          # Running on Windows, so specifies a trace process level.
          script: "codeql database init --language csharp --trace-process-name Agent.Worker.exe --source-root . --begin-tracing db"

    # Read the generated environment variables and values,
    # and set them so they are available for subsequent commands
    # in the build pipeline. This is done in PowerShell in this example.
    - task: PowerShell@1
       displayName: Set CodeQL environment variables
       inputs:
          targetType: inline
          script: >
             $json = Get-Content $(System.DefaultWorkingDirectory)/db/temp/tracingEnvironment/start-tracing.json | ConvertFrom-Json
             $json.PSObject.Properties | ForEach-Object {
                 $template = "##vso[task.setvariable variable="
                 $template += $_.Name
                 $template += "]"
                 $template += $_.Value
                 echo "$template"
             }

    # Execute the pre-defined build step. Note the `msbuildArgs` variable.
    - task: VSBuild@1
        inputs:
          solution: '**/*.sln'
          msbuildArgs: /p:OutDir=$(Build.ArtifactStagingDirectory)
          platform: Any CPU
          configuration: Release
          # Execute a clean build, in order to remove any existing build artifacts prior to the build.
          clean: True
       displayName: Visual Studio Build

    # Read and set the generated environment variables to end build tracing. This is done in PowerShell in this example.
    - task: PowerShell@1
       displayName: Clear CodeQL environment variables
       inputs:
          targetType: inline
          script: >
             $json = Get-Content $(System.DefaultWorkingDirectory)/db/temp/tracingEnvironment/end-tracing.json | ConvertFrom-Json
             $json.PSObject.Properties | ForEach-Object {
                 $template = "##vso[task.setvariable variable="
                 $template += $_.Name
                 $template += "]"
                 $template += $_.Value
                 echo "$template"
             }

    - task: CmdLine@2
       displayName: Finalize CodeQL database
       inputs:
          script: 'codeql database finalize db'

    # Other tasks go here, for example:
    # `codeql database analyze`
    # then `codeql github upload-results` ...

๋‹ค์Œ ๋‹จ๊ณ„