๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœํŒ€์˜ CI ์ง„ํ™”

์˜ค๋Š˜๋‚  ๋Œ€๋ถ€๋ถ„์˜ ์†Œํ”„ํŠธ์›จ์–ด ์ œํ’ˆ์€ ํŒ€์œผ๋กœ ๊ฐœ๋ฐœ๋ฉ๋‹ˆ๋‹ค. ์„ฑ๊ณต์ ์ธ ํŒ€ ๊ฐœ๋ฐœ์˜ ์กฐ๊ฑด์€ ๊ฐ„๋‹จํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ ํ˜•ํƒœ๋กœ ํ‘œํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœํŒ€์˜ CI ์ง„ํ™”

์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ํ›„์—๋Š” ๋‹ค์Œ ์‚ฌํ•ญ์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ะ ะฐะฑะพั‚ะฐะตั‚.
  2. ๋™๋ฃŒ๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜์—ฌ ์–ด๋–ค ๊ฒƒ๋„ ๊นจ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‘ ๊ฐ€์ง€ ์กฐ๊ฑด์ด ๋ชจ๋‘ ์ถฉ์กฑ๋˜๋ฉด ์„ฑ๊ณต์˜ ๊ธธ๋กœ ๋“ค์–ด์„œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์กฐ๊ฑด์„ ์‰ฝ๊ฒŒ ํ™•์ธํ•˜๊ณ  ์ˆ˜์ต์„ฑ ์žˆ๋Š” ๊ฒฝ๋กœ์—์„œ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ์ง€์†์  ํ†ตํ•ฉ(Continuous Integration)์„ ์ƒ๊ฐํ•ด๋ƒˆ์Šต๋‹ˆ๋‹ค.

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

  • ์นœ์• ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ํ•œ ์‹œ๊ฐ„ ์ž‘์—…์€ ์„œ๋ฒ„์˜ ํ•œ ์‹œ๊ฐ„ ์ž‘์—…๋ณด๋‹ค ๋น„์Œ‰๋‹ˆ๋‹ค.
  • ์‚ฌ๋žŒ๋“ค์€ ์‹ค์ˆ˜๋ฅผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ž˜๋ชป๋œ ๋ธŒ๋žœ์น˜์—์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ํ…Œ์Šคํ„ฐ๋ฅผ ์œ„ํ•ด ์ž˜๋ชป๋œ ์ปค๋ฐ‹์ด ์ปดํŒŒ์ผ๋˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ๋žŒ๋“ค์€ ๊ฒŒ์œผ๋ฅด๋‹ค. ๊ฐ€๋” ์ž‘์—…์„ ๋งˆ์น˜๋ฉด "ํ™•์ธํ•  ๊ฒƒ์ด ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? "๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‘ ์ค„์„ ์ผ์Šต๋‹ˆ๋‹ค - ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค! ์—ฌ๋Ÿฌ๋ถ„ ์ค‘์—๋„ ๊ฐ€๋” ๊ทธ๋Ÿฐ ์ƒ๊ฐ์„ ํ•˜์‹œ๋Š” ๋ถ„๋“ค์ด ๊ณ„์‹œ๋ฆฌ๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•ญ์ƒ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Nikolai Nesterov๋Š” Avito ๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœ ํŒ€์—์„œ ์ง€์†์ ์ธ ํ†ตํ•ฉ์ด ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ ๋ฐ ๊ฐœ๋ฐœ๋˜์—ˆ๋Š”์ง€, ์–ด๋–ป๊ฒŒ ํ•˜๋ฃจ์— 0์—์„œ 450๊ฐœ์˜ ๋นŒ๋“œ๋กœ ์ด๋™ํ–ˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๋นŒ๋“œ ๊ธฐ๊ณ„๊ฐ€ ํ•˜๋ฃจ 200์‹œ๊ฐ„ ๋™์•ˆ ์กฐ๋ฆฝ๋˜์—ˆ๋Š”์ง€์— ๋Œ€ํ•ด ๋งํ•ฉ๋‹ˆ๋‹ค.๋„ค์Šคํ…Œ๋กœํ”„)๋Š” CI/CD Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ์ง„ํ™”์  ๋ณ€ํ™”์— ์ฐธ์—ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ด์•ผ๊ธฐ๋Š” Android ๋ช…๋ น์˜ ์˜ˆ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ์ ‘๊ทผ ๋ฐฉ์‹์€ iOS์—๋„ ์ ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


์˜›๋‚  ์˜›์ ์— ํ•œ ์‚ฌ๋žŒ์ด Avito Android ํŒ€์—์„œ ์ผํ–ˆ์Šต๋‹ˆ๋‹ค. ์ •์˜์— ๋”ฐ๋ฅด๋ฉด ๊ทธ๋Š” ์ง€์†์ ์ธ ํ†ตํ•ฉ์—์„œ ์•„๋ฌด๊ฒƒ๋„ ํ•„์š”ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ†ตํ•ฉํ•  ์‚ฌ๋žŒ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์„ฑ์žฅํ•˜๊ณ  ์ ์  ๋” ๋งŽ์€ ์ƒˆ๋กœ์šด ์ž‘์—…์ด ๋“ฑ์žฅํ–ˆ์œผ๋ฉฐ ๊ทธ์— ๋”ฐ๋ผ ํŒ€๋„ ์„ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋Š ์‹œ์ ์—์„œ๋Š” ์ฝ”๋“œ ํ†ตํ•ฉ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณด๋‹ค ๊ณต์‹์ ์œผ๋กœ ํ™•๋ฆฝํ•ด์•ผ ํ•  ๋•Œ์ž…๋‹ˆ๋‹ค. Git flow๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœํŒ€์˜ CI ์ง„ํ™”

Git ํ๋ฆ„์˜ ๊ฐœ๋…์€ ์ž˜ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์—๋Š” ํ•˜๋‚˜์˜ ๊ณตํ†ต ๊ฐœ๋ฐœ ๋ถ„๊ธฐ๊ฐ€ ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๊ฐœ๋ฐœ์ž๋Š” ๋ณ„๋„์˜ ๋ถ„๊ธฐ๋ฅผ ์ž˜๋ผ์„œ ์ปค๋ฐ‹ํ•˜๊ณ  ํ‘ธ์‹œํ•œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๊ฐœ๋ฐœ ๋ถ„๊ธฐ์— ๋ณ‘ํ•ฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ํ’€ ์š”์ฒญ. ์ง€์‹์„ ๊ณต์œ ํ•˜๊ณ  ์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ ๊ฒ€ํ† ๋ฅผ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋™๋ฃŒ๊ฐ€ ์„œ๋กœ์˜ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜๊ณ  ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜ํ‘œ

๋ˆˆ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋ณด๋Š” ๊ฒƒ์€ ๋ฉ‹์ง€์ง€๋งŒ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž๋™ ๊ฒ€์‚ฌ๊ฐ€ ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์šฐ์„ , ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค ๋ฐฉ์ฃผ ์กฐ๋ฆฝ.
  • ๋งŽ์€ Junit ํ…Œ์ŠคํŠธ.
  • ์šฐ๋ฆฌ๋Š” ์ฝ”๋“œ ์ ์šฉ ๋ฒ”์œ„๋ฅผ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค, ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ ์ค‘์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ฒ€์‚ฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด Avito์˜ ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐœ๋žต์ ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋…ธํŠธ๋ถ์—์„œ ์Šค์บ”์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜๋Š” ์‚ฌ๋žŒ์€ ์•„๋ฌด๋„ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ธฐ๋Šฅ์„ ์™„๋ฃŒํ•˜๋ฉด ์‹ ์†ํ•˜๊ฒŒ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ํ‘ธ์‹œํ•˜๊ณ  ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์„ ์—ด๊ณ  ์‹ถ์–ดํ•ฉ๋‹ˆ๋‹ค. ์ด ์ˆœ๊ฐ„ ๋ช‡ ๊ฐ€์ง€ ๊ธด ๊ฒ€์‚ฌ๊ฐ€ ์‹œ์ž‘๋˜๋ฉด ์ด๋Š” ๋งค์šฐ ์ฆ๊ฒ์ง€ ์•Š์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฐœ๋ฐœ ์†๋„๋„ ๋Š๋ ค์ง‘๋‹ˆ๋‹ค. ๋…ธํŠธ๋ถ์ด ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ๋™์•ˆ์—๋Š” ์ •์ƒ์ ์œผ๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋ฐค์— ๊ฒ€์‚ฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ •๋ง ์ข‹์•„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„๊ณผ ์„œ๋ฒ„๊ฐ€ ๋งŽ๊ณ  ๋Œ์•„๋‹ค๋‹ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ถˆํ–‰ํ•˜๊ฒŒ๋„ ๊ธฐ๋Šฅ ์ฝ”๋“œ๊ฐ€ ๊ฐœ๋ฐœ๋˜๋ฉด ๊ฐœ๋ฐœ์ž๋Š” CI์—์„œ ๋ฐœ๊ฒฌํ•œ ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๋Š” ๋™๊ธฐ๊ฐ€ ํ›จ์”ฌ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. ์•„์นจ ๋ณด๊ณ ์„œ์—์„œ ๋ฐœ๊ฒฌ๋œ ๋ชจ๋“  ์˜ค๋ฅ˜๋ฅผ ์‚ดํŽด๋ณด๋ฉด์„œ ์–ธ์  ๊ฐ€๋Š” ์ˆ˜์ •ํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ์ฃผ๊ธฐ์ ์œผ๋กœ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ Jira์— ์ œ๊ฐ€ ์‹œ์ž‘ํ•˜๊ณ  ์‹ถ์€ ๋ฉ‹์ง„ ์ƒˆ ์ž‘์—…์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ฒ€์‚ฌ๊ฐ€ ํ’€ ์š”์ฒญ์„ ์ฐจ๋‹จํ•˜๋ฉด ๋™๊ธฐ๊ฐ€ ์ถฉ๋ถ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋นŒ๋“œ๊ฐ€ ๋…น์ƒ‰์œผ๋กœ ๋ฐ”๋€” ๋•Œ๊นŒ์ง€ ์ฝ”๋“œ๊ฐ€ ๊ฐœ๋ฐœ๋˜์ง€ ์•Š์•„ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

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

๋‹น์‹œ์—๋Š” ๋ชจ๋“  ๋นŒ๋“œ๊ฐ€ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์™„๋ฃŒ๋˜์—ˆ์œผ๋ฏ€๋กœ ARK ๋นŒ๋“œ, Junit ํ…Œ์ŠคํŠธ ๋ฐ ์ฝ”๋“œ ์ ์šฉ ๋ฒ”์œ„ ๊ณ„์‚ฐ์„ ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์— ๋Œ€ํ•œ ์ฐจ๋‹จ ์žฅ์น˜๋กœ ํฌํ•จ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์ผœ๊ณ , ์ƒ๊ฐํ•ด๋ณด๊ณ , ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ์ฝ”๋“œ ์ ์šฉ์„ ํฌ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ CI๋ฅผ ์™„์ „ํžˆ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ์ดํ‹€์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. (์ดํ•˜ ์˜ˆ์ƒ ์‹œ๊ฐ„์€ ๋Œ€๋žต์ ์ธ ๊ฒƒ์ด๋ฉฐ ๊ทœ๋ชจ์— ๋”ฐ๋ผ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.)

๊ทธ ํ›„ ์šฐ๋ฆฌ๋Š” ๋” ๊นŠ์ด ์ƒ๊ฐํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ™•์ธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์— ๋”ฐ๋ผ ๋นŒ๋“œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‹คํ–‰ํ•˜๊ณ  ์žˆ๋‚˜์š”?

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

๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœํŒ€์˜ CI ์ง„ํ™”

์ด๋ฅผ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ๊ฐ„๋‹จํ•œ bash ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. premerge.sh:

#!/usr/bin/env bash

set -e

git fetch origin develop

git merge origin/develop

์—ฌ๊ธฐ์—์„œ๋Š” ๊ฐœ๋ฐœ์˜ ๋ชจ๋“  ์ตœ์‹  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ„๋‹จํžˆ ๊ฐ€์ ธ์™€์„œ ํ˜„์žฌ ๋ถ„๊ธฐ์— ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ๋นŒ๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋กœ premerge.sh ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์ •ํ™•ํ•˜๊ฒŒ ํ™•์ธํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์™„์„ฑ.

๋ฌธ์ œ๋ฅผ ํ˜„์ง€ํ™”ํ•˜๊ณ , ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๊ณ , ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ XNUMX์ผ์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ฐœ๋ฐœ๋˜๊ณ  ์ ์  ๋” ๋งŽ์€ ์ž‘์—…์ด ๋‚˜ํƒ€๋‚˜๊ณ  ํŒ€์ด ์„ฑ์žฅํ–ˆ์œผ๋ฉฐ premerge.sh๊ฐ€ ๋•Œ๋•Œ๋กœ ์šฐ๋ฆฌ๋ฅผ ์‹ค๋ง์‹œํ‚ค๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์— ์ถฉ๋Œํ•˜๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์–ด ๋นŒ๋“œ๊ฐ€ ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ผ์–ด๋‚˜๋Š”์ง€์— ๋Œ€ํ•œ ์˜ˆ:

๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœํŒ€์˜ CI ์ง„ํ™”

๋‘ ๋ช…์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋™์‹œ์— ๊ธฐ๋Šฅ A์™€ B์— ๋Œ€ํ•œ ์ž‘์—…์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ A์˜ ๊ฐœ๋ฐœ์ž๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์„ ๋ฐœ๊ฒฌํ•ฉ๋‹ˆ๋‹ค. answer() ๊ทธ๋ฆฌ๊ณ  ํ›Œ๋ฅญํ•œ ๋ณด์ด์Šค์นด์šฐํŠธ์ฒ˜๋Ÿผ ๊ทธ๊ฒƒ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๋™์‹œ์— ๊ธฐ๋Šฅ B์˜ ๊ฐœ๋ฐœ์ž๋Š” ์ž์‹ ์˜ ๋ถ„๊ธฐ์—์„œ ์ด ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ํ˜ธ์ถœ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž๋Š” ์ž‘์—…์„ ์™„๋ฃŒํ•˜๋Š” ๋™์‹œ์— ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์„ ์—ฝ๋‹ˆ๋‹ค. ๋นŒ๋“œ๊ฐ€ ์‹œ์ž‘๋˜๊ณ  premerge.sh๋Š” ์ตœ์‹  ๊ฐœ๋ฐœ ์ƒํƒœ์™€ ๊ด€๋ จ๋œ ๋‘ ํ’€ ์š”์ฒญ์„ ๋ชจ๋‘ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํ™•์ธ์€ ๋…น์ƒ‰์ž…๋‹ˆ๋‹ค. ๊ทธ ํ›„, ๊ธฐ๋Šฅ A์˜ ํ’€ ์š”์ฒญ์ด ๋ณ‘ํ•ฉ๋˜๊ณ , ๊ธฐ๋Šฅ B์˜ ํ’€ ์š”์ฒญ์ด ๋ณ‘ํ•ฉ๋ฉ๋‹ˆ๋‹ค... ๋ถ! ๊ฐœ๋ฐœ ์ฝ”๋“œ์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•œ ํ˜ธ์ถœ์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๊ฐœ๋ฐœ ์ค‘๋‹จ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœํŒ€์˜ CI ์ง„ํ™”

๋ฐœ์ „ํ•˜์ง€ ์•Š์„ ๋•Œ, ์ง€์—ญ ์žฌํ•ด. ํŒ€ ์ „์ฒด๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ ์ˆ˜์ง‘ํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์ œ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœํŒ€์˜ CI ์ง„ํ™”

์ด๊ฒƒ์ด ์šฐ๋ฆฌ์—๊ฒŒ ์ ํ•ฉํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์˜ต์…˜์„ ํƒ์ƒ‰ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์„ ์ค‘๋‹จํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•

์ฒซ ๋ฒˆ์งธ ์˜ต์…˜ : ๊ฐœ๋ฐœ์„ ์—…๋ฐ์ดํŠธํ•  ๋•Œ ๋ชจ๋“  ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•˜์„ธ์š”. ์ด ์˜ˆ์—์„œ ๊ธฐ๋Šฅ A๊ฐ€ ํฌํ•จ๋œ ํ’€ ์š”์ฒญ์ด ๊ฐœ๋ฐœ์— ์ฒ˜์Œ ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ ๊ธฐ๋Šฅ B์˜ ํ’€ ์š”์ฒญ์ด ๋‹ค์‹œ ๋นŒ๋“œ๋˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ๊ฒ€์‚ฌ๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

์ด ์ž‘์—…์— ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„์„ ์ดํ•ดํ•˜๋ ค๋ฉด ๋‘ ๊ฐœ์˜ PR์ด ์žˆ๋Š” ์˜ˆ๋ฅผ ๊ณ ๋ คํ•ด ๋ณด์„ธ์š”. ๋‘ ๋ฒˆ์˜ PR(๋‘ ๋ฒˆ์˜ ๋นŒ๋“œ, ๋‘ ๋ฒˆ์˜ ๊ฒ€์‚ฌ ์‹คํ–‰)์„ ์—ฝ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ PR์ด ๊ฐœ๋ฐœ๋กœ ๋ณ‘ํ•ฉ๋œ ํ›„ ๋‘ ๋ฒˆ์งธ PR์„ ๋‹ค์‹œ ๋นŒ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด์ ์œผ๋กœ 2๊ฐœ์˜ PR์—๋Š” 1๋ฒˆ์˜ ํ™•์ธ ์‹คํ–‰(3 + XNUMX = XNUMX)์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์›์น™์ ์œผ๋กœ๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํ†ต๊ณ„๋ฅผ ๋ณด๋‹ˆ ์ €ํฌ ํŒ€์˜ ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ์€ ๊ณต๊ฐœ PR์ด 10๊ฐœ์˜€๊ณ , ํ™•์ธ ํšŸ์ˆ˜๋Š” ์ง„ํ–‰ ์ƒํ™ฉ์˜ ํ•ฉ์ด 10 + 9 +... + 1 = 55์˜€์Šต๋‹ˆ๋‹ค. ์ฆ‰, 10๊ฐœ๋ฅผ ์ˆ˜๋ฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. PR์€ 55๋ฒˆ ์žฌ๊ตฌ์ถ•ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ๋ชจ๋“  ๊ฒ€์‚ฌ๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ํ†ต๊ณผํ•˜๊ณ  ์ˆ˜์‹ญ ๊ฐœ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋Š” ๋™์•ˆ ์•„๋ฌด๋„ ์ถ”๊ฐ€ ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์„ ์—ด์ง€ ์•Š๋Š” ์ด์ƒ์ ์ธ ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.

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

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

๊ฒฐ๊ณผ์ ์œผ๋กœ ์„ธ ๋ฒˆ์งธ ์˜ต์…˜๋งŒ ๋‚จ์•˜์Šต๋‹ˆ๋‹ค. ์ž์ „๊ฑฐ. ์šฐ๋ฆฌ์˜ ๋ชจ๋“  ์ฝ”๋“œ์™€ ์†Œ์Šค๋Š” Bitbucket ์„œ๋ฒ„์˜ ์ €์žฅ์†Œ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” Bitbucket์šฉ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ฐœ๋ฐœํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœํŒ€์˜ CI ์ง„ํ™”

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

๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœํŒ€์˜ CI ์ง„ํ™”

๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ถฉ๋Œํ•˜๋Š” ์˜ˆ์—์„œ๋Š” ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ์ด๋Ÿฌํ•œ ๋นŒ๋“œ๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ๋Šฅ B์˜ ๊ฐœ๋ฐœ์ž๋Š” ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ๊ฒ€์‚ฌ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋ฉฐ ๊ทธ๋Ÿฌ๋ฉด ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ž๋™์œผ๋กœ ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „์—๋Š” ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ๋‹น ํ‰๊ท  2,7ํšŒ์˜ ๊ฒ€ํ† ๊ฐ€ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด 3,6๊ฐœ์˜ ์ถœ์‹œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ ์ ํ•ฉํ–ˆ์Šต๋‹ˆ๋‹ค.

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

Bitbucket ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐ XNUMX์ฃผ๊ฐ€ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์ˆ˜ํ‘œ

๊ทธ๋Ÿฌ๋Š” ๋™์•ˆ ์šฐ๋ฆฌ ํŒ€์€ ๊ณ„์†ํ•ด์„œ ์„ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ฒ€์‚ฌ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์‹ค์ˆ˜๋ฅผ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์™œ ์‹ค์ˆ˜๋ฅผ ์ €์ง€๋ฅด๋Š”๊ฐ€?๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ๊ทธ๋“ค์ด ๊ตฌํ˜„ํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค. ์ •์  ์ฝ”๋“œ ๋ถ„์„. ์šฐ๋ฆฌ๋Š” Android SDK์— ํฌํ•จ๋œ Lint๋ถ€ํ„ฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹น์‹œ ๊ทธ๋Š” Kotlin ์ฝ”๋“œ๋กœ ์ž‘์—…ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ „ํ˜€ ๋ชฐ๋ž๊ณ  ์ด๋ฏธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ 75%๊ฐ€ Kotlin์œผ๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚ด์žฅ๋œ ๊ฒƒ๋“ค์ด Lint์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Android ์ŠคํŠœ๋””์˜ค๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ๋งŽ์€ ๋ณ€ํ˜• ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. Android Studio๋ฅผ ๊ฐ€์ ธ์™€ Docker์— ํŒจํ‚ค์ง•ํ•˜๊ณ  ๊ฐ€์ƒ ๋ชจ๋‹ˆํ„ฐ๊ฐ€ ์žˆ๋Š” CI์—์„œ ์‹คํ–‰ํ•˜์—ฌ ์‹ค์ œ ๋…ธํŠธ๋ถ์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ƒ๊ฐํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฌ๋‚˜ ๊ณ„์ธก ํ…Œ์ŠคํŠธ์™€ ์Šคํฌ๋ฆฐ์ƒท ํ…Œ์ŠคํŠธ๋Š” ์—๋ฎฌ๋ ˆ์ดํ„ฐ ๋˜๋Š” ์‹ค์ œ ์žฅ์น˜์™€ ๊ฐ™์€ ์žฅ์น˜์—์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๊ฐ€ ๋งŽ๊ณ  ์ž์ฃผ ์‹คํ–‰๋œ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ํŒœ ์ „์ฒด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ž์‹ ์˜ ๋†์žฅ์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ๋…ธ๋™ ์ง‘์•ฝ์ ์ด๋ฏ€๋กœ ๊ธฐ์„ฑ ์˜ต์…˜์ธ Firebase Test Lab์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

Firebase ํ…Œ์ŠคํŠธ ๋žฉ

Firebase๋Š” Google ์ œํ’ˆ์ด๊ธฐ ๋•Œ๋ฌธ์— ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๊ณ  ๊ฒฐ์ฝ” ์ฃฝ์ง€ ์•Š์•„์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๊ฒฉ์€ ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ์žฅ์น˜๋ฅผ ์ž‘๋™ํ•˜๋ฉด ์‹œ๊ฐ„๋‹น 5๋‹ฌ๋Ÿฌ, ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์ž‘๋™ํ•˜๋ฉด ์‹œ๊ฐ„๋‹น 1$์ž…๋‹ˆ๋‹ค.

CI์— Firebase Test Lab์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์•ฝ XNUMX์ฃผ๊ฐ€ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

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

๋„์ปค + ํŒŒ์ด์ฌ + ๋ฐฐ์‰ฌ

์šฐ๋ฆฌ๋Š” Docker๋ฅผ ๊ฐ€์ ธ์™€ ๊ทธ ์•ˆ์— ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  Python์œผ๋กœ ๊ฐ„๋‹จํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋กœ๊ทธ๋žจ์€ ์ ์ ˆํ•œ ์ˆœ๊ฐ„์— ํ•„์š”ํ•œ ๋ฒ„์ „์— ํ•„์š”ํ•œ ์ˆ˜์˜ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ํ•„์š”ํ•  ๋•Œ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฌผ๋ก  ๋‘ ๊ฐœ์˜ bash ์Šคํฌ๋ฆฝํŠธ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์ด ์—†๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์–ด๋””์— ์žˆ์„๊นŒ์š”?

์ž์ฒด ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ๋งŒ๋“œ๋Š” ๋ฐ XNUMX์ฃผ๊ฐ€ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ชจ๋“  ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์— ๋Œ€ํ•ด ๊ด‘๋ฒ”์œ„ํ•œ ๋ณ‘ํ•ฉ ์ฐจ๋‹จ ๊ฒ€์‚ฌ ๋ชฉ๋ก์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ARK ์กฐ๋ฆฝ;
  • Junit ํ…Œ์ŠคํŠธ;
  • ๋ฆฐํŠธ;
  • Android ์ŠคํŠœ๋””์˜ค ํ™•์ธ;
  • ๊ณ„์ธก ํ…Œ์ŠคํŠธ
  • ์Šคํฌ๋ฆฐ์ƒท ํ…Œ์ŠคํŠธ.

์ด๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ๊ณ ์žฅ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ–ˆ์ง€๋งŒ ๊ฐœ๋ฐœ์ž๋“ค์€ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ๊ธธ๋‹ค๊ณ  ๋ถˆํ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

์–ผ๋งˆ๋‚˜ ๊ธด๊ฐ€์š”? ์šฐ๋ฆฌ๋Š” Bitbucket๊ณผ TeamCity์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ ์‹œ์Šคํ…œ์— ์—…๋กœ๋“œํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ์‹ค์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ํ‰๊ท  ๋Œ€๊ธฐ ์‹œ๊ฐ„ 45๋ถ„. ์ฆ‰, ๊ฐœ๋ฐœ์ž๊ฐ€ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์—ด ๋•Œ ๋นŒ๋“œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ํ‰๊ท  45๋ถ„์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ์ด๊ฒƒ์ด ๋งŽ์€๋ฐ ๊ทธ๋ ‡๊ฒŒ ์ผํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ๋นŒ๋“œ ์†๋„๋ฅผ ๋†’์ด๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์†๋„๋ฅผ ๋†’์ด์ž

๋นŒ๋“œ๊ฐ€ ์ข…์ข… ๋Œ€๊ธฐ์—ด์— ์žˆ๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ํ•˜๋Š” ์ผ์€ ํ•˜๋“œ์›จ์–ด๋ฅผ ๋” ๊ตฌ์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค โ€” ๊ด‘๋ฒ”์œ„ํ•œ ๊ฐœ๋ฐœ์ด ๊ฐ€์žฅ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ ๋Œ€๊ธฐ์—ด์ด ์ค‘์ง€๋˜์—ˆ์ง€๋งŒ ์ผ๋ถ€ ๊ฒ€์‚ฌ ์ž์ฒด๊ฐ€ ๋งค์šฐ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์•ฝ๊ฐ„๋งŒ ์ค„์—ˆ์Šต๋‹ˆ๋‹ค.

์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ˆ˜ํ‘œ ์ œ๊ฑฐ

์šฐ๋ฆฌ์˜ ์ง€์†์ ์ธ ํ†ตํ•ฉ์€ ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์˜ค๋ฅ˜์™€ ๋ฌธ์ œ๋ฅผ ํฌ์ฐฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

์ด ๋ถ„๋ฅ˜๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ „์ฒด ์ ๊ฒ€ ๋ชฉ๋ก์„ ๊ฐœํŽธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง€์›Œ์ง„ ๋ฆฐํŠธ ํ”„๋กœ์ ํŠธ์— ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋Š”์ง€์— ๋Œ€ํ•œ ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ถœ์‹œ๋ฅผ ํ•˜๋ฃป๋ฐค ์‚ฌ์ด์— ์—ฐ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์ˆ ๋ถ€์ฑ„์™€๋Š” ๋ณ„๋„๋กœ ์ž‘์—…ํ•˜๊ธฐ๋กœ ํ•ฉ์˜ํ–ˆ๊ณ , Android Studio ๊ฒ€์‚ฌ๊ฐ€ ์™„์ „ํžˆ ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.. ๊ฒ€์‚ฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ Docker์˜ Android Studio๋Š” ํฅ๋ฏธ๋กญ๊ฒŒ ๋“ค๋ฆฌ์ง€๋งŒ ์ง€์›์— ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ต๋‹ˆ๋‹ค. Android Studio ๋ฒ„์ „์„ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ์ดํ•ดํ•  ์ˆ˜ ์—†๋Š” ๋ฒ„๊ทธ๋กœ ์ธํ•ด ์–ด๋ ค์›€์„ ๊ฒช๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ทธ๋‹ค์ง€ ์•ˆ์ •์ ์ด์ง€ ์•Š๊ณ  ์˜คํƒ(false positive)์ด ๋ฐœ์ƒํ•˜์—ฌ ์Šคํฌ๋ฆฐ์ƒท ํ…Œ์ŠคํŠธ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ๋„ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฐ์ƒท ํ…Œ์ŠคํŠธ๊ฐ€ ์ฒดํฌ๋ฆฌ์ŠคํŠธ์—์„œ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค..

๊ฒฐ๊ณผ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

  • ARK ์กฐ๋ฆฝ;
  • Junit ํ…Œ์ŠคํŠธ;
  • ๊ณ„์ธก ํ…Œ์ŠคํŠธ.

Gradle ์›๊ฒฉ ์บ์‹œ

๋ฌด๊ฑฐ์šด ์ ๊ฒ€ ์—†์ด ๋ชจ๋“  ๊ฒƒ์ด ์ข‹์•„์กŒ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์™„๋ฒฝํ•จ์—๋Š” ํ•œ๊ณ„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค!

์šฐ๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ด๋ฏธ ์•ฝ 150๊ฐœ์˜ Gradle ๋ชจ๋“ˆ๋กœ ๋ถ„ํ• ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Gradle ์›๊ฒฉ ์บ์‹œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ด ๊ฒฝ์šฐ์— ์ž˜ ์ž‘๋™ํ•˜๋ฏ€๋กœ ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ์‹œ๋„ํ•ด ๋ณด๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

Gradle ์›๊ฒฉ ์บ์‹œ๋Š” ๊ฐœ๋ณ„ ๋ชจ๋“ˆ์˜ ๊ฐœ๋ณ„ ์ž‘์—…์— ๋Œ€ํ•œ ๋นŒ๋“œ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์บ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. Gradle์€ ์‹ค์ œ๋กœ ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๋Œ€์‹  HTTP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›๊ฒฉ ์บ์‹œ๋ฅผ ๋‘๋“œ๋ฆฌ๊ณ  ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด๋ฏธ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ๋Š”์ง€ ๋ฌป์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‹จ์ˆœํžˆ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

Gradle์€ Docker ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ Gradle ์›๊ฒฉ ์บ์‹œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ์ผ์„ XNUMX์‹œ๊ฐ„ ๋งŒ์— ํ•ด๋ƒˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ํ•ด์•ผ ํ•  ์ผ์€ Docker๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ์— ํ•œ ์ค„์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ฟ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋น ๋ฅด๊ฒŒ ์‹œ์ž‘ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ๋ชจ๋“  ๊ฒƒ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋ ค๋ฉด ๊ฝค ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” ์บ์‹œ ๋ฏธ์Šค ๊ทธ๋ž˜ํ”„์ž…๋‹ˆ๋‹ค.

๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœํŒ€์˜ CI ์ง„ํ™”

์ฒ˜์Œ์—๋Š” ์บ์‹œ ๋ˆ„๋ฝ ๋น„์œจ์ด ์•ฝ 65์˜€์Šต๋‹ˆ๋‹ค. 20์ฃผ ํ›„์—๋Š” ์ด ๊ฐ’์„ XNUMX%๋กœ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ˆ˜์ง‘ํ•˜๋Š” ์ž‘์—…์—๋Š” Gradle์ด ์บ์‹œ๋ฅผ ๋†“์นœ ์ด์ƒํ•œ ์ „์ด์  ์ข…์†์„ฑ์ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

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

์˜ํ–ฅ ๋ถ„์„

ํ’€ ์š”์ฒญ ์‹œ git diff๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ์ˆ˜์ •๋œ Gradle ๋ชจ๋“ˆ์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœํŒ€์˜ CI ์ง„ํ™”

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

๊ณ„์ธก ํ…Œ์ŠคํŠธ๋Š” ์ตœ์ƒ์œ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋“ˆ์— ์œ„์น˜ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋–ค ๋ชจ๋“ˆ์— ์†ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ”์ดํŠธ์ฝ”๋“œ ๋ถ„์„๊ณผ ํ•จ๊ป˜ ๊ฒฝํ—˜์  ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ด€๋ จ ๋ชจ๋“ˆ๋งŒ ํ…Œ์ŠคํŠธํ•˜๋„๋ก ๊ณ„์ธก ํ…Œ์ŠคํŠธ ์ž‘์—…์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๋ฐ ์•ฝ XNUMX์ฃผ๊ฐ€ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

๊ฒ€์‚ฌ ์†๋„๋ฅผ ๋†’์ด๋Š” ์กฐ์น˜๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ด๋ฃจ์–ด์กŒ์Šต๋‹ˆ๋‹ค. 45๋ถ„์—์„œ ์•ฝ 15๋ถ„์œผ๋กœ ๋Š˜์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ๋ฅผ ์œ„ํ•ด XNUMX๋ถ„์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์€ ์ด๋ฏธ ์ •์ƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ ๊ฐœ๋ฐœ์ž๋“ค์€ ์–ด๋–ค ๋นŒ๋“œ๊ฐ€ ์‹œ์ž‘๋˜๊ณ  ์žˆ๋Š”์ง€, ๋กœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜, ๋นŒ๋“œ๊ฐ€ ๋นจ๊ฐ„์ƒ‰์ธ ์ด์œ , ์–ด๋–ค ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ–ˆ๋Š”์ง€ ๋“ฑ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค๊ณ  ๋ถˆํ‰ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœํŒ€์˜ CI ์ง„ํ™”

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

๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœํŒ€์˜ CI ์ง„ํ™”

์ž์„ธํ•œ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›๋Š” ๋ฐ XNUMX์ฃผ๊ฐ€ ์†Œ์š”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ณ„ํš

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

๊ทธ ์™ธ์—๋„ ๋‹ค๋ฅธ ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ณดํ’€ ๋ฐ˜ํ™˜ (๋ฐ ๊ธฐํƒ€ ์ •์  ๋ถ„์„). ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ด ๋ฐฉํ–ฅ์œผ๋กœ ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • PR ์ฐจ๋‹จ๊ธฐ์—์„œ ๋ชจ๋“  ๊ฒƒ์„ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค. ์—”๋“œํˆฌ์—”๋“œ ํ…Œ์ŠคํŠธ ๋ชจ๋“  SDK ๋ฒ„์ „์—์„œ.

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” Avito์˜ ์ง€์†์ ์ธ ํ†ตํ•ฉ ๊ฐœ๋ฐœ ์—ญ์‚ฌ๋ฅผ ์ถ”์ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ €๋Š” ๊ฒฝํ—˜์ด ํ’๋ถ€ํ•œ ๊ด€์ ์—์„œ ๋ช‡ ๊ฐ€์ง€ ์กฐ์–ธ์„ ๋“œ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

ะกะพะฒะตั‚ั‹

๋”ฑ ํ•œ ๊ฐ€์ง€ ์กฐ์–ธ์„ ํ•˜์ž๋ฉด ์ด๋ ‡์Šต๋‹ˆ๋‹ค.

์‰˜ ์Šคํฌ๋ฆฝํŠธ์— ์ฃผ์˜ํ•˜์„ธ์š”!

Bash๋Š” ๋งค์šฐ ์œ ์—ฐํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ด๋ฉฐ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ์ด ๋งค์šฐ ํŽธ๋ฆฌํ•˜๊ณ  ๋น ๋ฆ…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์œผ๋กœ ์ธํ•ด ํ•จ์ •์— ๋น ์งˆ ์ˆ˜ ์žˆ๊ณ , ๋ถˆํ–‰ํ•˜๊ฒŒ๋„ ์šฐ๋ฆฌ๋„ ๊ทธ ํ•จ์ •์— ๋น ์กŒ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ฒƒ์€ ๋นŒ๋“œ ๋จธ์‹ ์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฐ„๋‹จํ•œ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

#!/usr/bin/env bash
./gradlew assembleDebug

๊ทธ๋Ÿฌ๋‚˜ ์•„์‹œ๋‹ค์‹œํ”ผ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ชจ๋“  ๊ฒƒ์ด ๋ฐœ์ „ํ•˜๊ณ  ๋” ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‹คํ–‰ํ•˜๊ณ  ๊ฑฐ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•ฉ์‹œ๋‹ค. ๊ฒฐ๊ตญ ์šฐ๋ฆฌ๋Š” ํ˜„์žฌ ์–ด๋Š ์ˆ˜์ค€์˜ bash ์ค‘์ฒฉ์ธ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๋”ฐ์˜ดํ‘œ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ๋ชจ๋“  ๊ฒƒ์„ ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค.

๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœํŒ€์˜ CI ์ง„ํ™”

๊ทธ๋Ÿฌํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ๋“œ๋Š” ์ธ๊ฑด๋น„๋ฅผ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ •์— ๋น ์ง€์ง€ ๋ง๋ผ๊ณ  ์กฐ์–ธํ•ฉ๋‹ˆ๋‹ค.

๋ฌด์—‡์„ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

  • ๋ชจ๋“  ์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด. ์— ์“ฐ๊ธฐ Python ๋˜๋Š” Kotlin ์Šคํฌ๋ฆฝํŠธ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์•„๋‹Œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋” ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋˜๋Š” ๋ชจ๋“  ๋นŒ๋“œ ๋กœ์ง์„ ๋‹ค์Œ ํ˜•์‹์œผ๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ Gradle ์ž‘์—… ๋‹น์‹ ์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•ด.

์šฐ๋ฆฌ๋Š” ๋‘ ๋ฒˆ์งธ ์˜ต์…˜์„ ์„ ํƒํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๊ณ  ์ด์ œ ๋ชจ๋“  bash ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ์‚ญ์ œํ•˜๊ณ  ๋งŽ์€ ์‚ฌ์šฉ์ž ์ •์˜ Gradle ์ž‘์—…์„ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒ #2: ์ธํ”„๋ผ๋ฅผ ์ฝ”๋“œ์— ์ €์žฅํ•˜์„ธ์š”.

Continuous Integration ์„ค์ •์„ Jenkins๋‚˜ TeamCity ๋“ฑ์˜ UI ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹Œ ํ”„๋กœ์ ํŠธ ์ €์žฅ์†Œ์— ์ง์ ‘ ํ…์ŠคํŠธ ํŒŒ์ผ ํ˜•์‹์œผ๋กœ ์ €์žฅํ•˜๋ฉด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฒ„์ „ ๊ฐ€๋Šฅ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์—์„œ ์ฝ”๋“œ๋ฅผ ๋กค๋ฐฑํ•˜๊ฑฐ๋‚˜ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์Šคํฌ๋ฆฝํŠธ๋Š” ํ”„๋กœ์ ํŠธ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™˜๊ฒฝ์„ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?

ํŒ #3: Docker๋Š” ํ™˜๊ฒฝ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™•์‹คํžˆ Android ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•ˆํƒ€๊น๊ฒŒ๋„ iOS์—๋Š” ์•„์ง ๊ทธ๋Ÿฐ ๊ธฐ๋Šฅ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ jdk ๋ฐ android-sdk๊ฐ€ ํฌํ•จ๋œ ๊ฐ„๋‹จํ•œ docker ํŒŒ์ผ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

FROM openjdk:8

ENV SDK_URL="https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip" 
    ANDROID_HOME="/usr/local/android-sdk" 
    ANDROID_VERSION=26 
    ANDROID_BUILD_TOOLS_VERSION=26.0.2

# Download Android SDK
RUN mkdir "$ANDROID_HOME" .android 
    && cd "$ANDROID_HOME" 
    && curl -o sdk.zip $SDK_URL 
    && unzip sdk.zip 
    && rm sdk.zip 
    && yes | $ANDROID_HOME/tools/bin/sdkmanager --licenses

# Install Android Build Tool and Libraries
RUN $ANDROID_HOME/tools/bin/sdkmanager --update
RUN $ANDROID_HOME/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" 
    "platforms;android-${ANDROID_VERSION}" 
    "platform-tools"

RUN mkdir /application
WORKDIR /application

์ด Docker ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๊ณ (๋น„๋ฐ€์„ ๋งํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ž‘์„ฑํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ GitHub์—์„œ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ง„ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋ฉด ๋ฉ๋‹ˆ๋‹ค) ์ด๋ฏธ์ง€๋ฅผ ์กฐ๋ฆฝํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์ƒ ๋จธ์‹ ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. Junit ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ํƒ€๋‹นํ•œ ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ์ด์œ ๋Š” ํ™•์žฅ์„ฑ๊ณผ ๋ฐ˜๋ณต์„ฑ์ž…๋‹ˆ๋‹ค. Docker๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด์ „ ๋นŒ๋“œ์™€ ์ •ํ™•ํžˆ ๋™์ผํ•œ ํ™˜๊ฒฝ์„ ๊ฐ–๊ฒŒ ๋  XNUMX๊ฐœ์˜ ๋นŒ๋“œ ์—์ด์ „ํŠธ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” CI ์—”์ง€๋‹ˆ์–ด์˜ ์‚ถ์„ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. android-sdk๋ฅผ docker์— ํ‘ธ์‹œํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‰ฝ์ง€๋งŒ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์กฐ๊ธˆ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์กฐ๊ธˆ ๋” ์—ด์‹ฌํžˆ ์ž‘์—…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋˜๋Š” GitHub์—์„œ ์™„์„ฑ๋œ ๊ฒƒ์„ ๋‹ค์‹œ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค).

ํŒ 4: ๊ฒ€์‚ฌ๋Š” ๊ฒ€์‚ฌ๋ฅผ ์œ„ํ•ด์„œ๊ฐ€ ์•„๋‹ˆ๋ผ ์‚ฌ๋žŒ์„ ์œ„ํ•ด ์ˆ˜ํ–‰๋œ๋‹ค๋Š” ์ ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š” ๋น ๋ฅด๊ณ  ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํ”ผ๋“œ๋ฐฑ์ด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฌด์—‡์ด ๋ฌธ์ œ์ธ์ง€, ์–ด๋–ค ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ–ˆ๋Š”์ง€, ๋นŒ๋“œ ๋กœ๊ทธ๋Š” ์–ด๋””์„œ ๋ณผ ์ˆ˜ ์žˆ๋‚˜์š”?

ํŒ #5: ์ง€์†์  ํ†ตํ•ฉ์„ ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” ์‹ค์šฉ์ ์ด๊ฒŒ ํ•˜์„ธ์š”.

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

ํŒ #6: ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ง„ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

ํ˜„์žฌ ํด๋ผ์šฐ๋“œ CI๋ฅผ ์ œ๊ณตํ•˜๋Š” ํšŒ์‚ฌ๋Š” ๋งŽ์Šต๋‹ˆ๋‹ค.

๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœํŒ€์˜ CI ์ง„ํ™”

์ด๋Š” ์†Œ๊ทœ๋ชจ ํŒ€์— ์ ํ•ฉํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ์•„๋ฌด๊ฒƒ๋„ ์ง€์›ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ์•ฝ๊ฐ„์˜ ๋น„์šฉ๋งŒ ์ง€๋ถˆํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ณ  ๊ณ„์ธก ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ํŒ #7: ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ๋Š” ๋‚ด๋ถ€ ์†”๋ฃจ์…˜์ด ๋” ์ˆ˜์ต์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

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

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

๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœํŒ€์˜ CI ์ง„ํ™”

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

์šฐ๋ฆฌ๋Š” ์‚ฌ๋žŒ์ด ๋น„์‹ธ๊ณ , ์‹ค์ˆ˜๋ฅผ ํ•˜๊ณ , ๊ฒŒ์œผ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™ํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ์ƒ๊ฐ์—์„œ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์€ ์ž๋™ํ™”๋„ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž๋™ํ™”์—๋„ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ชจ๋‘ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • ์ž๋™ํ™”๋Š” ๋น„์šฉ์ด ๋งŽ์ด ๋“ญ๋‹ˆ๋‹ค. ๋…ธ๋™ ์ผ์ •์„ ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค.
  • ์ž๋™ํ™”์— ์žˆ์–ด์„œ ์‚ฌ๋žŒ๋“ค์€ ์‹ค์ˆ˜๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๊ฒƒ์ด ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋•Œ๋กœ๋Š” ์ž๋™ํ™”ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ๊ฒŒ์œผ๋ฅธ ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ ๋‹ค๋ฅธ ๊ฒƒ์„ ๊ฐœ์„ ํ•ด์•ผ ํ•˜๋ฉฐ, ์ด ๋ชจ๋“  ์ง€์†์ ์ธ ํ†ตํ•ฉ์ด ํ•„์š”ํ•œ๊ฐ€์š”?

ํ•˜์ง€๋งŒ ํ†ต๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์…ˆ๋ธ”๋ฆฌ์˜ 20%์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ๊ฒฌ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ œ๋Œ€๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋“ค์€ ์‹ค์ˆ˜๋ฅผ ํ•ด๋„ ๊ฐœ๋ฐœ์— ์ด๋ฅด์ง€ ์•Š๊ณ  ์ž๋™ํ™”๋œ ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด ๋ฐœ๊ฒฌ๋  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž๋Š” ๋กœ์ปฌ์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ํฅ๋ฏธ๋กœ์šด ๊ฒƒ์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ํ• ์• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€์†์ ์ธ ํ†ตํ•ฉ์„ ์‹ค์ฒœํ•˜์„ธ์š”. ๊ทธ๋Ÿฌ๋‚˜ ์ ๋‹นํžˆ.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , Nikolai Nesterov๋Š” ํ›Œ๋ฅญํ•œ ๋ณด๊ณ ์„œ๋ฅผ ์ง์ ‘ ์ œ๊ณตํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ”„๋กœ๊ทธ๋žจ ์œ„์›ํšŒ์˜ ํšŒ์›์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์ปจํผ๋Ÿฐ์Šค ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋‹น์‹ ์„ ์œ„ํ•ด ์˜๋ฏธ ์žˆ๋Š” ์—ฐ์„ค์„ ์ค€๋น„ํ•˜๋„๋ก ๋•์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ํšŒ์˜ ํ”„๋กœ๊ทธ๋žจ์˜ ์™„์ „์„ฑ๊ณผ ์œ ์šฉ์„ฑ์€ ๋‹ค์Œ ์ฃผ์ œ์— ๋”ฐ๋ผ ํ‰๊ฐ€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์ •. ์ž์„ธํ•œ ๋‚ด์šฉ์€ 22์›” 23~XNUMX์ผ์— Infospace๋ฅผ ๋ฐฉ๋ฌธํ•˜์„ธ์š”.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€