λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
BackEnd🌱/Etc

[CI/CD] CI/CDλž€?, 지속적 톡합(Continuous Integration) κ³Ό 지속적 배포(Continuous Deployment)

by μ•ˆμ£Όν˜• 2022. 5. 31.

μ„œλ‘ 

ν˜„μž¬ 자그만 토이 ν”„λ‘œμ νŠΈλ₯Ό ν˜‘μ—…ν•˜μ—¬ 진행 쀑인데, νŒ€μ›κ³Ό μ œλŒ€λ‘œ branch μΆ©λŒμ„ ν•΄κ²°ν•˜μ§€ λͺ»ν•΄ μΌμ–΄λ‚˜λŠ” μ—λŸ¬μ™€, μˆ˜μž‘μ—…μœΌλ‘œ EC2에 μ ‘μ†ν•˜μ—¬ 직접 배포λ₯Ό ν•΄μ•Ό ν•˜λŠ” μ‚¬μ†Œν•˜μ§€λ§Œ μž‘μ—…λ“€μ΄ μ‹ κ²½ μ“°μ΄κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ €λŠ” 이 ν”„λ‘œμ νŠΈμ— GitHub Action을 μ΄μš©ν•˜μ—¬ CI/CDλ₯Ό μ μš©ν–ˆλŠ”λ°  이번 κ²Œμ‹œκΈ€μ—μ„œλŠ” μ΄λŸ¬ν•œ μž‘μ—…λ“€μ„ μžλ™ν™”μ‹œμΌœμ£ΌλŠ” CI/CD에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄κ³  λ‹€μŒ κ²Œμ‹œκΈ€μ—μ„œλŠ” μ—¬λŸ¬ 개의 CI/CD 툴 쀑 GitHub Action을 μ΄μš©ν•œ CI/CD μ μš©μ— λŒ€ν•΄μ„œ 정리해 λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

CI(Continuous Integration)

CI(Continuous Integration)λŠ” "지속적인 톡합" μ΄λΌλŠ” 의미둜, μš”μ•½ν•˜μžλ©΄ λΉŒλ“œ/ν…ŒμŠ€νŠΈ μžλ™ν™” κ³Όμ •μž…λ‹ˆλ‹€. 

μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— λŒ€ν•œ μƒˆλ‘œμš΄ μ½”λ“œ λ³€κ²½ 사항이 정기적, μžλ™μ μœΌλ‘œ λΉŒλ“œ 및 ν…ŒμŠ€νŠΈλ˜μ–΄ 곡유 리포지토리에 ν†΅ν•©λ˜λ―€λ‘œ CIλ₯Ό μ„±κ³΅μ μœΌλ‘œ κ΅¬ν˜„ν•  경우 μ—¬λŸ¬ λͺ…μ˜ κ°œλ°œμžκ°€ λ™μ‹œμ— μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 개발과 κ΄€λ ¨λœ μ½”λ“œ μž‘μ—…μ„ ν•  경우 μ„œλ‘œ μΆ©λŒν•  수 μžˆλŠ” 문제λ₯Ό μ†μ‰½κ²Œ ν™•μΈν•˜κ³  ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ ν•˜λ‚˜μ˜ ν”„λ‘œμ νŠΈλ₯Ό μ—¬λŸ¬ κ°œλ°œμžλ“€κ³Ό ν•¨κ»˜ ν˜•μƒκ΄€λ¦¬ 툴(git, svn λ“±)을 μ΄μš©ν•˜μ—¬ μ§„ν–‰ν•˜κ³  μžˆλ‹€κ³  κ°€μ •ν•©μ‹œλ‹€. μ—¬κΈ°μ„œ ν•œλ²ˆμ―€μ€ merge μ‹œ μΆ©λŒλ˜λŠ” μ½”λ“œκ°€ λ°œμƒν•  κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€. λ¬Όλ‘  μ΄λ•Œ branch μΆ©λŒμ„ κΉ”λ”ν•˜κ²Œ ν•΄κ²°ν•œλ‹€λ©΄ 쒋은 κ²½μš°μ§€λ§Œ λ¬Έμ œλŠ” 본인은 μΆ©λŒμ„ ν•΄κ²°ν–ˆλ‹€κ³  μƒκ°ν–ˆμ§€λ§Œ μ˜ˆμƒν•˜μ§€ λͺ»ν•œ μ—λŸ¬κ°€ 배포할 λ•Œ λ°œμƒν•˜λŠ” κ²½μš°κ°€ 생길 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ•Œ λ˜λ‹€μ‹œ ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•˜κ³  λ°°ν¬κΉŒμ§€ ν•œλ‹€λ©΄ μƒλ‹Ήνžˆ λ§Žμ€ μ‹œκ°„μ„ μ†Œμš”ν•˜κ²Œ λ©λ‹ˆλ‹€. 

ν•˜μ§€λ§Œ CIλ₯Ό μ μš©ν•˜λ©΄ 컀밋할 λ•Œλ§ˆλ‹€ λΉŒλ“œμ™€ 일련의 μžλ™ ν…ŒμŠ€νŠΈκ°€ 이루어져 λ™μž‘μ„ ν™•μΈν•˜κ³  λ³€κ²½μœΌλ‘œ 인해 λ¬Έμ œκ°€ μƒκΈ°λŠ” λΆ€λΆ„(컴파일 μ—λŸ¬ λ“±)이 없도둝 보μž₯ν•©λ‹ˆλ‹€. 즉, github상에 μ½”λ“œλ§Œ 올리면 λ‚˜λ¨Έμ§€ μž‘μ—…μΈ ν…ŒμŠ€νŠΈμ™€ λΉŒλ“œλŠ” ν”„λ‘œκ·Έλž¨μ΄ μžλ™μœΌλ‘œ ν•΄μ€€λ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€.

CI의 κ°„λ‹¨ν•œ μˆœμ„œ

  1. κ°œλ°œμžκ°€ κ΅¬ν˜„ν•œ μ½”λ“œλ₯Ό κΈ°μ‘΄ μ½”λ“œμ™€ λ³‘ν•©ν•œλ‹€.
  2. λ³‘ν•©λœ μ½”λ“œκ°€ μ˜¬λ°”λ₯΄κ²Œ λ™μž‘ν•˜κ³  λΉŒλ“œλ˜λŠ”μ§€ κ²€μ¦ν•œλ‹€.
  3. ν…ŒμŠ€νŠΈ κ²°κ³Ό λ¬Έμ œκ°€ μžˆλ‹€λ©΄ μˆ˜μ •ν•˜κ³  λ‹€μ‹œ 1둜 λŒμ•„κ°„λ‹€. λ¬Έμ œκ°€ μ—†λ‹€λ©΄ 배포λ₯Ό μ§„ν–‰ν•œλ‹€.

CI의 μž₯점

  • μ½”λ“œμ˜ 검증에 λ“€μ–΄κ°€λŠ” μ‹œκ°„μ΄ 쀄어든닀.
  • 개발 νŽΈμ˜μ„±μ΄ μ¦κ°€ν•œλ‹€.
  • 항상 ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό ν†΅κ³Όν•œ μ½”λ“œλ§Œμ΄ λ ˆν¬μ§€ν† λ¦¬μ— μ˜¬λΌκ°€κΈ° λ•Œλ¬Έμ—, 쒋은 μ½”λ“œ 퀄리티λ₯Ό μœ μ§€ν•  수 μžˆλ‹€.

λ˜ν•œ CIλŠ” κ·Έ 자체만으둜 μœ μ΅ν•˜μ§€λ§Œ CI/CD νŒŒμ΄ν”„λΌμΈμ„ κ΅¬ν˜„ν•˜κΈ° μœ„ν•œ 첫 번째 단계이기도 ν•©λ‹ˆλ‹€.

 

CD(Continuous Delivery)

CDλŠ”  "Continuous Delivery, 지속적인 제곡" μ΄λΌλŠ” μ˜λ―Έμ™€ "Contunuous Deployment, 지속적인 배포"λΌλŠ” μ˜λ―Έμž…λ‹ˆλ‹€.

두 가지 의미 λͺ¨λ‘ νŒŒμ΄ν”„λΌμΈμ˜ 좔가단계에 λŒ€ν•œ μžλ™ν™”λ₯Ό λœ»ν•˜μ§€λ§Œ λ•Œλ‘œλŠ” μ–Όλ§ˆλ‚˜ λ§Žμ€ μžλ™ν™”κ°€ 이루어지고 μžˆλŠ”μ§€λ₯Ό μ„€λͺ…ν•˜κΈ° μœ„ν•΄ λ³„λ„λ‘œ μ‚¬μš©λ˜κΈ°λ„ ν•©λ‹ˆλ‹€.

  • 지속적인 제곡(Continuous Delivery)은 곡유 λ ˆν¬μ§€ν† λ¦¬λ‘œ μžλ™μœΌλ‘œ Release ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.
  • 지속적인 배포(Continuous Deployment)λŠ” Production 레벨 κΉŒμ§€ μžλ™μœΌλ‘œ λ°°ν¬ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

즉, μ •λ¦¬ν•˜μžλ©΄ 지속적 μ œκ³΅μ€ CIλ₯Ό ν†΅ν•΄μ„œ μƒˆλ‘œμš΄ μ†ŒμŠ€μ½”λ“œμ˜ λΉŒλ“œμ™€ ν…ŒμŠ€νŠΈ λ³‘ν•©κΉŒμ§€ μ„±κ³΅μ μœΌλ‘œ μ§„ν–‰λ˜μ—ˆλ‹€λ©΄, λΉŒλ“œμ™€ ν…ŒμŠ€νŠΈλ₯Ό κ±°μ³μ„œ github와 같은 μ €μž₯μ†Œμ— μ—…λ‘œλ“œν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

지속적 λ°°ν¬λŠ” μ΄λ ‡κ²Œ μ„±κ³΅μ μœΌλ‘œ λ³‘ν•©λœ 내역을 μ €μž₯μ†ŒλΏλ§Œ μ•„λ‹ˆλΌ μ‚¬μš©μžκ°€ μ‚¬μš©ν•  수 μžˆλŠ” λ°°ν¬ν™˜κ²½κΉŒμ§€ λ¦΄λ¦¬μ¦ˆν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.( ex) μžλ™μœΌλ‘œ EC2μ—μ„œ ν”„λ‘œμ νŠΈλ₯Ό λΉŒλ“œν•¨)

CI/CD의 흐름도

CI/CD 흐름도

  1. CIλ₯Ό μ μš©ν•˜μ—¬ μ½”λ“œλ₯Ό κ²€μ¦ν•œλ‹€.
  2. 배포 ν™˜κ²½κ³Ό λΉ„μŠ·ν•œ κ³³μ—μ„œ 검증을 μ§„ν–‰ν•œλ‹€.
  3. κ²€μ¦λœ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό μ‹€μ œ ν”„λ‘œλ•μ…˜ ν™˜κ²½μœΌλ‘œ λ°°ν¬ν•œλ‹€.

CD의 μž₯점

  1. κ°œλ°œμžκ°€ λ°°ν¬λ³΄λ‹€λŠ” κ°œλ°œμ— λ”μš± μ‹ κ²½ μ“Έ 수 μžˆλ„λ‘ 도와쀀닀.
  2. κ°œλ°œμžκ°€ μˆ˜μž‘μ—… 없이 λΉŒλ“œ, ν…ŒμŠ€νŠΈ, λ°°ν¬κΉŒμ§€ μžλ™ν™”λ₯Ό ν• μˆ˜ μžˆλ‹€.

 

μš”μ•½

CI/CDλ₯Ό μ μš©ν•˜κΈ° μ „

  1. κ°œλ°œμžλ“€μ΄ κ°œλ°œν•˜μ—¬ μ½”λ“œλ₯Ό μˆ˜μ •ν•œλ‹€.
  2. 각자의 λΈŒλžœμΉ˜μ— μ½”λ“œλ₯Ό push ν•œλ‹€. (μ΄λ•Œ μ–΄λŠ ν•œ λΆ€λΆ„μ—μ„œ μ—λŸ¬κ°€ λ‚¬μ§€λ§Œ κ°œλ°œμžλ“€μ€ λˆˆμΉ˜μ±„μ§€ λͺ»ν•œλ‹€.)
  3. branchλ₯Ό main branch에 톡합(merge)ν•œλ‹€.
  4. ec2ν™˜κ²½(배포 ν™˜κ²½)μ—μ„œ λ°°ν¬ν•˜κΈ° μœ„ν•΄ buildλ₯Ό μ§„ν–‰ν•œλ‹€.
  5. λ¬Έμ œκ°€ μžˆλŠ” μ½”λ“œμ΄κΈ°μ— μ—λŸ¬κ°€ λ°œμƒν•˜κ³ , μ½”λ“œλ₯Ό λ‹€μ‹œ 개발 ν™˜κ²½μœΌλ‘œ κ°€μ Έμ™€μ„œ μ½”λ“œλ₯Ό μˆ˜μ •ν•œλ‹€.
  6. (1) ~ (5)의 과정을 λ°˜λ³΅ν•œλ‹€.
  7. λ§Žμ€ μ‹œκ°„μ„ ν• μ• ν•˜μ—¬ μ—λŸ¬κ°€ ν•΄κ²°λ˜μ—ˆμœΌλ©΄ 배포λ₯Ό μ‹œμž‘ν•œλ‹€. ν•˜μ§€λ§Œ 배포 κ³Όμ • λ˜ν•œ, κ°œλ°œμžκ°€ 과정을 κ±°μΉ˜λ―€λ‘œ λ§Žμ€ μ‹œκ°„μ„ μ†Œμš”ν•˜κ²Œ λœλ‹€.

CI/CDλ₯Ό μ μš©ν•œ ν›„ 

  1. κ°œλ°œμžλ“€μ΄ κ°œλ°œν•˜μ—¬ λΈŒλžœμΉ˜μ— μ½”λ“œλ₯Ό push ν•œλ‹€.
  2. git pushλ₯Ό 톡해 Trigger λ˜μ–΄ CIμ„œλ²„μ—μ„œ μ•Œμ•„μ„œ Build, Test, Lintλ₯Ό μ‹€ν–‰ν•˜κ³  κ²°κ³Όλ₯Ό μ „μ†‘ν•œλ‹€.
  3. κ°œλ°œμžλ“€μ€ κ²°κ³Όλ₯Ό 전솑받고 μ—λŸ¬κ°€ λ‚œ 뢀뢄이 μžˆλ‹€λ©΄ μ—λŸ¬ 뢀뢄을 μˆ˜μ •ν•˜κ³  μ½”λ“œλ₯Ό main λΈŒλžœμΉ˜μ— merge ν•œλ‹€.
  4. main λΈŒλžœμΉ˜μ— μ½”λ“œλ₯Ό merge ν•˜κ³  Build, Testκ°€ μ •μƒμ μœΌλ‘œ μˆ˜ν–‰μ΄ λ˜μ—ˆλ‹€λ©΄ CIμ„œλ²„μ—μ„œ μ•Œμ•„μ„œ Deploy(배포) 과정을 μˆ˜ν–‰ν•œλ‹€.

 

μ°Έκ³ 

λŒ“κΈ€