CI/CD

mizuยท2025๋…„ 1์›” 4์ผ

DevOps

๋ชฉ๋ก ๋ณด๊ธฐ
1/8

๐Ÿ“CI/CD ์ดํ•ด

โœ… ์†Œํ”„ํŠธ์›จ์–ด ๋ฆด๋ฆฌ์Šค ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค
โœ… ์ง€์†์  ํ†ตํ•ฉ (CI)

  • Git ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์™€ ๊ฐ™์€ ์ฝ”๋“œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ๋ฐœ์ƒ
  • ํŠน์ • ๋ธŒ๋žœ์น˜์—์„œ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ๋นŒ๋“œ ๋ฐ ํ…Œ์ŠคํŠธ ์ˆ˜ํ–‰
  • ๊ธฐ๋ณธ ๋ธŒ๋žœ์น˜๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” PullRequest ์ƒ์„ฑ
  • ์ฝ”๋“œ ๊ฒ€ํ† 
  • ์Šน์ธ๋˜๋ฉด ๊ธฐ๋ณธ ๋ธŒ๋žœ์น˜๋กœ ๋ณ‘ํ•ฉ

โœ… ์ง€์†์  ์ œ๊ณต (CD)

  • ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฒ„๊ทธ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์ณ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์ž๋™์œผ๋กœ ์—…๋กœ๋“œ
  • ํ…Œ์ŠคํŠธ ์ž๋™ํ™”, ์ฝ”๋“œ ๋ฆด๋ฆฌ์Šค ์ž๋™ํ™”

โœ… ์ง€์†์  ๋ฐฐํฌ (CD)

  • ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ๊นŒ์ง€ ์ž๋™์œผ๋กœ ๋ฆด๋ฆฌ์Šคํ•˜๋Š” ๊ฒƒ
  • ์ˆ˜๋™ ๋ฐฐํฌ๋กœ ์ธํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ค„์ž„

๐Ÿ“ํ˜•์ƒ๊ด€๋ฆฌ ๋ฐ ๋ธŒ๋žœ์น˜ ์ „๋žต

ํ•˜๋‹จ์˜ ๋‚ด์šฉ์€ ์ง€๋‚œ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•œ ์ „๋žต์ž…๋‹ˆ๋‹ค.

โœ… ํ˜•์ƒ๊ด€๋ฆฌ : ์†Œ์Šค์ฝ”๋“œ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ด€๋ฆฌ

  • ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ, ํ…Œ์ŠคํŠธ ๋“ฑ๋“ฑ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— ๋ณ€๊ฒฝ์„ ์ค„ ๋•Œ๋Š” ๋ฌด์กฐ๊ฑด ์ด์Šˆ๋ฅผ ๋ฐœ๊ธ‰
  • ๋ฐœ๊ธ‰๋œ ์ด์Šˆ ๋ฒˆํ˜ธ๋ฅผ ์ž‘์—… ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ์‹œ ์ ์šฉ
  • ์ด์Šˆ ๋ฐœ๊ธ‰ ์‹œ, (1) ์–ด๋–ค ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ž‘์—…์„ ํ•˜๋Š” ์ง€ ์„ค๋ช… (2) ์ž‘์—… ์ƒ์„ธ ๋‚ด์šฉ (3) ์ฐธ๊ณ  ์ž๋ฃŒ (์„ ํƒ) ๋ฅผ ์ฒจ๋ถ€ํ•˜์—ฌ ์ž‘์„ฑ
  • Pull Request ์‹œ, ๊ด€๋ จ๋œ ์ด์Šˆ ๋ฒˆํ˜ธ๋ฅผ ์ฒจ๋ถ€ํ•˜๊ณ  ์–ด๋–ค ์‹์œผ๋กœ ๊ตฌ์„ฑ๋˜์—ˆ๋Š”์ง€ ์ž‘์„ฑ. main์œผ๋กœ๋Š” ์Šน์ธ๋œ ์ธ์›๋งŒ ๋จธ์ง€ํ•  ์ˆ˜ ์žˆ๊ณ , ํ•œ ๋ช… ์ด์ƒ์˜ ์ธ์›์—๊ฒŒ Approval์„ ๋ฐ›์•„์•ผ develop์œผ๋กœ ๋จธ์ง€ ํ•  ์ˆ˜ ์žˆ์Œ.

โœ… ๋ธŒ๋žœ์น˜ ์ „๋žต

  • main : ๋ชจ๋“  ๋ณ€๊ฒฝ์‚ฌํ•ญ์€ ์ตœ์ข…์ ์œผ๋กœ main์— ๋ฐ˜์˜๋˜์–ด์•ผ ํ•จ
  • develop : main์œผ๋กœ ์˜ฌ๋ฆฌ๊ธฐ ์ „๊นŒ์ง€ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ฉํ•˜๋Š” ๋ธŒ๋žœ์น˜
  • type/#์ด์Šˆ๋ฒˆํ˜ธ : ๊ฐ ๊ฐœ๋ฐœ์ž๋“ค์ด develop์œผ๋กœ ์˜ฌ๋ฆฌ๊ธฐ์ „์— ์ž‘์—…ํ•˜๋Š” ๋ธŒ๋žœ์น˜
    ๐Ÿ—‚๏ธ feat : ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€
    ๐Ÿ—‚๏ธ fix : ๋ฒ„๊ทธ ์ˆ˜์ •
    ๐Ÿ—‚๏ธ refactor : ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง
    ๐Ÿ—‚๏ธ test : ํ…Œ์ŠคํŠธ ์ฝ”๋“œ, ๋ฆฌํŒฉํ† ๋ง ํ…Œ์ŠคํŠธ ์ฝ”๋“œ
    ๐Ÿ—‚๏ธ chore : ๋นŒ๋“œ ์—…๋ฌด ์ˆ˜์ •

๐Ÿ“Pipeline ๊ตฌ์กฐ - FE

โœ… ์‚ฌ์šฉํ•œ ํˆด : Jenkins
โœ… Stage : Clone Repository - SonarQube Quality Test - Build - S3(AWS) / Storage(GCP) - CloudFront Cache Removal
โœ… Credential์€ Jenkins ์‚ฌ์ดํŠธ์— ๋“ฑ๋กํ•˜์—ฌ ์‚ฌ์šฉ

Clone Repository

  • ๊นƒํ—ˆ๋ธŒ ์›นํ›…์„ ์ด์šฉํ•ด Develop ๋ธŒ๋žœ์น˜์— push๊ฐ€ ์ƒ๊ธฐ๋ฉด ํ•ด๋‹น ๋ธŒ๋žœ์น˜๋ฅผ ํด๋ก 

SonarQube Quality Test

  • ์ผ์ • ๊ธฐ์ค€์น˜๋ฅผ ๋„˜์ง€ ๋ชปํ•˜๋ฉด Fail์ด ๋œจ๊ฒŒ ์„ค์ •
  • ๊ธฐ์ค€์น˜๋Š” ํ”„๋กœ์ ํŠธ ์ผ์ • ๋ฐ ์ƒํ™ฉ์„ ๊ณ ๋ คํ•˜์—ฌ ์ตœ์†Œ์น˜๋กœ ์žก์Œ
  • ๊ธฐ์ค€์€ Claude์— ํ‘œ์ค€์น˜๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์„ค์ •

=> ์™œ ๋„์ž…ํ–ˆ๋Š”๊ฐ€?
์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ํ•˜๊ณ  ์‹ถ๋‹ค๋Š” ํŒ€์›๋“ค์˜ ์˜๊ฒฌ์ด ์žˆ์—ˆ์œผ๋‚˜, ๋‹ค๋“ค ์ œ๋Œ€๋กœ ๋œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ํ•ด๋ณธ ์ ์ด ์—†๊ณ  ๊ฐ€์ด๋“œ๋ผ์ธ์ด ์—†์–ด์„œ ์–ด๋ ค์›Œํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํˆด์— ์˜์กด์„ ํ•ด์•ผํ–ˆ๊ณ , ์™„์ „ํžˆ ์ƒˆ๋Ÿฌ์šด ํˆด๋ณด๋‹ค๋Š” ๊ธฐ์ˆ  ์„ธ๋ฏธ๋‚˜ ๋•Œ ์–ธ๊ธ‰์ด ๋งŽ์•˜๋˜ SonarQube๋ฅผ ์„ ํƒํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

Build
npm์œผ๋กœ ๋นŒ๋“œ

S3(AWS) / Storage(GCP)

  • ๋นŒ๋“œ ๋œ ๋‚ด์šฉ๋ฌผ๋“ค์„ S3, Storage๋กœ ์ „์†ก
  • AWS CLI, gcloud CLI๋กœ ์ง„ํ–‰

CloudFront Cache Removal

  • CloudFront์— Cache๊ฐ€ ๋‚จ์•„์žˆ์–ด ์ œ๋Œ€๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐ˜์˜์ด ์•ˆ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ AWS CLI๋กœ ์บ์‹œ ๋ฌดํšจํ™” ์ง„ํ–‰

โœ… ๊ฐœ์ธ์ ์ธ ํ”ผ๋“œ๋ฐฑ

  • Repository๋ฅผ Develop์œผ๋กœ ์˜ฌ๋ฆฌ๊ธฐ ์ „์— Quality Check๋ฅผ ํ–ˆ์œผ๋ฉด ๋” ์ข‹์•˜์„ ๊ฒƒ ๊ฐ™๋‹ค. Develop์œผ๋กœ ์˜ฌ๋ฆฌ๊ณ  ํ•˜๋‹ˆ๊นŒ ์–‘์ด ๋ฐฉ๋Œ€ํ•ด์ ธ์„œ ์ˆ˜๋™์œผ๋กœ ์ฒดํฌํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์› ๋‹ค.
  • Monitoring/Logs์— ๊ด€๋ จ๋œ ๋ถ€๋ถ„์ด ์—†์–ด์„œ ์•„์‰ฝ๋‹ค.
  • SonarQube์—์„œ ์ œ๊ณตํ•˜๋Š” ์žฅ์ ์„ ์™„์ „ํ•˜๊ฒŒ ํ™œ์šฉํ•˜์ง€ ๋ชป ํ–ˆ๋‹ค.

๐Ÿ“Pipeline ๊ตฌ์กฐ - BE

โœ… ์‚ฌ์šฉํ•œ ํˆด : Jenkins, ArgoCD
โœ… Stage : Clone Repository - Build - SonarQube Quality Test - Build Docker Image - Upload Image to ECR - Upload Image to GCR - Update K8S Manifest
โœ… Credential์€ Jenkins ์‚ฌ์ดํŠธ์— ๋“ฑ๋กํ•˜์—ฌ ์‚ฌ์šฉ

Clone Repository

  • ๊นƒํ—ˆ๋ธŒ ์›นํ›…์„ ์ด์šฉํ•ด Develop ๋ธŒ๋žœ์น˜์— push๊ฐ€ ์ƒ๊ธฐ๋ฉด ํ•ด๋‹น ๋ธŒ๋žœ์น˜๋ฅผ ํด๋ก 

Build
jar ํŒŒ์ผ ์ƒ์„ฑ

SonarQube Quality Test

  • ์ผ์ • ๊ธฐ์ค€์น˜๋ฅผ ๋„˜์ง€ ๋ชปํ•˜๋ฉด Fail์ด ๋œจ๊ฒŒ ์„ค์ •
  • ๊ธฐ์ค€์น˜๋Š” ํ”„๋กœ์ ํŠธ ์ผ์ • ๋ฐ ์ƒํ™ฉ์„ ๊ณ ๋ คํ•˜์—ฌ ์ตœ์†Œ์น˜๋กœ ์žก์Œ
  • ๊ธฐ์ค€์€ Claude์— ํ‘œ์ค€์น˜๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์„ค์ •

Upload Image to ECR / Upload Image to GCR

  • ๋นŒ๋“œ๋œ ๋‚ด์šฉ์„ Docker Image๋กœ ๋งŒ๋“ฆ
  • ๊ทธ ์ด๋ฏธ์ง€๋ฅผ ECR/GCR๋กœ ๋ณด๋ƒ„

Update K8S Manifest

  • ์ƒˆ ์ด๋ฏธ์ง€๊ฐ€ ๋นŒ๋“œ๋˜๋ฉด, ํ•ด๋‹น ์ด๋ฏธ์ง€ ํƒœ๊ทธ๋กœ Kubernetes ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์ž๋™ ์—…๋ฐ์ดํŠธ
  • ๋ณ€๊ฒฝ์‚ฌํ•ญ GitOps ์ €์žฅ์†Œ์— ์ปค๋ฐ‹
  • ์ธํ”„๋ผ ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ฝ”๋“œ๋กœ ๊ด€๋ฆฌ
  • ๋ฐฐํฌ ์ด๋ ฅ ์ถ”์  ๊ฐ€๋Šฅ

โœ… ArgoCD
GitOps repository hook

  • Argo๊ฐ€ GitOps Web-hook ๊ฐ์ง€

CD - Blue/Green

  • Auto Sync๋ฅผ ํ†ตํ•ด ํด๋Ÿฌ์Šคํ„ฐ ์„ค์ • ์ž๋™ ๋ณ€๊ฒฝ
  • Argo Rollout ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ rollout.yaml์— ์ •์˜๋œ ์ „๋žต์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ ๋ฒ„์ „ ๋ฐฐํฌ
  • ์ƒˆ ๋ฒ„์ „ Green ์•ˆ์ •์„ฑ ๊ฒ€์ฆ
  • Health-Check ์„ฑ๊ณต ํ›„ ํŠธ๋ž˜ํ”ฝ ์ „ํ™˜

โœ… ๊ฐœ์ธ์ ์ธ ํ”ผ๋“œ๋ฐฑ

  • Repository๋ฅผ Develop์œผ๋กœ ์˜ฌ๋ฆฌ๊ธฐ ์ „์— Quality Check๋ฅผ ํ–ˆ์œผ๋ฉด ๋” ์ข‹์•˜์„ ๊ฒƒ ๊ฐ™๋‹ค. Develop์œผ๋กœ ์˜ฌ๋ฆฌ๊ณ  ํ•˜๋‹ˆ๊นŒ ์–‘์ด ๋ฐฉ๋Œ€ํ•ด์ ธ์„œ ์ˆ˜๋™์œผ๋กœ ์ฒดํฌํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์› ๋‹ค.
  • Monitoring/Logs์— ๊ด€๋ จ๋œ ๋ถ€๋ถ„์ด ์—†์–ด์„œ ์•„์‰ฝ๋‹ค.
  • SonarQube์—์„œ ์ œ๊ณตํ•˜๋Š” ์žฅ์ ์„ ์™„์ „ํ•˜๊ฒŒ ํ™œ์šฉํ•˜์ง€ ๋ชป ํ–ˆ๋‹ค.
profile
๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด๋ณด์ž โœจ

0๊ฐœ์˜ ๋Œ“๊ธ€