์ง€์†์ ์ธ ํ†ตํ•ฉ(Continuous Integration) ๋ฐ ์ง€์†์ ์ธ ๋ฐฐํฌ(Continuous Development)๋ฅผ ์˜๋ฏธํ•˜๋Š” CI/CD ๊ตฌ์„ฑ์€ ํ˜„๋Œ€ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๋ฐฉ์‹์—์„œ ์ค‘์š”ํ•œ ์ธก๋ฉด์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๊ตฌ์กฐํ™”๋˜๊ณ  ์ž๋™ํ™”๋œ ํŒŒ์ดํ”„๋ผ์ธ์„ ํ†ตํ•ด ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ์›ํ™œํ•œ ํ†ตํ•ฉ ๋ฐ ๋ฐฐํฌ๋ฅผ ์ด‰์ง„ํ•˜์—ฌ ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋†’์€ ์†Œํ”„ํŠธ์›จ์–ด ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๋Š” ํฌ๊ด„์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๊ณ ๊ฐ์—๊ฒŒ ๋” ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ด๋ฉฐ ๋น„์šฉ ํšจ์œจ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” AppMaster ์™€ ๊ฐ™์€ ํ”Œ๋žซํผ์— ํŠนํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

CI(์ง€์†์  ํ†ตํ•ฉ)๋Š” ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž์˜ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ณต์œ  ๋ฉ”์ธ๋ผ์ธ ์ €์žฅ์†Œ์— ๊ฐ€๋Šฅํ•œ ํ•œ ์ž์ฃผ ๊ทธ๋ฆฌ๊ณ  ๋น ๋ฅด๊ฒŒ ๋ณ‘ํ•ฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์ˆ˜์ •ํ•˜์—ฌ ์ „์ฒด ๊ฐœ๋ฐœ ์‹œ๊ฐ„๊ณผ ์œ ์ง€ ๊ด€๋ฆฌ ๋น„์šฉ์„ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰๋˜๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ „์— ๋ฒ„๊ทธ๋‚˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋ฅผ ํฌ์ฐฉํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Puppet์˜ "State of DevOps Report"์— ๋”ฐ๋ฅด๋ฉด CI๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์šฐ์ˆ˜ํ•œ ํŒ€์€ ๋ฐฐํฌ ์‹คํŒจ๋ฅผ 24๋ฐฐ ๋” ๋น ๋ฅด๊ฒŒ ๋ณต๊ตฌํ•˜๊ณ  ๋™๋ฃŒ๋ณด๋‹ค 3๋ฐฐ ๋‚ฎ์€ ๋ณ€๊ฒฝ ์‹คํŒจ์œจ์„ ๋ณด์ž…๋‹ˆ๋‹ค.

CD(์ง€์†์  ๋ฐฐํฌ)๋Š” CI๋ฅผ ํ•œ ๋‹จ๊ณ„ ๋” ๋ฐœ์ „์‹œ์ผœ ์‹คํ–‰ ํŒŒ์ผ ๋นŒ๋“œ๋ถ€ํ„ฐ ์ ์ ˆํ•œ ํ™˜๊ฒฝ์— ๋ฐฐํฌ๊นŒ์ง€ ์ „์ฒด ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ๋ฐฐํฌ๋˜์–ด ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐœ์„  ์‚ฌํ•ญ, ๋ฒ„๊ทธ ์ˆ˜์ • ๋ฐ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋” ๋นจ๋ฆฌ ๊ฒฝํ—˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์„œ ์–ธ๊ธ‰ํ•œ Puppet ๋ณด๊ณ ์„œ์— ๋”ฐ๋ฅด๋ฉด, ์—ฐ๊ตฌ์— ๋”ฐ๋ฅด๋ฉด CI/CD๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ํŒ€์€ ๋™๋ฃŒ์— ๋น„ํ•ด ๋ฆฌ๋“œ ํƒ€์ž„์ด 2,555๋ฐฐ ๋” ๋นจ๋ผ์ง€๊ณ  200๋ฐฐ ๋” ์ž์ฃผ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ž๋™ํ™”๋œ CD ํŒŒ์ดํ”„๋ผ์ธ์€ ๋ฐฐํฌ ๋นˆ๋„์™€ ํšจ์œจ์„ฑ์„ ๋†’์ผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค์—์„œ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  ์‚ฌ๋žŒ์˜ ์‹ค์ˆ˜๋กœ ๋ฐœ์ƒํ•  ์œ„ํ—˜์„ ์ค„์—ฌ์ค๋‹ˆ๋‹ค.

AppMaster ์ปจํ…์ŠคํŠธ์˜ CI/CD ๊ตฌ์„ฑ์€ ์ง€์†์ ์ธ ํ†ตํ•ฉ๊ณผ ์ง€์†์ ์ธ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ์„ ์„ค์ •, ๊ด€๋ฆฌ ๋ฐ ์ตœ์ ํ™”ํ•˜๋Š” ์ „์ฒด ํ”„๋กœ์„ธ์Šค๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํŒŒ์ดํ”„๋ผ์ธ์„ ํ†ตํ•ด ์ง„ํ–‰๋˜๋Š” ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ์ž๋™ํ™”๋œ ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์ง€์›ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ธํ”„๋ผ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

AppMaster ์˜ ํ”Œ๋žซํผ์€ CI/CD ๊ตฌ์„ฑ์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ฒญ์‚ฌ์ง„ ๋ณ€๊ฒฝ๋ถ€ํ„ฐ ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ๊นŒ์ง€ ๊ฐ„์†Œํ™”๋œ ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ณ ๊ฐ์ด ํ”„๋กœ์ ํŠธ์—์„œ '๊ฒŒ์‹œ' ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํ”Œ๋žซํผ์˜ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์ด ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. AppMaster ๋ฐฑ์—”๋“œ, ์›น ๋ฐ ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์šฉ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์„ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค; ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด Docker ์ปจํ…Œ์ด๋„ˆ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํŒจํ‚ค์ง•ํ•ฉ๋‹ˆ๋‹ค. 30์ดˆ ์ด๋‚ด์— ํด๋ผ์šฐ๋“œ์— ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

์ด ์‹ ์†ํ•œ CI/CD ํ”„๋กœ์„ธ์Šค๋Š” AppMaster ์‚ฌ์šฉ์ž์—๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋งŽ์€ ์ด์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ๊ธฐ์ˆ  ๋ถ€์ฑ„ ๊ฐ์†Œ : AppMaster ์ฒญ์‚ฌ์ง„์ด ์ˆ˜์ •๋  ๋•Œ๋งˆ๋‹ค ์ฒ˜์Œ๋ถ€ํ„ฐ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์‹œ ์ƒ์„ฑํ•จ์œผ๋กœ์จ ๋ณธ์งˆ์ ์œผ๋กœ ๋‚จ์•„ ์žˆ๋Š” ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • ํ™•์žฅ์„ฑ : ํด๋ผ์šฐ๋“œ ๋ฐฐํฌ ๋ฐ Go ๊ธฐ๋ฐ˜ ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ†ตํ•ด ๋›ฐ์–ด๋‚œ ํ™•์žฅ์„ฑ์„ ์ œ๊ณตํ•˜์—ฌ ๊ณ ๋ถ€ํ•˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ˆ˜์šฉํ•˜๊ณ  ๊ธฐ์—…์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฒ„์ „ ์ œ์–ด : Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค์˜ ์ผ๊ด€์„ฑ์ด ๋ณด์žฅ๋˜๊ณ  ์ˆ˜๋™ ๊ฐœ์ž… ์—†์ด๋„ ํšจ๊ณผ์ ์ธ ๋ฒ„์ „ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ์œ ์—ฐํ•œ ์—…๋ฐ์ดํŠธ : AppMaster ์˜ ์„œ๋ฒ„ ์ค‘์‹ฌ ์ ‘๊ทผ ๋ฐฉ์‹์„ ํ†ตํ•ด ๊ณ ๊ฐ์€ App Store ๋˜๋Š” Play Market์— ์ƒˆ ๋ฒ„์ „์„ ์ œ์ถœํ•˜์ง€ ์•Š๊ณ ๋„ ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—…๋ฐ์ดํŠธ(UI, ๋กœ์ง ๋ฐ API ํ‚ค)๋ฅผ ํ‘ธ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ AppMaster ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ์„œ๋ฒ„ endpoints ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์œ„ํ•œ Swagger(๊ฐœ๋ฐฉํ˜• API) ๋ฌธ์„œ๋ฅผ ํฌํ•จํ•˜์—ฌ CI/CD ํ”„๋กœ์„ธ์Šค๋ฅผ ์ง€์›ํ•˜๋Š” ์ถ”๊ฐ€ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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