V2 CI Pipeline.md - 100-hours-a-week/KTB4-17th-wiki GitHub Wiki

v2 ์ง€์†์  ํ†ตํ•ฉ(CI) ํŒŒ์ดํ”„๋ผ์ธ ์„ค๊ณ„

1. v1 CI์˜ ํ•œ๊ณ„

2.1 ์ˆ˜๋™ ํ…Œ์ŠคํŠธ ์˜์กด

์ˆ˜๋™ ํ…Œ์ŠคํŠธ์˜ ํ•œ๊ณ„: v1 CI์—๋Š” ๋ณ„๋„์˜ ์ž๋™ํ™” ํ…Œ์ŠคํŠธ๊ฐ€ ์—†์–ด ๊ธฐ๋Šฅ ๊ฒ€์ฆ์„ ์ˆ˜๋™ ํ…Œ์ŠคํŠธ์— ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค. ์ˆ˜๋™ ํ…Œ์ŠคํŠธ๋Š” ๋™์ผํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋ฐ˜๋ณตํ•˜๊ธฐ ์–ด๋ ต๊ณ  ์‚ฌ๋žŒ์ด ๊ฒฐ๊ณผ๋ฅผ ์ง์ ‘ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ถ€์ฃผ์˜๋กœ ์˜ค๋ฅ˜๋ฅผ ๋†“์น  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค. ์„œ๋น„์Šค ๊ทœ๋ชจ์™€ ๊ธฐ๋Šฅ์ด ์ปค์งˆ์ˆ˜๋ก ๋ชจ๋“  ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ฒ€์ฆํ•˜๊ธฐ ์–ด๋ ต๋‹ค

1.2 ์ž๋™ํ™”๋œ ์‹คํ–‰ ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ ๋ถ€์žฌ

๋Ÿฐํƒ€์ž„ ํ…Œ์ŠคํŠธ ๋ถ€์žฌ : v1์—์„œ๋Š” ์ „์ฒด ๊ฐœ๋ฐœ์˜ 70%๋ฅผ 2์ฃผ๋งŒ์— ์™„์„ฑ ํ•ด์•ผํ•˜๋Š” ๋งŒํผ ๊ฐœ๋ฐœ ๋ณผ๋ฅจ์ด ์ปค์„œ ๋ณ„๋„์˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ์ •์ ์ธ ํ…Œ์ŠคํŠธ๋งŒ ์ง„ํ–‰ํ–ˆ๋‹ค. ํ…Œ์ŠคํŠธ๊ฐ€ ์—†๊ธฐ ๋–„๋ฌธ์— ๋ฒ„๊ทธ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋Š” ์‹œ์ ์ด ๋Šฆ๋‹ค๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค.


3. v2 CI์˜ ๋ชฉ์ 

v2 CI๋Š” ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณ‘ํ•ฉ ์ „์— ์ž๋™์œผ๋กœ ๊ฒ€์ฆํ•ด ์žฅ์• ๋ฅผ ์‚ฌ์ „์— ์˜ˆ๋ฐฉํ•˜๊ณ  ์•ˆ์ •์ ์ธ ์ฝ”๋“œ ๋ณ‘ํ•ฉ์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉ์ ์œผ๋กœ ํ•œ๋‹ค.

  1. ์ •์  ๊ฒ€์‚ฌ, ๋‹จ์œ„ ํ…Œ์ŠคํŠธ, ํ•ต์‹ฌ API ํ…Œ์ŠคํŠธ์™€ ๋นŒ๋“œ๋ฅผ ์ž๋™ํ™”ํ•œ๋‹ค.
  2. ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ๊ธฐ์กด ๊ธฐ๋Šฅ์ด ๊นจ์ง€๋Š” ํšŒ๊ท€ ๊ฒฐํ•จ์„ ์กฐ๊ธฐ์— ๋ฐœ๊ฒฌํ•œ๋‹ค.
  3. ๋ชจ๋“  ํ•„์ˆ˜ ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•œ ์ฝ”๋“œ๋งŒ dev ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉํ•œ๋‹ค.
  4. ๊ฐœ์ธ์˜ ์ˆ˜๋™ ํ™•์ธ์— ์˜์กดํ•˜๋˜ ๊ฒ€์ฆ ์ ˆ์ฐจ๋ฅผ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ์ „ํ™˜ํ•œ๋‹ค.

4. ๋ธŒ๋žœ์น˜ ์ „๋žต๊ณผ CI ์‹คํ–‰ ์‹œ์ 

4.1 ๋ธŒ๋žœ์น˜ ์—ญํ• 

mainโ€“devโ€“feat/* ๋ธŒ๋žœ์น˜ ์ „๋žต์„ ์‚ฌ์šฉํ•œ๋‹ค.

๋ธŒ๋žœ์น˜ ์—ญํ• 
main ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์•ˆ์ • ๋ฒ„์ „ ๊ด€๋ฆฌ
dev ๊ฐ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ๊ฒฐ๊ณผ๋ฅผ ํ†ตํ•ฉํ•˜๊ณ  ๊ฒ€์ฆํ•˜๋Š” ๋ธŒ๋žœ์น˜
feat/* ๊ธฐ๋Šฅ ๋‹จ์œ„ ๊ฐœ๋ฐœ ๋ธŒ๋žœ์น˜

4.2 CI ํŠธ๋ฆฌ๊ฑฐ

CI๋Š” dev ๋ธŒ๋žœ์น˜๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” Pull Request๊ฐ€ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์œผ๋กœ ๊ฐฑ์‹ ๋  ๋•Œ ์‹คํ–‰ํ•œ๋‹ค. GitHub Actions์˜ pull_request ์ด๋ฒคํŠธ์™€ ๋Œ€์ƒ ๋ธŒ๋žœ์น˜ ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

feat/* ๋ธŒ๋žœ์น˜์— push
        โ†“
dev ๋Œ€์ƒ Pull Request ์ƒ์„ฑ 
        โ†“
CI ์‹คํ–‰ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
        ์ฝ”๋“œ ๋ฆฌ๋ทฐ โ”€โ”€โ”€โ”€โ”ค ๋ณ‘ํ–‰
                     โ†“
์ตœ์‹  ์ปค๋ฐ‹์˜ CI ํ†ต๊ณผ + ๋ฆฌ๋ทฐ์–ด 1๋ช… ์ด์ƒ ์Šน์ธ
                     โ†“
dev ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ
                     โ†“
dev์—์„œ main์œผ๋กœ

CI ํ†ต๊ณผ์™€ ๋ฆฌ๋ทฐ์–ด ์Šน์ธ์„ ๋‘˜๋‹ค ํ†ต๊ณผํ•ด์•ผ ๋ณ‘ํ•ฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  • Pull Request๋ฅผ ํ†ตํ•œ ๋ณ‘ํ•ฉ๋งŒ ํ—ˆ์šฉ
  • ํ•„์ˆ˜ CI ์ƒํƒœ ๊ฒ€์‚ฌ ํ†ต๊ณผ
  • ๋ฆฌ๋ทฐ์–ด 1๋ช… ์ด์ƒ์˜ ์Šน์ธ (pr ์˜ฌ๋ฆฐ ์‚ฌ๋žŒ์„ ์ œ์™ธํ•˜๊ณ )
  • ์ƒˆ ์ปค๋ฐ‹์ด ์ถ”๊ฐ€๋˜๋ฉด ์ตœ์‹  ์ปค๋ฐ‹์„ ๊ธฐ์ค€์œผ๋กœ CI ์žฌ์‹คํ–‰
  • ํ•„์š”ํ•˜๋ฉด ์ƒˆ ์ปค๋ฐ‹ push ์‹œ ๊ธฐ์กด ๋ฆฌ๋ทฐ ์Šน์ธ ํ•ด์ œ

5. CI ๋„๊ตฌ ์„ ์ •: GitHub Actions

v1์—์„œ๋Š” ํŒ€์ด GitHub Actions ์™ธ์˜ CI/CD ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝํ—˜์ด ์—†์—ˆ๋‹ค. ์ถ”๊ฐ€ ๋„๊ตฌ ๋„์ž…์— ํ•„์š”ํ•œ ํ•™์Šต ์‹œ๊ฐ„๊ณผ ์šด์˜ ๋ถ€๋‹ด์„ ์ค„์ด๊ธฐ ์œ„ํ•ด GitHub Actions๋ฅผ ์„ ํƒํ–ˆ์œผ๋ฉฐ v2์—์„œ๋„ ๊ธฐ์กด ๋„๊ตฌ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.

v2์˜ CI๋Š” Pull Request ๊ธฐ๋ฐ˜ ์ •์  ๊ฒ€์‚ฌ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ…Œ์ŠคํŠธ์™€ ๋นŒ๋“œ๊ฐ€ ์ค‘์‹ฌ์ด๋ฏ€๋กœ GitHub Actions๋งŒ์œผ๋กœ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ GitHub ์ €์žฅ์†Œ, Pull Request์™€ ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ ๊ทœ์น™์„ ๋ณ„๋„ ์—ฐ๋™ ์ž‘์—… ์—†์ด ํ•จ๊ป˜ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.


6. ํ…Œ์ŠคํŠธ

v1์˜ ์ •์  ๊ฒ€์‚ฌ๋Š” ๊ธฐ์กด ์„ค์ •์„ ์œ ์ง€ํ•˜๊ณ  ์‹คํ–‰ ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฝ”๋“œ ๋ณ€๊ฒฝ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฐํ•จ์„ ๋ณ‘ํ•ฉ ์ „์— ํ™•์ธํ•œ๋‹ค.

6.1 Frontend

์ •์  ๊ฒ€์‚ฌ โ†’ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ โ†’ ๋นŒ๋“œ
  • ์ •์  ๊ฒ€์‚ฌ: ๊ธฐ์กด lint, ํƒ€์ž… ๊ฒ€์‚ฌ์™€ ์ฝ”๋“œ ์Šคํƒ€์ผ ๊ฒ€์‚ฌ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.
  • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ: JavaScript ํ•จ์ˆ˜์™€ ํด๋ฆญ,์ž…๋ ฅ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ๊ฒ€์ฆํ•œ๋‹ค.

frontend์—์„œ API ํ…Œ์ŠคํŠธ ์ œ์™ธ ์ด์œ 

Frontend์™€ Backend๊ฐ€ ๋ณ„๋„ ์ €์žฅ์†Œ๋กœ ๋ถ„๋ฆฌ๋œ ์ƒํƒœ์—์„œ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ์—†์ด ๊ฐ€์งœ API ์‘๋‹ต๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋ก ํŠธ์—”๋“œ์˜ ์‘๋‹ต ์ฒ˜๋ฆฌ ๋กœ์ง์€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์‹ค์ œ API ์—ฐ๋™๊นŒ์ง€ ๋ณด์žฅํ•  ์ˆ˜๋Š” ์—†๋‹ค. ๋”ฐ๋ผ์„œ v2 Frontend CI์—์„œ๋Š” API ํ…Œ์ŠคํŠธ๋ฅผ ์ œ์™ธํ•˜๊ณ  ์ •์  ๊ฒ€์‚ฌ์™€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์— ์ง‘์ค‘ํ•œ๋‹ค.

6.2 Backend ๋ฐ AI

์ •์  ๊ฒ€์‚ฌ โ†’ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ โ†’ ํ…Œ์ŠคํŠธ DB ์‹คํ–‰ โ†’ ํ•ต์‹ฌ API ํ…Œ์ŠคํŠธ โ†’ ๋นŒ๋“œ
Workflow: Backend CI
โ””โ”€ Job: backend-ci
   โ”œโ”€ Step 1. ์ •์  ๊ฒ€์‚ฌ
   โ”‚      โ†“
   โ”œโ”€ Step 2. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ
   โ”‚      โ†“
   โ”œโ”€ Step 3. ํ…Œ์ŠคํŠธ DB ๊ธฐ๋™
   โ”‚      โ†“
   โ”œโ”€ Step 4. ํ•ต์‹ฌ API ํ…Œ์ŠคํŠธ
   โ”‚      โ†“
   โ””โ”€ Step 5. ๋นŒ๋“œ

GitHub Actions์˜ ๋™์ผํ•œ Job ์•ˆ์— ์žˆ๋Š” Step์€ ์œ„์—์„œ ์•„๋ž˜๋กœ ์ˆœ์ฐจ ์‹คํ–‰๋œ๋‹ค. ํ…Œ์ŠคํŠธ DB๊ฐ€ ์ค€๋น„๋œ ์ดํ›„์—๋งŒ ํ•ต์‹ฌ API ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ ์•ž ๋‹จ๊ณ„๊ฐ€ ์‹คํŒจํ•˜๋ฉด ์ดํ›„ ๋‹จ๊ณ„๋Š” ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  CI๋ฅผ ์‹คํŒจ ์ฒ˜๋ฆฌํ•œ๋‹ค. ํ…Œ์ŠคํŠธ DB๋Š” Testcontainers๊ฐ€ ์ œ๊ณตํ•˜๋Š” MySQL ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์šด์˜ DB์™€ ๋ถ„๋ฆฌ๋œ ํ™˜๊ฒฝ์—์„œ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ๊ณผ ํŠธ๋žœ์žญ์…˜์„ ๊ฒ€์ฆํ•œ๋‹ค.

6.3 ๋‹จ์œ„ ํ…Œ์ŠคํŠธ

frontend :Vitest,jsdom

  • Vitest: JavaScript ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์‹คํ–‰
  • jsdom: Node.js ๊ธฐ๋ฐ˜ CI ํ™˜๊ฒฝ์—์„œ ๊ฐ€์ƒ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์–ด์„œ ์š”์†Œ ์กฐํšŒ, ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ์™€ ํ™”๋ฉด ๋‚ด์šฉ ๋ณ€๊ฒฝ ๊ฒ€์ฆํ•จ

Java: JUnit 5

Backend ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์—๋Š” JUnit 5๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. JUnit 5๋Š” ๊ธฐ์กด Gradle ๋นŒ๋“œ์™€ GitHub Actions์—์„œ ๋ฐ”๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ  Spring Boot ํ…Œ์ŠคํŠธ ์ƒํƒœ๊ณ„์™€๋„ ์—ฐ๋™๋œ๋‹ค.

Python: pytest

LLM์˜ ๋‹ต๋ณ€ ํ’ˆ์งˆ์ด ํ…Œ์ŠคํŠธ์˜ ๋ชฉ์ •์ด ์•„๋‹ˆ๊ธฐ ๋–„๋ฌธ์— ์‹ค์ œ ์™ธ๋ถ€ LLM api๋ฅผ ์ง์ ‘ ๋ถ€๋ฅด์ง€ ์•Š๊ณ  ๊ฐ€์งœ ์‚ฌ์šฉ์ž๋ฅผ ๋งŒ๋“ค์–ด ํ•ญ์ƒ ๋˜‘๊ฐ™์€ ์‘๋‹ต์ด ์˜ค๋„๋ก ํ•ด์•ผํ•œ๋‹ค. ์ด๋•Œ fixture๋ผ๋Š” ํ•จ์ˆ˜๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ฐ€์งœ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์„œ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ด๋‹ค.

6.4 ํ•ต์‹ฌ API ํ…Œ์ŠคํŠธ

Backend

[ํ…Œ์ŠคํŠธ ๋„๊ตฌ]

  • JUnit 5: ํ…Œ์ŠคํŠธ ์‹คํ–‰๊ณผ ๊ฒฐ๊ณผ ๊ฒ€์ฆ
  • Spring Boot Test: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋ฅผ ํฌํ•จํ•œ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ
  • MockMvc: ์‹ค์ œ ๋„คํŠธ์›Œํฌ ํฌํŠธ๋ฅผ ์—ด์ง€ ์•Š๊ณ  Spring MVC ๊ณ„์ธต์— ๊ฐ€์งœ HTTP ์š”์ฒญ์„ ์ „์†กํ•ด์ค€๋‹ค
  • Testcontainers MySQL: ํ…Œ์ŠคํŠธ์šฉ MySQL ์ปจํ…Œ์ด๋„ˆ ์ œ๊ณตํ•œ๋‹ค.

[restapi]

  • ๋กœ๊ทธ์ธ
  • ์ „์ฒด ํ”„๋กœํ•„ ์กฐํšŒ
  • ์ƒ์„ธ ํ”„๋กœํ•„ ์กฐํšŒ
  • ์ข‹์•„์š” ๋“ฑ๋ก
  • ๋งค์นญ ์š”์ฒญ

[์ฑ„ํŒ… ๋ฉ”์‹œ์ง€]

  • ๋ฉ”์‹œ์ง€ ์ €์žฅ
  • ๋ฉ”์‹œ์ง€ ์กฐํšŒ
  • ์ฑ„ํŒ…๋ฐฉ ์ฐธ์—ฌ์ž๋งŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†ก๊ฐ€๋Šฅํ•œ์ง€.

AI

[ํ…Œ์ŠคํŠธ ๋„๊ตฌ]

  • pytest: ํ…Œ์ŠคํŠธ ์‹คํ–‰, ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๊ด€๋ฆฌ์™€ ๊ฒฐ๊ณผ ๊ฒ€์ฆ (fixture)

  • FastAPI TestClient: ์‹ค์ œ ๋„คํŠธ์›Œํฌ ํฌํŠธ๋ฅผ ์—ด์ง€ ์•Š๊ณ  Spring MVC ๊ณ„์ธต์— ๊ฐ€์งœ HTTP ์š”์ฒญ์„ ์ „์†กํ•ด์ค€๋‹ค

  • mock: ์™ธ๋ถ€ LLM API ํ˜ธ์ถœ์„ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๊ฐ€์งœ ์‘๋‹ต์œผ๋กœ ๋Œ€์ฒด

  • AIโ€“์‚ฌ์šฉ์ž ์—ฐ์Šต ๋Œ€ํ™”

  • AI ๊ฐ„ ๋Œ€ํ™”

  • ์‚ฌ์ฃผ ๋ถ„์„

  • ๊ด€์ƒ ๋ถ„์„

Frontend, Backend, AI๊ฐ€ ๊ฐ๊ฐ ๋ณ„๋„ ์ €์žฅ์†Œ๋กœ ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ์–ด ์ „์ฒด ์‚ฌ์šฉ์ž ํ๋ฆ„์„ ๊ฒ€์ฆํ•˜๋ ค๋ฉด ์„ธ ์„œ๋น„์Šค๋ฅผ ๋™์ผ ๋ฒ„์ „์œผ๋กœ ๋ฐฐํฌํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜๋Š” ๋ณ„๋„์˜ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค. v2์—์„œ๋Š” ์ผ์ •๊ณผ ๊ตฌ์ถ• ๋น„์šฉ์„ ๊ณ ๋ คํ•ด E2E ํ…Œ์ŠคํŠธ,ํ†ตํ•ฉํ…Œ์ŠคํŠธ๋ฅผ ์ œ์™ธํ•˜๊ณ  ์ €์žฅ์†Œ๋ณ„ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์™€ ํ•ต์‹ฌ API ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.


7. ์ฐธ๊ณ  ์ž๋ฃŒ