Pick-Git์˜ Infrasturcture

Pick-Git์˜ Infrasturcture

2021, Sep 30    

1. ๋“ค์–ด๊ฐ€๋ฉฐ

์•ˆ๋…•ํ•˜์„ธ์š”, ์ผ€๋นˆ์ž…๋‹ˆ๋‹ค. Pick-Git ์„œ๋น„์Šค ๊ฐœ๋ฐœ ์ดˆ๊ธฐ์—๋Š” ์ •๋ง ๋ช‡ ๊ฐœ ์•ˆ๋˜๋Š” AWS EC2๋งŒ์„ ์‚ฌ์šฉํ–ˆ์—ˆ๋Š”๋ฐ์š”. ์ง€์†์ ์œผ๋กœ ์„œ๋น„์Šค๋ฅผ ๊ฐœ์„  ๋ฐ ์šด์˜ํ•˜๋ฉด์„œ ๋‹ค์–‘ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ง๋ฉดํ•˜๊ฒŒ ๋˜์—ˆ์œผ๋ฉฐ, ์†Œ๊ธฐ์˜ ๋ชฉ์ ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ ๋งŽ์€ AWS EC2๋ฅผ ์ƒ์„ฑํ•ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ Pick-Git์˜ Infrasturcture๊ฐ€ ๋‹ค์†Œ ๋ณต์žกํ•ด์กŒ๊ณ , ํ”„๋ก ํŠธ์—”๋“œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฐฑ์—”๋“œ ํŒ€์›์กฐ์ฐจ ์ž์‹ ์ด ๋งก์€ ์˜์—ญ์ด ์•„๋‹ˆ๋ฉด ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ธฐ ํž˜๋“  ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Infrasturcture์— ๋Œ€ํ•œ ํŒ€๋‚ด WiKi ์ž๋ฃŒ๋ฅผ ์ œ์ž‘ํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ์š”. ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ๋ฅผ ํ†ตํ•ด ๋…์ž๋‹˜๋“ค์—๊ฒŒ๋„ Pick-Git ์„œ๋น„์Šค๋ฅผ ์ง€ํƒฑํ•˜๋Š” Infrasturcture๋ฅผ ํ•จ๊ป˜ ๊ณต์œ ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.


2. Overall

image

Pick-Git์—์„œ ์‚ฌ์šฉ ์ค‘์ธ EC2๋Š” ํฌ๊ฒŒ 4๊ฐ€์ง€ ๊ทธ๋ฃน์œผ๋กœ ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค.

  • Product ํ™˜๊ฒฝ ๊ด€๋ จ EC2
  • Develop ํ™˜๊ฒฝ ๊ด€๋ จ EC2
  • Test ํ™˜๊ฒฝ ๊ด€๋ จ EC2
  • ๊ธฐํƒ€ EC2 (Jenkins, SonarQube, nGrinder ๋“ฑ)

์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉ ์ค‘์ธ EC2 ์„œ๋ฒ„์— ๋Œ€ํ•œ SSH(22๋ฒˆ ํฌํŠธ) ์ ‘๊ทผ์€ Bastion ์„œ๋ฒ„ ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘์† ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ํŒ€์›์€ ์ž์‹ ์˜ Local PC์—์„œ SSH๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค EC2 ์„œ๋ฒ„๋กœ ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Bastion EC2 ์„œ๋ฒ„๋กœ SSH ์ ‘์†ํ•œ ๋‹ค์Œ, Bastion ์„œ๋ฒ„ ๋‚ด๋ถ€์—์„œ ์„œ๋น„์Šค EC2 ์„œ๋ฒ„๋กœ SSH ์ ‘์†์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

SSH(22๋ฒˆ ํฌํŠธ)๋Š” ํ˜ธ์ŠคํŠธ๋“ค์ด Public Network๋ฅผ ํ†ตํ•ด ํ†ต์‹ ํ•  ๋•Œ ๋ณด์•ˆ์ ์œผ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœํ† ์ฝœ(๊ณต๊ฐœํ‚ค & ๋น„๋ฐ€ํ‚ค ๋ฐฉ์‹)์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ SSH ๊ด€๋ จ ๋ณด์•ˆ ๊ฒฐํ•จ์ด ๋ฐœ์ƒํ•˜๋ฉด ์„œ๋น„์Šค์— ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SSH(22๋ฒˆ ํฌํŠธ)๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  EC2 ์„œ๋ฒ„์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ˆ˜์ค€์˜ ๋ณด์•ˆ์„ ์„ค์ •ํ•˜๋ ค๋ฉด, Auto-Scaling ๋“ฑ ํ™•์žฅ์„ฑ์„ ๊ณ ๋ คํ•œ ๊ตฌ์„ฑ๊ณผ ๋ฐฐ์น˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Infrasturcture ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ๊ด€๋ฆฌ ํฌ์ธํŠธ ๋˜ํ•œ ๋Š˜์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์—, ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณด์•ˆ ์„ค์ •์„ ์ผ์ • ๋ถ€๋ถ„ ํฌ๊ธฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Bastion ์„œ๋ฒ„๋กœ ๋ณด์•ˆ์„ ์ง‘์ค‘ ์‹œํ‚ค๊ณ , ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๋Š” EC2 ์„œ๋ฒ„๋ฅผ Bastion ์„œ๋ฒ„๋กœ ์—ฐ๊ฒฐ์‹œํ‚ค๋ฉด ๋ชจ๋“  ์„œ๋ฒ„๊ฐ€ ๋™์ผํ•œ ์ˆ˜์ค€์˜ ๋ณด์•ˆ์„ ์†์‰ฝ๊ฒŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•…์„ฑ ๋ฃจํŠธํ‚ท ํ˜น์€ ๋žœ์„ฌ์›จ์–ด ๋“ฑ์œผ๋กœ ํ”ผํ•ด๋ฅผ ๋ณด๋”๋ผ๋„ Bastion Server๋งŒ ์žฌ๊ตฌ์„ฑํ•˜๋ฉด ๋˜๋ฏ€๋กœ, ์„œ๋น„์Šค์— ๋ผ์น˜๋Š” ์•…์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Bastion ์„œ๋ฒ„์— ๋Œ€ํ•œ ๊ตฌ์„ฑ ๋ฐฉ๋ฒ•์€ Bastion ์„œ๋ฒ„ ๊ตฌ์„ฑ ๊ธ€์„ ์ฐธ๊ณ ํ•˜์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.


3. Product ํ™˜๊ฒฝ

image

์„œ๋น„์Šค ์ดˆ๊ธฐ์—๋Š” ์›น ์„œ๋ฒ„(Product Reverse Proxy)์— ํ”„๋ก ํŠธ์—”๋“œ ์ •์  ํŒŒ์ผ์„ ๋ฐฐํฌํ•œ ๋‹ค์Œ, ์ •์  ํŒŒ์ผ ์š”์ฒญ์€ ์›น ์„œ๋ฒ„๊ฐ€ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋™์ ์ธ ์ปจํ…์ธ  ์š”์ฒญ์€ ๋’ท๋‹จ์˜ WAS๋กœ ์š”์ฒญ์„ ์œ„์ž„ํ•ด ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ตฌ์„ฑํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ AWS์—์„œ ์ œ๊ณตํ•˜๋Š” CDN ์„œ๋น„์Šค์ธ CloudFront๋กœ๋„ ์›น ์„œ๋ฒ„๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์บ์‹ฑ ๊ธฐ๋Šฅ ๋“ฑ์˜ ์ด์ ์„ ์ถฉ๋ถ„ํžˆ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ AWS S3์— ํ”„๋ก ํŠธ์—”๋“œ ์ •์  ํŒŒ์ผ์„ ๋ฐฐํฌํ•œ ๋‹ค์Œ, S3 ์ •์  ํŒŒ์ผ ์ฝ๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” CloudFront ์ฃผ์†Œ์— Pick-Git ์„œ๋น„์Šค ์‹ค ๋„๋ฉ”์ธ ์ฃผ์†Œ(https://pick-git.com)๋ฅผ ์—ฐ๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

Product Reverse Proxy ์ฃผ์†Œ๋Š” TLS ์ ์šฉ ๋ฐ Product API ์„œ๋ฒ„ ๋„๋ฉ”์ธ ์ฃผ์†Œ๋ฅผ ์—ฐ๊ฒฐํ•ด๋‘” ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ์ด ์™ธ์—๋„ Reverse Proxy๋Š” Product WAS์— ๋Œ€ํ•œ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ๋ฐ Blue/Green ๋ฐฐํฌ ์ž‘์—… ๋“ฑ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

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

ํ•˜๋‚˜์˜ Slave Node์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ Slave Node(๋‹ค์ค‘ํ™”)๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค๊ฐ€ ์ค‘๋‹จ๋˜์ง€ ์•Š๊ณ  ๊ณ„์† ์ •์ƒ ์šด์˜๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ Master Node ์„œ๋ฒ„์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•ด ์„œ๋ฒ„๊ฐ€ ์ค‘์ง€๋˜๋”๋ผ๋„, Slave Node ์ค‘ 1๊ฐœ๋ฅผ Master Node๋กœ ์Šน๊ฒฉ์‹œ์ผœ ์„œ๋น„์Šค ์ค‘๋‹จ ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ๋ณต๊ตฌํ•˜๋Š” ์ž๋™ Failover ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Write ์ž‘์—…์€ Master Node๊ฐ€ ๋‹ด๋‹นํ•˜๊ณ  Read ์ž‘์—…์€ Slave Node๊ฐ€ ๋‹ด๋‹นํ•จ์œผ๋กœ์จ DB ์„œ๋ฒ„ ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ DB ๋ถ€ํ•˜๋กœ ์ธํ•œ ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ์„œ๋น„์Šค ์žฅ์• ์˜ ์ฃผ ์›์ธ์ธ๋ฐ, ์ด๋ฅผ ๊ฐœ์„ ํ•˜๋Š”๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์š”์ฒญ API์˜ ๊ฒฝ์šฐ Product WAS๊ฐ€ S3๋กœ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์•„์šธ๋Ÿฌ ์œ ์ € ๊ฒ€์ƒ‰ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์œ„ํ•ด Elasticsearch๋ฅผ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค.


4. Test ํ™˜๊ฒฝ

image

Test ํ™˜๊ฒฝ์€ ๋ฐฑ์—”๋“œ API์™€ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•œ Load & Stress Test ์ˆ˜ํ–‰ ๋ฐ ์„ฑ๋Šฅ ์ง„๋‹จ์„ ๋ชฉ์ ์œผ๋กœ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€ํ•œ Product ํ™˜๊ฒฝ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๊ตฌ์„ฑํ–ˆ์œผ๋ฉฐ, nGrinder ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์™ธ๋ถ€ ์‹œ์Šคํ…œ์€ ํ•ญ์ƒ ๊ธฐ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋งŒ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ™˜๊ฒฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ฐ์ฒด๋ฅผ Mockingํ•˜๊ฑฐ๋‚˜ Dummy Controller๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

  • Http Connection Pool ๋ฏธ์‚ฌ์šฉ
  • Connection Thread ๋ฏธ์‚ฌ์šฉ
  • I/O ๋ฏธ๋ฐœ์ƒ

๋“ฑ์˜ ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ์—์„œ ์ค‘์š”ํ•œ ๊ด€์ ์ธ Thread ๋ฐ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์„ ๋ฌด์‹œํ•˜๊ฒŒ ๋˜๋ฉฐ, ํ…Œ์ŠคํŠธ ์‹œ์Šคํ…œ์˜ ์ž์›๊ณผ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๋“ฑ ํ…Œ์ŠคํŠธ์˜ ์‹ ๋ขฐ์„ฑ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์š”์†Œ๋Š” ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ์‹œ์Šคํ…œ์— ์ ˆ๋Œ€๋กœ ์˜ํ–ฅ์„ ๋ฏธ์ณ์„œ๋Š” ์•ˆ ๋˜๊ธฐ ๋•Œ๋ฌธ์—, S3 ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ๋ฐ GitHub API์™€ ๊ฐ™์€ ์™ธ๋ถ€ ์‹œ์Šคํ…œ์€ ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ์‹œ์Šคํ…œ๊ณผ ์™„๋ฒฝํžˆ ๋ถ„๋ฆฌ๋œ Mock ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์–ด ๋ฐฐํฌํ•œ ๋‹ค์Œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

nGrinder๋ฅผ ํ™œ์šฉํ•œ ๋ถ€ํ•˜ ๋ฐ ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ์ƒ์„ธํ•œ ๋‚ด์šฉ์€ ์šฐ์•„ํ•œํ˜•์ œ๋“ค ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ์˜ ๊ฒฐ์ œ ์‹œ์Šคํ…œ ์„ฑ๋Šฅ, ๋ถ€ํ•˜, ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ ๊ธ€์„ ์ฐธ๊ณ ํ•˜์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.


5. Develop ํ™˜๊ฒฝ

image

Develop ํ™˜๊ฒฝ์˜ ๊ฒฝ์šฐ ์ฃผ๋กœ ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ํ”„๋ก ํŠธ์—”๋“œ ๋ฐ ๋ฐฑ์—”๋“œ ๊ธฐ๋Šฅ๋“ค์ด ์œ ๊ธฐ์ ์œผ๋กœ ์ž˜ ์—ฐ๋™๋˜๋Š”์ง€ ๋“ฑ์„ ํ™•์ธํ•˜๋Š” ์—ญํ• ์ž…๋‹ˆ๋‹ค. ์›น ์„œ๋ฒ„(Develop Reverse Proxy)์— ํ”„๋ก ํŠธ์—”๋“œ ์ •์  ํŒŒ์ผ์„ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.


6. CI / CD Pipeline

image

์ „๋ฐ˜์ ์ธ CI / CD Pipeline ํ”Œ๋กœ์šฐ์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜์”ฉ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

6.1. SonarQube Pipeline

image image

Pick-Git ๋ฐฑ์—”๋“œ ํ”„๋กœ์ ํŠธ๋Š” SonarQube๋ฅผ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ •์  ๋ถ„์„์„ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Backend ๋ผ๋ฒจ์ด ๋‹ฌ๋ฆฐ Pull Request๊ฐ€ ์ƒ์„ฑ ๋ฐ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค WebHook์ด Jenkins ์„œ๋ฒ„๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. Jenkins ์„œ๋ฒ„์˜ SonarQube ํŒŒ์ดํ”„๋ผ์ธ์ด ์ด๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์ž‘์—…์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. Build & Test ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๊ณ , JaCoCo ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€ ๋ถ„์„ ๋ฆฌํฌํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ตœ์ข…์ ์œผ๋กœ SonarQube ์„œ๋ฒ„์— ์ •์  ๋ถ„์„์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ถ„์„ ๊ณผ์ •์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์„ฑ๊ณต ํ˜น์€ ์‹คํŒจํ–ˆ์„ ๋•Œ Jenkins๋Š” GitHub Open API๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ•ด๋‹น PR์— ๊ฒฐ๊ณผ๋ฅผ ๋Œ“๊ธ€๋กœ ์•Œ๋ฆผํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ๊ธฐ์ค€ ๋ฏธ์ถฉ์กฑ ๋“ฑ ํŒŒ์ดํ”„๋ผ์ธ์ด ์‹คํŒจํ•œ ๊ฒฝ์šฐ Pull Request Merge๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


6.2. Deploy Pipeline

image image

Pull Request Merge๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด WebHook์ด Jenkins ์„œ๋ฒ„๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ, ์–ด๋–ค ๋ธŒ๋žœ์น˜๋กœ ์ฝ”๋“œ๊ฐ€ ๋ณ‘ํ•ฉ๋ฌ์œผ๋ฉฐ Pull Request์˜ ๋ผ๋ฒจ์ด Backend์™€ Frontend ์ค‘ ์–ด๋–ค ๊ฒƒ์ธ์ง€ ๋“ฑ์˜ ์ •๋ณด๋ฅผ Jenkins๊ฐ€ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š” Pipeline์„ ์ฐพ์•„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ ํ•ฉํ•œ ์„œ๋ฒ„๋กœ ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

๋ฐฑ์—”๋“œ์˜ ๊ฒฝ์šฐ Build & Test ์ž‘์—… ๋ฐ Rest Docs ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.


7. ๋งˆ์น˜๋ฉฐ

image image image image

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

๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ ์›์ธ์„ ํ”„๋ก ํŠธ์—”๋“œ ํŒ€์›์˜ ๋ˆˆ๋†’์ด๊ฐ€ ์•„๋‹Œ ๋ฐฑ์—”๋“œ ์ž…์žฅ์—์„œ ๋„ˆ๋ฌด ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๊ณ  ๋„˜์–ด๊ฐ”์Šต๋‹ˆ๋‹ค. ๐Ÿ˜… ์ดํ›„ ํšŒ๊ณ  ๋•Œ, ํ”„๋ก ํŠธ์—”๋“œ ํŒ€์›์ด ๋ฌธ์ œ ์›์ธ์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋ฐฑ์—”๋“œ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐํ•  ๋•Œ๊นŒ์ง€ ๊ทธ์ € ๋Œ€๊ธฐํ•ด์•ผ๋งŒ ํ•˜๋‹ˆ ์•ฝ๊ฐ„ ๋‹ต๋‹ตํ•˜๋‹ค๋Š” ๊ณ ์ถฉ์„ ํ† ๋กœํ–ˆ์Šต๋‹ˆ๋‹ค.

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



References