์ง€์†์ ์ธ ํ†ตํ•ฉ์˜ ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ

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

์šฐ๋ฆฌ๋Š” ๋ฌด์—‡์„ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

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

์ด GIF๋Š” ๊ณผ์ •์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์ €์žฅ์†Œ์˜ ์ปค๋ฐ‹์„ ๊ฐœ๋žต์ ์œผ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ ์—ฌ๊ธฐ์—๋Š” ๋ณต์žกํ•œ ๊ฒƒ์ด ์—†์œผ๋ฉฐ ๊ฐ€์žฅ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€์†์ ์ธ ํ†ตํ•ฉ์˜ ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ

๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ‘œ์ค€ CI ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ง„ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • ๊ธฐ๋Šฅ ์ž‘์—…
  • ํ’ˆ์งˆ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์šฐ์„ ์ˆœ์œ„ ์ž‘์—…์˜ ๊ตฌํ˜„
  • ๋ธŒ๋žœ์น˜ ๋ณ‘ํ•ฉ ์‹œ ์ถฉ๋Œ ํ•ด๊ฒฐ(๋ณ‘ํ•ฉ ์ถฉ๋Œ)
  • ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ฌด์—‡์„ ๋ฐฐ์šธ ๊ฒƒ์ธ๊ฐ€?

๋‹น์‹ ์€ ๋‹ค์Œ ์งˆ๋ฌธ์— ๋Œ€๋‹ตํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค:

  • ์ง€์†์  ํ†ตํ•ฉ(CI)์ด๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
  • CI์—๋Š” ์–ด๋–ค ์œ ํ˜•์˜ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉฐ ์–ด๋–ค ์ž‘์—…์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๊นŒ?
  • ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์€ ๋ฌด์—‡์ด๋ฉฐ ์–ธ์ œ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?
  • ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ(TDD)์ด๋ž€ ๋ฌด์—‡์ด๋ฉฐ CI์™€ ์–ด๋–ค ๊ด€๋ จ์ด ์žˆ๋‚˜์š”?
  • ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณ‘ํ•ฉํ•˜๊ฑฐ๋‚˜ ๋ฆฌ๋ฒ ์ด์Šคํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
  • ๋‹ค์Œ ๋ฒ„์ „์—์„œ ๋กค๋ฐฑํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

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

์ง€์†์  ํ†ตํ•ฉ์ด๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

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

์ด ์šฉ์–ด์— ๋Œ€ํ•ด์„œ๋Š” ์˜๊ฒฌ์ด ๋ถ„๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

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

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

์ง€์†์ ์ธ ํ†ตํ•ฉ ๋‹ค๋ฅธ ์ง€์†์ ์ธ ์ „๋‹ฌ (์ง€์†์ ์ธ ์ „๋‹ฌ, CD) ๊ฐ ํ†ตํ•ฉ ์ฃผ๊ธฐ ํ›„์— ๋ฆด๋ฆฌ์Šค ํ›„๋ณด๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ณผ์ • ์ „์ฒด์—์„œ ์‚ฌ์šฉํ•  ๋‹จ๊ณ„ ๋ชฉ๋ก

  1. ์ตœ์‹  ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค์„ธ์š”. ๋‹ค์Œ์—์„œ ์ง€์  ๋งŒ๋“ค๊ธฐ master. ์ผ์„ ์‹œ์ž‘ํ•˜๋‹ค.
  2. ์ƒˆ ๋ธŒ๋žœ์น˜์— ์ปค๋ฐ‹์„ ์ƒ์„ฑํ•˜์„ธ์š”. ๋กœ์ปฌ์—์„œ ๋นŒ๋“œํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜์„ธ์š”. ํ†ต๊ณผํ•˜๋‹ค? ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์‹คํŒจํ•˜๋‹ค? ์˜ค๋ฅ˜๋‚˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ๋‹ค์‹œ ์‹œ๋„ํ•˜์„ธ์š”.
  3. ์›๊ฒฉ ์ €์žฅ์†Œ๋‚˜ ์›๊ฒฉ ์ง€์ ์œผ๋กœ ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค.
  4. ํ’€ ์š”์ฒญ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ณ  ํ† ๋ก ์ด ๊ณ„์†๋จ์— ๋”ฐ๋ผ ๋” ๋งŽ์€ ์ปค๋ฐ‹์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ ๋ถ„๊ธฐ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผ์‹œํ‚ต๋‹ˆ๋‹ค.
  5. ๋งˆ์Šคํ„ฐ์—์„œ ์ปค๋ฐ‹์„ ๋ณ‘ํ•ฉ/๋ฆฌ๋ฒ ์ด์Šคํ•ฉ๋‹ˆ๋‹ค. ๋ณ‘ํ•ฉ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  6. ๊ธฐ๋Šฅ ๋ถ„๊ธฐ์—์„œ ํ”„๋กœ๋•์…˜์œผ๋กœ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.
  7. ์ผ์ • ๊ธฐ๊ฐ„ ๋™์•ˆ ํ”„๋กœ๋•์…˜์˜ ๋ชจ๋“  ๊ฒƒ์ด ์–‘ํ˜ธํ•˜๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋งˆ์Šคํ„ฐ์— ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

์ง€์†์ ์ธ ํ†ตํ•ฉ์˜ ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ

๏ธ ์ค€๋น„

์˜ฌ๋ฐ”๋ฅธ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

์ด ๊ฐ•์ขŒ๋ฅผ ์ˆ˜๊ฐ•ํ•˜๋ ค๋ฉด ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Node.js๋ฅผ ะธ ํž˜๋‚ด ํด๋ผ์ด์–ธํŠธ.

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

๋ช…๋ น์ค„์„ ์ง€์›ํ•˜๋Š” Git ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

๋ช…๋ น์ค„์„ ์ง€์›ํ•˜๋Š” Git ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•„์ง ์—†๋‹ค๋ฉด ์„ค์น˜ ์ง€์นจ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—.

์ €์žฅ์†Œ ์ค€๋น„

๊ฐœ์ธ ๋ณต์‚ฌ๋ณธ(ํฌํฌ)์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ•์ขŒ์šฉ ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋œ ํ…œํ”Œ๋ฆฟ ์ €์žฅ์†Œ GitHub์—์„œ. ์ด ๊ฐœ์ธ ์‚ฌ๋ณธ์„ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ๋™์˜ํ•ฉ์‹œ๋‹ค. ์ฝ”์Šค ์ €์žฅ์†Œ.

์™„๋ฃŒ? ๊ธฐ๋ณธ ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ฝ”์Šค ์ €์žฅ์†Œ๊ฐ€ ํ˜ธ์ถœ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. continuous-integration-team-scenarios-students, GitHub ๊ณ„์ •์— ์žˆ์œผ๋ฉฐ URL์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

https://github.com/<ะฒะฐัˆะต ะธะผั ะฟะพะปะทะพะฒะฐั‚ะตะปั ะฝะฐ GitHub>/continuous-integration-team-scenarios-students

๊ทธ๋ƒฅ ์ด ์ฃผ์†Œ๋กœ ์ „ํ™”ํ• ๊ฒŒ์š” <URL ั€ะตะฟะพะทะธั‚ะพั€ะธั>.

๊บพ์‡ ๊ด„ํ˜ธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. <ั‚ัƒั‚> ์ด๋Š” ํ•ด๋‹น ํ‘œํ˜„์‹์„ ์ ์ ˆํ•œ ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ”์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

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

GitHub Actions๊ฐ€ ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์œผ๋ฉด ๋‚ด ์ง€์นจ์— ๋”ฐ๋ผ ๊ณผ์ •์„ ์™„๋ฃŒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ง€์†์ ์ธ ํ†ตํ•ฉ์˜ ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ

์–ธ์ œ๋“ ์ง€ GitHub์˜ Markdown ๋ Œ๋”๋ง ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๊ธฐ์—์„œ ์ž‘์„ฑ ์ค‘์ธ ๋ชฉ๋ก์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/<your GitHub user name>/continuous-integration-team-scenarios-students/blob/master/ci.md

๋‹ต๋ณ€์— ๋Œ€ํ•ด

์ด ๊ณผ์ •์„ ์™„๋ฃŒํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์ง์ ‘ ํ•ด๋ณด๋Š” ๊ฒƒ์ด์ง€๋งŒ, ๋ช‡ ๊ฐ€์ง€ ์–ด๋ ค์›€์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ •๋ง ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”

์ฝ”๋“œ๋ฅผ ์ปค๋ฐ‹ํ•˜์„ธ์š”.

git add .
git commit -m "Backing up my work"

์ด ๋ช…๋ น

  • ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ master ะฒ master-backup;
  • ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ solution ะฒ master;
  • ์ƒˆ ์ง€์ ์œผ๋กœ ๊ฒฐ์ œ master ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋‚ด์šฉ์„ ๋‹ค์‹œ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๋‚˜์ค‘์— "์†”๋ฃจ์…˜" ๋ถ„๊ธฐ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ "๋งˆ์Šคํ„ฐ"(์ด์ „์—๋Š” "์†”๋ฃจ์…˜"์ž„)์—์„œ "์†”๋ฃจ์…˜" ๋ถ„๊ธฐ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

git branch -m master master-backup
git branch -m solution master
git checkout master -f
git branch solution

์ด ๋‹จ๊ณ„ ํ›„์—๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. git log master ์–ด๋–ค ์ปค๋ฐ‹์ด ํ•„์š”ํ•œ์ง€ ์•Œ์•„๋ณด์„ธ์š”.
๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ด ์ปค๋ฐ‹์œผ๋กœ ์žฌ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

git reset --hard <the SHA you need>

๊ฒฐ๊ณผ๊ฐ€ ๋งŒ์กฑ์Šค๋Ÿฌ์šฐ๋ฉด ์–ด๋Š ์‹œ์ ์—์„œ๋Š” ์ €์žฅ์†Œ ๋ฒ„์ „์„ ์›๊ฒฉ ์ €์žฅ์†Œ์— ๊ฒŒ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์›๊ฒฉ ๋ถ„๊ธฐ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”.

git push --force origin master

์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š” git push --force. ์ด ์ž‘์—…์„ ์ž์ฃผ ์ˆ˜ํ–‰ํ•  ๊ฐ€๋Šฅ์„ฑ์€ ๋‚ฎ์ง€๋งŒ ์—ฌ๊ธฐ์—๋Š” ์ž์‹ ์ด ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์„ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š” ํ•œ ๋ช…์˜ ์ €์žฅ์†Œ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ๋งค์šฐ ๊ตฌ์ฒด์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ์„ ์‹œ์ž‘ํ•˜๋‹ค

์ง€์†์ ์ธ ํ†ตํ•ฉ์˜ ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ

CI ๋‹จ๊ณ„ ๋ชฉ๋ก์„ ์ปดํŒŒ์ผํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์›๊ฒฉ ์ €์žฅ์†Œ์—์„œ ์ตœ์‹  ๋ฒ„์ „์˜ ์ฝ”๋“œ๋ฅผ ์ฒดํฌ์•„์›ƒํ•˜์—ฌ ์ด ๋‹จ๊ณ„๋ฅผ ์‹œ์ž‘ํ•˜์ง€๋งŒ ์•„์ง ๋กœ์ปฌ ์ €์žฅ์†Œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋Œ€์‹  ์›๊ฒฉ ์ €์žฅ์†Œ์—์„œ ๋ณต์ œํ•ฉ๋‹ˆ๋‹ค.

๏ธ ์ž‘์—…: ๋กœ์ปฌ ์ €์žฅ์†Œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋‹ค์Œ์—์„œ ๋ถ„๊ธฐ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. master, ์ผ์„ ์‹œ์ž‘ํ•˜๋‹ค

  1. ๋‹ค์Œ์—์„œ ์ฝ”์Šค ์ €์žฅ์†Œ๋ฅผ ๋ณต์ œํ•ฉ๋‹ˆ๋‹ค. <URL ั€ะตะฟะพะทะธั‚ะพั€ะธั>.
  2. ์‹คํ–‰ npm install ์ฝ”์Šค ์ €์žฅ์†Œ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” Jest๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด ์ด๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๊ณ  ์ด๋ฆ„์„ ์ง€์ •ํ•˜์„ธ์š”. feature. ์ด ์Šค๋ ˆ๋“œ๋กœ ์ „ํ™˜ํ•˜์„ธ์š”.
  4. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€ ci.test.js ๋‚˜ํ•œํ…Œ ์ด๋ ‡๊ฒŒ ํ•ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜๋Š” ๋Œ“๊ธ€๋“ค ์‚ฌ์ด์—์š”.

    it('1. pull latest code', () => {
      expect(/.*pull.*/ig.test(fileContents)).toBe(true);
    });
    
    it('2. add commits', () => {
      expect(/.*commit.*/ig.test(fileContents)).toBe(true);
    });
    
    it('3. push to the remote branch with the same name', () => {
      expect(/.*push.*/ig.test(fileContents)).toBe(true);
    });
    
    it('4. create a pull request and continue working', () => {
      expect(/.*pulls+request.*/ig.test(fileContents)).toBe(true);
    });

  5. ํŒŒ์ผ์— ์ฒ˜์Œ 4๋‹จ๊ณ„๋กœ ํ…์ŠคํŠธ ์ถ”๊ฐ€ ci.md.
    1. Pull in the latest code. Create a branch from `master`. Start working.    
    2. Create commits on your new branch. Build and test locally.  
    Pass? Go to the next step. Fail? Fix errors or tests and try again.  
    3. Push to your remote repository or remote branch.  
    4. Create a pull request. Discuss the changes, add more commits  
    as discussion continues. Make tests pass on the feature branch.  

    ํŒ€

# ะšะปะพะฝะธั€ัƒะนั‚ะต ั€ะตะฟะพะทะธั‚ะพั€ะธะน ะบัƒั€ัะฐ
git clone <repository URL>
cd <repository name>

# ะ’ั‹ะฟะพะปะฝะธั‚ะต npm install ะฒ ะบะฐั‚ะฐะปะพะณะต ั€ะตะฟะพะทะธั‚ะพั€ะธั ะบัƒั€ัะฐ; ะพะฝ ัƒัั‚ะฐะฝะพะฒะธั‚ Jest, ะบะพั‚ะพั€ั‹ะน ะผั‹ ะธัะฟะพะปัŒะทัƒะตะผ ะดะปั ะทะฐะฟัƒัะบะฐ ั‚ะตัั‚ะพะฒ.
npm install

# ะกะพะทะดะฐะนั‚ะต ะฒะตั‚ะบัƒ ะธ ะฝะฐะทะพะฒะธั‚ะต ะตะต feature. ะŸะตั€ะตะบะปัŽั‡ะธั‚ะตััŒ ะฝะฐ ัั‚ัƒ ะฒ ะฒะตั‚ะบัƒ.
git checkout -b feature

# ะžั‚ั€ะตะดะฐะบั‚ะธั€ัƒะนั‚ะต ci.test.js ะบะฐะบ ะพะฟะธัะฐะฝะพ ะฒั‹ัˆะต.
# ะžั‚ั€ะตะดะฐะบั‚ะธั€ัƒะนั‚ะต ci.md ะบะฐะบ ะพะฟะธัะฐะฝะพ ะฒั‹ัˆะต

์ƒˆ ๋ธŒ๋žœ์น˜์— ์ปค๋ฐ‹์„ ์ƒ์„ฑํ•˜๊ณ , ๋กœ์ปฌ์—์„œ ๋นŒ๋“œ ๋ฐ ํ…Œ์ŠคํŠธํ•˜์„ธ์š”.

์ปค๋ฐ‹ํ•˜๊ธฐ ์ „์— ์‹คํ–‰ํ•  ํ…Œ์ŠคํŠธ๋ฅผ ์„ค์ •ํ•œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ปค๋ฐ‹ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ๊ฐ€ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ผ๋ฐ˜์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค

  • ์žฅ์†Œ ์ƒ์—์„œ:
    • ์ง€์†์ ์œผ๋กœ ๋˜๋Š” ์ ์ ˆํ•œ ์ฝ”๋“œ ๋ณ€๊ฒฝ์— ๋Œ€์‘ํ•˜์—ฌ
    • ์ €์žฅ ์‹œ(ํ†ต์—ญ ๋˜๋Š” JIT ์ปดํŒŒ์ผ ์–ธ์–ด์˜ ๊ฒฝ์šฐ)
    • ์กฐ๋ฆฝ ์ค‘(์ปดํŒŒ์ผ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ)
    • ์ปค๋ฐ‹ ์‹œ;
    • ๊ณต์œ  ์ €์žฅ์†Œ์— ๊ฒŒ์‹œํ•˜๋Š” ๊ฒฝ์šฐ.

  • ๋นŒ๋“œ ์„œ๋ฒ„ ๋˜๋Š” ๋นŒ๋“œ ํ™˜๊ฒฝ์—์„œ:
    • ์ฝ”๋“œ๊ฐ€ ๊ฐœ์ธ ๋ธŒ๋žœ์น˜/์ €์žฅ์†Œ์— ๊ฒŒ์‹œ๋˜๋Š” ๊ฒฝ์šฐ.
    • ์ด ์Šค๋ ˆ๋“œ์˜ ์ฝ”๋“œ๋Š” ํ…Œ์ŠคํŠธ ์ค‘์ž…๋‹ˆ๋‹ค.
    • ํ•ฉ๋ณ‘์˜ ์ž ์žฌ์  ๊ฒฐ๊ณผ๋Š” ํ…Œ์ŠคํŠธ๋ฉ๋‹ˆ๋‹ค(์ผ๋ฐ˜์ ์œผ๋กœ master).
    • ์ง€์†์ ์ธ ํ†ตํ•ฉ ๋‹จ๊ณ„/์ง€์†์ ์ธ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ

์ผ๋ฐ˜์ ์œผ๋กœ ํ…Œ์ŠคํŠธ ๋„๊ตฌ ๋ชจ์Œ์ด ๋” ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋ ์ˆ˜๋ก ๋” ์ž์ฃผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์Šคํ…Œ์ด์ง€ ๋ถ„ํฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

๏ธ๊ณผ์ œ

๋จผ์ € ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜๋™์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. npm test. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ปค๋ฐ‹ ์‹œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด git ํ›„ํฌ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Git ํ›„ํฌ๋Š” ์ €์žฅ์†Œ์˜ ์ผ๋ถ€๋กœ ๊ฐ„์ฃผ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‚˜๋จธ์ง€ ๊ต์œก ์ž๋ฃŒ์™€ ํ•จ๊ป˜ GitHub์—์„œ ๋ณต์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ›„ํฌ๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. install_hook.sh ์•„๋‹ˆ๋ฉด ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ด์„œ repo/hooks/pre-commit ๋กœ์ปฌ ๋””๋ ‰ํ† ๋ฆฌ๋กœ .git/hooks/.
์ปค๋ฐ‹ํ•˜๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ํŠน์ • ํ‚ค์›Œ๋“œ๊ฐ€ ๋ชฉ๋ก์— ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ์ˆ˜๋™์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค. npm test ์ฝ”์Šค ์ €์žฅ์†Œ ํด๋”์— ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  2. ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์—ฌ ์ปค๋ฐ‹ ํ›„ํฌ(์‚ฌ์ „ ์ปค๋ฐ‹ ํ›„ํฌ)๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. install_hook.sh.
  3. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋กœ์ปฌ ์ €์žฅ์†Œ์— ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค.
  4. ์ปค๋ฐ‹ํ•˜๊ธฐ ์ „์— ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰๋˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ €์žฅ์†Œ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ง€์†์ ์ธ ํ†ตํ•ฉ์˜ ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ

ํŒ€

# ะฃัั‚ะฐะฝะพะฒะธั‚ะต pre-commit hook ะฒั‹ะฟะพะปะฝะธะฒ install_hook.sh.  

# ะ—ะฐะบะพะผะผะธั‚ัŒั‚ะต ะธะทะผะตะฝะตะฝะธั ะฒ ะปะพะบะฐะปัŒะฝั‹ะน ั€ะตะฟะพะทะธั‚ะพั€ะธะน. ะ˜ัะฟะพะปัŒะทัƒะนั‚ะต "Add first CI steps" ะฒ ะบะฐั‡ะตัั‚ะฒะต ัะพะพะฑั‰ะตะฝะธั ะฟั€ะธ ะบะพะผะผะธั‚ะต.
git add ci.md ci.test.js
git commit -m "Add first CI steps"

# ะฃะฑะตะดะธั‚ะตััŒ, ั‡ั‚ะพ ั‚ะตัั‚ั‹ ะทะฐะฟัƒัะบะฐัŽั‚ัั ะฟะตั€ะตะด ะบะพะผะผะธั‚ะพะผ.  

์›๊ฒฉ ์ €์žฅ์†Œ ๋˜๋Š” ์›๊ฒฉ ์ง€์ ์— ์ฝ”๋“œ ๊ฒŒ์‹œ

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

  • ํฌํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ์›๊ฒฉ ๊ณต์œ  ์ €์žฅ์†Œ๋ฅผ ๋ณต์ œํ•˜์—ฌ ํฌํฌ๋ผ๊ณ ๋„ ํ•˜๋Š” ๊ฐœ์ธ ์›๊ฒฉ ๋ณต์‚ฌ๋ณธ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด ๊ฐœ์ธ ์ €์žฅ์†Œ๋ฅผ ๋ณต์ œํ•˜์—ฌ ๋กœ์ปฌ๋กœ ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ณ  ์ปค๋ฐ‹์ด ์ด๋ฃจ์–ด์ง€๋ฉด ๊ทธ๋Š” ์ด๋ฅผ ์ž์‹ ์˜ ํฌํฌ์— ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค. ํฌํฌ์—์„œ ํ•ด๋‹น ์ปค๋ฐ‹์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ๊ณตํ†ต ์ €์žฅ์†Œ์— ํ†ตํ•ฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ GitHub์˜ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‚ด ๊ณ ๊ธ‰ ๊ณผ์ • [Git์„ ์‚ฌ์šฉํ•œ ํŒ€์›Œํฌ ๋ฐ CI]์—์„œ๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค(http://devops.redpill.solutions/).
  • ๋˜ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ํ•˜๋‚˜์˜ ์›๊ฒฉ ์ €์žฅ์†Œ๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ๋ถ„๊ธฐ๋งŒ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. master ๊ณต์œ  ์ €์žฅ์†Œ๊ฐ€ "๋ณดํ˜ธ๋จ"์ž…๋‹ˆ๋‹ค. ์ด ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๊ฐœ๋ณ„ ๊ฐœ๋ฐœ์ž๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ด ์ฝ”๋“œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ์›๊ฒฉ ์ €์žฅ์†Œ์˜ ๋ถ„๊ธฐ์— ์ž์‹ ์˜ ์ฝ”๋“œ๋ฅผ ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ด๋ฉด ๋‹ค์Œ๊ณผ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค. master ๊ณต์œ  ์ €์žฅ์†Œ.

์ด ํŠน์ • ๊ณผ์ •์—์„œ๋Š” ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์›Œํฌํ”Œ๋กœ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฅผ ๊ณต๊ฐœํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๏ธ๊ณผ์ œ

  • ์ž‘์—… ์ง€์ ๊ณผ ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์›๊ฒฉ ์ง€์ ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๊ฒŒ์‹œ

ํŒ€

git push --set-upstream origin feature

๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ ๋งŒ๋“ค๊ธฐ

์ œ๋ชฉ์ด ํฌํ•จ๋œ ํ’€ ์š”์ฒญ ๋งŒ๋“ค๊ธฐ ๋‹จ๊ณ„ ๊ฒ€ํ† ... ์„ค์น˜ feature "๋ณธ์ "๊ณผ ๊ฐ™์€ master "๊ธฐ๋ณธ ์ง€์ "๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์„ค์น˜ํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. master ๊ทธ์˜ ์ €์žฅ์†Œ๋ฅผ ํฌํฌํ•˜๋‹ค "๊ธฐ๋ณธ ๋ถ„๊ธฐ"๋กœ์„œ ์ €๋Š” ๊ฐ•์˜ ์ž๋ฃŒ ์ €์žฅ์†Œ ๋ณ€๊ฒฝ ์š”์ฒญ์— ์‘๋‹ตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

GitHub ์šฉ์–ด์—์„œ "๊ธฐ๋ณธ ๋ถ„๊ธฐ"๋Š” ์ž‘์—…์˜ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ๋ถ„๊ธฐ์ด๊ณ  "ํ—ค๋“œ ๋ถ„๊ธฐ"๋Š” ์ œ์•ˆ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํฌํ•จ๋œ ๋ถ„๊ธฐ์ž…๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ํ† ๋ก ํ•˜๊ณ , ํ† ๋ก ์ด ๊ณ„์†๋˜๋ฉด์„œ ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(ํ™๋ณด)

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

์‹ค์ œ๋กœ GitHub ๋˜๋Š” ์œ ์‚ฌํ•œ ํ”Œ๋žซํผ์˜ ํ’€ ์š”์ฒญ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœํŒ€์€ ๋Œ€๋ฉด ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜, ์Œ์„ฑ ํ†ตํ™”, ์ด๋ฉ”์ผ ๋“ฑ ๋‹ค๋ฅธ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ํฌ๋Ÿผ ์Šคํƒ€์ผ ํ’€ ์š”์ฒญ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ์ผ๋ถ€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

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

์ผ๋ฐ˜์ ์œผ๋กœ PR์„ ๋งŒ๋“ค ๋•Œ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ณ€๊ฒฝํ•˜๋ ค๋Š” ๋‚ด์šฉ๊ณผ ์œ„์น˜๋ฅผ ํ‘œ์‹œํ•˜์‹ญ์‹œ์˜ค.
  • ๋ณ€๊ฒฝ ๋ชฉ์ ์„ ์„ค๋ช…ํ•˜๋Š” ์„ค๋ช…์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์›ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:
    • ์ฝ”๋“œ์—์„œ ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ์ค‘์š”ํ•œ ํ•ญ๋ชฉ์ด๋‚˜ ๊ด€๋ จ #bug ๋ฐ ์ปค๋ฐ‹ ๋ฒˆํ˜ธ์™€ ๊ฐ™์ด ์ปจํ…์ŠคํŠธ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ์œ ์šฉํ•œ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    • ํ•จ๊ป˜ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ์„ @๋ฉ˜์…˜ํ•˜๊ฑฐ๋‚˜ ๋‚˜์ค‘์— ๋Œ“๊ธ€์—์„œ @๋ฉ˜์…˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋™๋ฃŒ์—๊ฒŒ ๋„์›€์„ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ๊ตฌ์ฒด์ ์ธ ์‚ฌํ•ญ์„ ํ™•์ธํ•˜์„ธ์š”.

PR์„ ์—ด๋ฉด ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์— ์‹คํ–‰๋˜๋„๋ก ๊ตฌ์„ฑ๋œ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ์ด๋Š” ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ํ…Œ์ŠคํŠธ ์„ธํŠธ์ด์ง€๋งŒ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ถ”๊ฐ€ ํ…Œ์ŠคํŠธ ๋ฐ ํ™•์ธ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ๊ฐ€ ์™„๋ฃŒ๋˜๋Š” ๋™์•ˆ ์ž ์‹œ ๊ธฐ๋‹ค๋ ค ์ฃผ์‹ญ์‹œ์˜ค. GitHub ์ธํ„ฐํŽ˜์ด์Šค์˜ PR ํ† ๋ก  ํ•˜๋‹จ์—์„œ ํ…Œ์ŠคํŠธ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๊ณ„์†ํ•˜์„ธ์š”.

๏ธ CI ๋‹จ๊ณ„ ๋ชฉ๋ก์˜ ๋ฌด์ž‘์œ„์„ฑ์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

์ด ๊ณผ์ •์—์„œ ์‚ฌ์šฉ๋œ ๋ชฉ๋ก์€ ์ž„์˜์ ์ด๊ณ  ์ฃผ๊ด€์ ์ด๋ฏ€๋กœ ์ด์— ๋Œ€ํ•ด ์ฐธ๊ณ  ์‚ฌํ•ญ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๏ธ ์ž‘์—…: ์ด ๋Œ“๊ธ€์— ๋Œ€ํ•œ ํ’€ ์š”์ฒญ ์ƒ์„ฑ

  1. ์ง€์ ์œผ๋กœ ์ „ํ™˜ master.
  2. ๋ผ๋Š” ์ด๋ฆ„์˜ ์ง€์ ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. bugfix.
  3. ํŒŒ์ผ ๋์— ๋ฉ”๋ชจ ํ…์ŠคํŠธ ์ถ”๊ฐ€ ci.md.
    > **GitHub flow** is sometimes used as a nickname to refer to a flavor of trunk-based development  
    when code is deployed straight from feature branches. This list is just an interpretation  
    that I use in my [DevOps courses](http://redpill.solutions).  
    The official tutorial is [here](https://guides.github.com/introduction/flow/).
  4. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค.
  5. ์Šค๋ ˆ๋“œ ๊ฒŒ์‹œ bugfix ์›๊ฒฉ ์ €์žฅ์†Œ๋กœ.
  6. ๋ผ๋Š” ์ด๋ฆ„์˜ ํ’€ ์š”์ฒญ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋น„๊ณ  ์ถ”๊ฐ€ ๋ณธ๋ถ€ ์ง€์ ์ด ์žˆ๋Š” bugfix ๊ทธ๋ฆฌ๊ณ  ๊ธฐ๋ณธ ์ง€์ master.

์„ค์น˜ํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. master ๊ทธ์˜ ์ €์žฅ์†Œ๋ฅผ ํฌํฌํ•˜๋‹ค "๊ธฐ๋ณธ ๋ถ„๊ธฐ"๋กœ์„œ ์ €๋Š” ๊ฐ•์˜ ์ž๋ฃŒ ์ €์žฅ์†Œ ๋ณ€๊ฒฝ ์š”์ฒญ์— ์‘๋‹ตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ €์žฅ์†Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ง€์†์ ์ธ ํ†ตํ•ฉ์˜ ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ

ํŒ€

# ะŸะตั€ะตะบะปัŽั‡ะธั‚ะตััŒ ะฝะฐ ะฒะตั‚ะบัƒ master. ะกะพะทะดะฐะนั‚ะต ะฒะตั‚ะบัƒ bugfix.
git checkout master

# ะกะพะทะดะฐะนั‚ะต ะฒะตั‚ะบัƒ bugfix-remark.
git checkout -b bugfix

# ะ”ะพะฑะฐะฒัŒั‚ะต ั‚ะตะบัั‚ ะฟั€ะธะผะตั‡ะฐะฝะธั ะฒะฝะธะทัƒ ci.md.

# ะ—ะฐะบะพะผะผะธั‚ัŒั‚ะต ะธะทะผะตะฝะตะฝะธั
git add ci.md
git commit -m "Add a remark about the list being opinionated"

# ะžะฟัƒะฑะปะธะบัƒะนั‚ะต ะฒะตั‚ะบัƒ bugfix ะฒ ัƒะดะฐะปั‘ะฝะฝั‹ะน ั€ะตะฟะพะทะธั‚ะพั€ะธะน.
git push --set-upstream origin bugfix

# ะกะพะทะดะฐะนั‚ะต pull request ะฟั€ะธ ะฟะพะผะพั‰ะธ ะธะฝั‚ะตั€ั„ะตะนัะฐ GitHub ะบะฐะบ ะพะฟะธัะฐะฝะพ ะฒั‹ัˆะต

ํ’€ ์š”์ฒญ ์Šน์ธ "๋น„๊ณ  ์ถ”๊ฐ€"

๏ธ๊ณผ์ œ

  1. ํ’€ ์š”์ฒญ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  2. "ํ’€ ์š”์ฒญ ๋ณ‘ํ•ฉ"์„ ํด๋ฆญํ•˜์„ธ์š”.
  3. "๋ณ‘ํ•ฉ ํ™•์ธ"์„ ํด๋ฆญํ•˜์„ธ์š”.
  4. "๋ธŒ๋žœ์น˜ ์‚ญ์ œ"๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋Š” ๋ณ‘ํ•ฉ ํ›„ ์ปค๋ฐ‹์„ ๋ณด์—ฌ์ฃผ๋Š” ๋‹ค์ด์–ด๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.
์ง€์†์ ์ธ ํ†ตํ•ฉ์˜ ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ

๏ธ ๊ณ„์† ์ž‘์—…ํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”

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

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

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

ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ(TDD)

TDD๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์ „์— ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. TDD๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์ž‘์—… ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ƒˆ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  3. ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.
  4. ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.
  5. ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ„ฐ๋งํ•˜์„ธ์š”.
  6. ๋ฐ˜๋ณตํ•˜๋‹ค.

์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ์˜ ๊ฒฐ๊ณผ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋˜๊ณ , ํ†ต๊ณผํ•œ ํ…Œ์ŠคํŠธ์˜ ๊ฒฐ๊ณผ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋…น์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋˜๋ฏ€๋กœ ์ด ์ฃผ๊ธฐ๋ฅผ ๋นจ๊ฐ„์ƒ‰-๋…น์ƒ‰-๋ฆฌํŒฉํ„ฐ๋ง์ด๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค.

๏ธ๊ณผ์ œ

๋จผ์ € ํ…Œ์ŠคํŠธ๋ฅผ ์ปค๋ฐ‹ํ•˜๊ณ  ์‹คํŒจํ•˜๋„๋ก ํ•œ ๋‹ค์Œ CI ๋‹จ๊ณ„ ๋ชฉ๋ก ์ž์ฒด์˜ ํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค("๋…น์ƒ‰").
๊ทธ๋Ÿฐ ๋‹ค์Œ ์ƒˆ ์ฝ”๋“œ๋ฅผ ์›๊ฒฉ ์ €์žฅ์†Œ์— ๊ฒŒ์‹œํ•˜๊ณ  ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ ํ† ๋ก  ํ•˜๋‹จ์— ์žˆ๋Š” GitHub ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ๊ณผ PR ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ์‚ดํŽด๋ณด์„ธ์š”.

  1. ์ง€์ ์œผ๋กœ ์ „ํ™˜ feature.
  2. ์ด ํ…Œ์ŠคํŠธ๋ฅผ ๋‹ค์Œ์— ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. ci.test.js ๋งˆ์ง€๋ง‰ ํ†ตํ™” ํ›„ it (...);.

    it('5. Merge/rebase commits from master. Make tests pass on the merge result.', () => {
      expect(/.*merge.*commits.*testss+pass.*/ig.test(fileContents)).toBe(true);
    });
    
    it('6. Deploy from the feature branch to production.', () => {
      expect(/.*Deploy.*tos+production.*/ig.test(fileContents)).toBe(true);
    });
    
    it('7. If everything is good in production for some period of time, merge changes to master.', () => {
      expect(/.*merge.*tos+master.*/ig.test(fileContents)).toBe(true);
    });

  3. ํ…Œ์ŠคํŠธ๋ฅผ ์ปค๋ฐ‹ํ•ด ๋ณด์„ธ์š”. ๋งŒ์•ฝ์— pre-commit ํ›„ํฌ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์œผ๋ฉด ์ปค๋ฐ‹ ์‹œ๋„๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.
  4. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด ํ…์ŠคํŠธ๋ฅผ ci.md.
    5. Merge/rebase commits from master. Make tests pass on the merge result.  
    6. Deploy from the feature branch with a sneaky bug to production.
    7. If everything is good in production for some period of time, merge changes to master. 
  5. ๋กœ์ปฌ์—์„œ ๋ณ€๊ฒฝํ•˜๊ณ  ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค.
  6. ์ง€์ ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๊ฒŒ์‹œ feature.

์ด์ œ ์ด๋Ÿฐ ๊ฒƒ์ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค
์ง€์†์ ์ธ ํ†ตํ•ฉ์˜ ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ

ํŒ€


# ะŸะตั€ะตะบะปัŽั‡ะธั‚ะตะปัŒะฝะฐ ะฒะตั‚ะบัƒ feature
git checkout feature

# ะ”ะพะฑะฐะฒะธั‚ัŒ ั‚ะตัั‚ั‹ ะฒ ci.test.js ะบะฐะบ ะพะฟะธัะฐะฝะพ ะฒั‹ัˆะต

# ะ”ะพะฑะฐะฒัŒั‚ะต ะฒ ะธะฝะดะตะบั ci.test.js ั‡ั‚ะพะฑั‹ ะฟะพะทะถะต ะทะฐะบะพะผะผะธั‚ะธั‚ัŒ
git add ci.test.js

# ะŸะพะฟั‹ั‚ะฐะนั‚ะตััŒ ะทะฐะบะพะผะผะธั‚ะธั‚ัŒ ั‚ะตัั‚ั‹. ะ•ัะปะธ pre-commit hook ัƒัั‚ะฐะฝะพะฒะปะตะฝั‹, ะบะพะผะผะธั‚ ะฝะต ะฟั€ะพะธะทะพะนะดั‘ั‚.
git commit

# ะขะตะฟะตั€ัŒ ะดะพะฑะฐะฒัŒั‚ะต ั‚ะตะบัั‚ ะฒ ci.md ะบะฐะบ ะพะฟะธัะฐะฝะพ ะฒั‹ัˆะต

# ะ’ะฝะตัะธั‚ะต ะธะทะผะตะฝะตะฝะธั ะธ ะทะฐะบะพะผะผะธั‚ัŒั‚ะต ะธั…
git add ci.md
git commit -m "Add the remaining CI steps"

# ะžะฟัƒะฑะปะธะบัƒะนั‚ะต ะธะทะผะตะฝะตะฝะธั ะฒ ะฒะตั‚ะบัƒ feature
git push

๋ณ‘ํ•ฉ ์ถฉ๋Œ

๋ณ€๊ฒฝ์š”์ฒญ ๋ฐ”๋กœ๊ฐ€๊ธฐ ๋‹จ๊ณ„ ๊ฒ€ํ† .

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

๋ณ‘ํ•ฉ ๋˜๋Š” ๋ฆฌ๋ฒ ์ด์Šค

๋ณ‘ํ•ฉ

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

๋ฆฌ๋ฒ ์ด์Šค

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

์ผ๋ฐ˜์ ์œผ๋กœ ํŒ€์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณ‘ํ•ฉํ•ด์•ผ ํ•  ๋•Œ ํ•ญ์ƒ ๋™์ผํ•œ ์ „๋žต์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” "์ˆœ์ˆ˜ํ•œ" ๋ณ‘ํ•ฉ ๋˜๋Š” ์ƒ๋‹จ์˜ "์ˆœ์ˆ˜ํ•œ" ์ปค๋ฐ‹์ผ ์ˆ˜๋„ ์žˆ๊ณ , ๋Œ€ํ™”์‹์œผ๋กœ ์ƒ๋‹จ์—์„œ ์ปค๋ฐ‹์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ๊ทธ ์‚ฌ์ด์˜ ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(git rebase -i) ๊ณต์šฉ ์ €์žฅ์†Œ์— ๊ฒŒ์‹œ๋˜์ง€ ์•Š์€ ๋ถ„๊ธฐ์˜ ๊ฒฝ์šฐ ๋กœ์ปฌ์ด์ง€๋งŒ "๊ณต์šฉ" ๋ถ„๊ธฐ์˜ ๊ฒฝ์šฐ ๋ณ‘ํ•ฉ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” ๋ณ‘ํ•ฉ์„ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๏ธ๊ณผ์ œ

  1. ์ฝ”๋“œ๊ฐ€ ๋กœ์ปฌ ์ง€์ ์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. master ์›๊ฒฉ ์ €์žฅ์†Œ์—์„œ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  2. ์ง€์ ์œผ๋กœ ์ „ํ™˜ feature.
  3. ๋ธŒ๋žœ์น˜์™€ ๋ณ‘ํ•ฉ ์‹œ์ž‘ master. ๊ฒฝ์Ÿ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ์ธํ•ด ๋ณ‘ํ•ฉ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ci.md.
  4. CI ๋‹จ๊ณ„ ๋ชฉ๋ก๊ณผ ๊ทธ์— ๋Œ€ํ•œ ์ฐธ๊ณ  ์‚ฌํ•ญ์ด ๋ชจ๋‘ ํ…์ŠคํŠธ์— ๋‚จ์•„ ์žˆ๋„๋ก ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  5. ์›๊ฒฉ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ ์ปค๋ฐ‹ ๊ฒŒ์‹œ feature.
  6. GitHub UI์—์„œ ํ’€ ์š”์ฒญ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ  ๋ณ‘ํ•ฉ์ด ํ•ด๊ฒฐ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

ํŒ€

# ะฃะฑะตะดะธั‚ะตััŒ, ั‡ั‚ะพ ะบะพะด ะฒ ะปะพะบะฐะปัŒะฝะพะต ะฒะตั‚ะบะต `master` ะพะฑะฝะพะฒะปั‘ะฝ ะธะท ัƒะดะฐะปั‘ะฝะฝะพะณะพ ั€ะตะฟะพะทะธั‚ะพั€ะธั.
git checkout master
git pull

# ะŸะตั€ะตะบะปัŽั‡ะธั‚ะตััŒ ะฝะฐ ะฒะตั‚ะบัƒ feature
git checkout feature

# ะ˜ะฝะธั†ะธะธั€ัƒะนั‚ะต ัะปะธัะฝะธะต ั ะฒะตั‚ะบะพะน master 
git merge master

# A merge conflict related to concurrent changes to ci.md will be reported
# => Auto-merging ci.md
#    CONFLICT (content): Merge conflict in ci.md
#    Automatic merge failed; fix conflicts and then commit the result.

# ะ ะฐะทั€ะตัˆะธั‚ะต ะบะพะฝั„ะปะธะบั‚ ั‚ะฐะบ, ั‡ั‚ะพะฑั‹ ะธ ะฝะฐัˆ ัะฟะธัะพะบ ัˆะฐะณะพะฒ CI, ะธ ะทะฐะผะตั‡ะฐะฝะธะต ะพ ะฝะตะผ ะพัั‚ะฐะปะธััŒ ะฒ ั‚ะตะบัั‚ะต.
# ะพั‚ั€ะตะดะฐะบั‚ะธั€ัƒะนั‚ะต ci.md ั‡ั‚ะพะฑ ะพะฝ ะฝะต ัะพะดะตั€ะถะฐะป ะผะฐั€ะบะตั€ะพะฒ ะบะพะฝั„ะปะธะบั‚ะฐ ัะปะธัะฝะธั
git add ci.md
git merge --continue
# ะฟั€ะธ ะบะพะผะผะธั‚ะต ะผะพะถะตั‚ะต ะพัั‚ะฐะฒะธั‚ัŒ ัะพะพะฑั‰ะตะฝะธะต ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ

# ะžะฟัƒะฑะปะธะบัƒะนั‚ะต ะบะพะผะผะธั‚ ัะปะธัะฝะธั ะฒ ัƒะดะฐะปะตะฝะฝัƒัŽ ะฒะตั‚ะบัƒ feature.
git push

# ะŸั€ะพะฒะตั€ัŒั‚ะต ัั‚ะฐั‚ัƒั ะทะฐะฟั€ะพัะฐ ะฝะฐ ะธะทะผะตะฝะตะฝะธั ะฒ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŒัะบะพะผ ะธะฝั‚ะตั€ั„ะตะนัะต GitHub, ะดะพะถะดะธั‚ะตััŒ ะฟะพะบะฐ ัะปะธัะฝะธะต ะฝะต ะฑัƒะดะตั‚ ั€ะฐะทั€ะตัˆะตะฝะพ.

์ž˜ ํ–ˆ์–ด!

๋ชฉ๋ก ์ž‘์—…์ด ์™„๋ฃŒ๋˜์—ˆ์œผ๋ฉฐ ์ด์ œ ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์„ ์Šน์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. master.

๏ธ ์ž‘์—…: ํ’€ ์š”์ฒญ ์Šน์ธ "๋‹จ๊ณ„ ๊ฒ€ํ† "

  1. ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์„ ์—ฝ๋‹ˆ๋‹ค.
  2. "ํ’€ ์š”์ฒญ ๋ณ‘ํ•ฉ"์„ ํด๋ฆญํ•˜์„ธ์š”.
  3. "๋ณ‘ํ•ฉ ํ™•์ธ"์„ ํด๋ฆญํ•˜์„ธ์š”.
  4. ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ "๋ธŒ๋žœ์น˜ ์‚ญ์ œ"๋ฅผ ํด๋ฆญํ•˜์„ธ์š”.

ํ˜„์žฌ ๊ท€ํ•˜์˜ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค.
์ง€์†์ ์ธ ํ†ตํ•ฉ์˜ ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ

์ œํ’ˆ ์˜ค๋ฅ˜

"ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Œ์„ ๋ณด์—ฌ์ค„ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์˜ค๋ฅ˜๊ฐ€ ์—†์Œ์„ ๋ณด์—ฌ์ค„ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค." ํ…Œ์ŠคํŠธ๋ฅผ ํ–ˆ๊ณ  ์˜ค๋ฅ˜๊ฐ€ ์—†๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ตํ™œํ•œ ๋ฒ„๊ทธ๊ฐ€ ํ”„๋กœ๋•์…˜์— ์นจํˆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด์™€ ๊ฐ™์€ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ๋‹ค์Œ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ํ”„๋กœ๋•์…˜์— ๋ฐฐํฌ๋˜๋Š” ํ•ญ๋ชฉ
  • ์Šค๋ ˆ๋“œ์˜ ์ฝ”๋“œ master ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒˆ ์ž‘์—…์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ฒ„์ „์—์„œ ๋กค๋ฐฑํ•ด์•ผ ํ• ๊นŒ์š”, ์•„๋‹ˆ๋ฉด ์ˆ˜์ •ํ•ด์•ผ ํ• ๊นŒ์š”?

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

์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ๋กค๋ฐฑ์€ ์œ„ํ—˜์„ ์ˆ˜๋ฐ˜ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ์ œํ’ˆ์˜ ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•˜์‹ญ์‹œ์˜ค.
  • ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋‹ค master ์ƒˆ๋กœ์šด ์ผ์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ์ฆ‰์‹œ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๏ธ๊ณผ์ œ

  1. ์ง€์ ์œผ๋กœ ์ „ํ™˜ master ์žฅ์†Œ ์ƒ์—์„œ
  2. ์›๊ฒฉ ์ €์žฅ์†Œ์—์„œ ๋กœ์ปฌ ์ €์žฅ์†Œ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
  3. PR ๋ณ‘ํ•ฉ ์ปค๋ฐ‹ ๋˜๋Œ๋ฆฌ๊ธฐ ๋‹จ๊ณ„ ๊ฒ€ํ†  ะฒ master.
  4. ์›๊ฒฉ ์ €์žฅ์†Œ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค.

๋ณ‘ํ•ฉ ์ปค๋ฐ‹์„ ๋˜๋Œ๋ฆฐ ์ €์žฅ์†Œ์˜ ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค.
์ง€์†์ ์ธ ํ†ตํ•ฉ์˜ ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ

ํŒ€

# ะŸะตั€ะตะบะปัŽั‡ะธั‚ะตััŒ ะฝะฐ ะฒะตั‚ะบัƒ master.
git checkout master

# ะžะฑะฝะพะฒะธั‚ะต ะปะพะบะฐะปัŒะฝั‹ะน ั€ะตะฟะพะทะธั‚ะพั€ะธะน ะธะท ัƒะดะฐะปั‘ะฝะฝะพะณะพ ั€ะตะฟะพะทะธั‚ะพั€ะธั.
git pull

# ะžั‚ะผะตะฝะธั‚ะต ะบะพะผะผะธั‚ ัะปะธัะฝะธั PR Steps review ะฒ master.
# ะœั‹ ะพั‚ะผะตะฝัะตะผ ะบะพะผะผะธั‚ ัะปะธัะฝะธั, ะฟะพัั‚ะพะผัƒ ะฝะฐะผ ะฝัƒะถะฝะพ ะฒั‹ะฑั€ะฐั‚ัŒ ะฒะตั‚ะบัƒ ะธัั‚ะพั€ะธะธ, ะบะพั‚ะพั€ัƒัŽ ะผั‹ ะทะฐั…ะพั‚ะธะผ ะพัั‚ะฐะฒะธั‚ัŒ
git show HEAD

# ะฟั€ะตะดะฟะพะปะพะถะธะผ, ั‡ั‚ะพ ะบะพะผะผะธั‚, ะบะพั‚ะพั€ั‹ะน ะฑั‹ะป ะฟะพัะปะตะดะฝะธะผ ะฒ ะฒะตั‚ะบะต master ะดะพ ัะปะธัะฝะธั, ะฑั‹ะป ะพั‚ะพะฑั€ะฐะถั‘ะฝ ะฟั€ะตะดั‹ะดัƒั‰ะตะน ะบะพะผะฐะฝะดะพะน ะฟะตั€ะฒั‹ะผ
git revert HEAD -m 1
# ะผะพะถะตั‚ะต ะฝะต ะผะตะฝัั‚ัŒ ัะพะพะฑั‰ะตะฝะธั ะบะพะผะผะธั‚ะพะฒ

# ะžะฟัƒะฑะปะธะบัƒะนั‚ะต ะธะทะผะตะฝะตะฝะธั ะฒ ัƒะดะฐะปั‘ะฝะฝั‹ะน ั€ะตะฟะพะทะธั‚ะพั€ะธะน
git push

๏ธ ์ž๊ฐ€ ํ…Œ์ŠคํŠธ

ํ™•์ธ ci.md ๋ณ‘ํ•ฉ ์ปค๋ฐ‹์„ ๋˜๋Œ๋ฆฐ ํ›„ ๋” ์ด์ƒ "sneaky bug"๋ผ๋Š” ํ…์ŠคํŠธ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

CI ๋‹จ๊ณ„ ๋ชฉ๋ก์„ ์ˆ˜์ •ํ•˜์—ฌ ๋งˆ์Šคํ„ฐ๋กœ ๋ฐ˜ํ™˜

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

์šฐ๋ฆฌ๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ๋ณ‘ํ•ฉ์„ ์ทจ์†Œํ•˜๋Š” ์ปค๋ฐ‹์„ ๋˜๋Œ๋ฆฌ๊ธฐ feature ั master;
  • ์ด์ „์—์„œ ์ปค๋ฐ‹์„ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. feature.

์ด ๊ฒฝ์šฐ ๊ฐœ๋ฐœ ํŒ€๋งˆ๋‹ค ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์œ ์šฉํ•œ ์ปค๋ฐ‹์„ ๋ณ„๋„์˜ ๋ธŒ๋žœ์น˜๋กœ ์ด๋™ํ•˜๊ณ  ์ด ์ƒˆ ๋ธŒ๋žœ์น˜์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ํ’€ ์š”์ฒญ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๏ธ๊ณผ์ œ

  1. ๋ผ๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. feature-fix ๊ทธ๊ฒƒ์œผ๋กœ ์ „ํ™˜ํ•˜์‹ญ์‹œ์˜ค.
  2. ์ด์ „ ๋ถ„๊ธฐ์—์„œ ๋ชจ๋“  ์ปค๋ฐ‹ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ feature ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๋กœ. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ค‘์— ๋ฐœ์ƒํ•œ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

    ์ง€์†์ ์ธ ํ†ตํ•ฉ์˜ ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ

  3. ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ci.test.js:

    it('does not contain the sneaky bug', () => {
    expect( /.*sneakys+bug.*/gi.test(fileContents)).toBe(false);
    });

  4. ๋กœ์ปฌ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์‹คํŒจํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.
  5. "๋น„๋ฐ€ํ•œ ๋ฒ„๊ทธ ํฌํ•จ"์ด๋ผ๋Š” ํ…์ŠคํŠธ๋ฅผ ์ œ๊ฑฐํ•˜์„ธ์š”. ci.md.
  6. ํ…Œ์ŠคํŠธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ๋‹จ๊ณ„ ๋ชฉ๋ก ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ธ๋ฑ์Šค์— ์ถ”๊ฐ€ํ•˜๊ณ  ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค.
  7. ์›๊ฒฉ ์ €์žฅ์†Œ์— ๋ถ„๊ธฐ๋ฅผ ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๋น„์Šทํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ง€์†์ ์ธ ํ†ตํ•ฉ์˜ ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ

ํŒ€

# ะกะพะทะดะฐะนั‚ะต ะฒะตั‚ะบัƒ ะฟะพะด ะฝะฐะทะฒะฐะฝะธะตะผ feature-fix ะธ ะฟะตั€ะตะบะปัŽั‡ะธั‚ะตััŒ ะฝะฐ ะฝะตะต.
git checkout -b feature-fix

# ะŸะตั€ะตะฝะตัะธั‚ะต ะฒัะต ะบะพะผะผะธั‚ั‹ ะธะท ะฑั‹ะฒัˆะตะน ะฒะตั‚ะบะธ feature ะฒ ะฝะพะฒัƒัŽ ะฒะตั‚ะบัƒ. ะ ะฐะทั€ะตัˆะธั‚ะต ะบะพะฝั„ะปะธะบั‚ั‹ ัะปะธัะฝะธั, ะบะพั‚ะพั€ั‹ะต ะฒะพะทะฝะธะบะปะธ ะฟั€ะธ ะฟะตั€ะตะฝะพัะต.
# ะธัะฟะพะปัŒะทัƒะนั‚ะต ะธัั‚ะพั€ะธัŽ ั‡ั‚ะพะฑั‹ ัƒะทะฝะฐั‚ัŒ ั…ััˆะธ ะบะพะผะผะธั‚ะพะฒ:
# - ะฟั€ะตะดัˆะตัั‚ะฒัƒัŽั‰ะตะณะพ ะบะพะผะผะธั‚ัƒ ั ะฟะตั€ะฒะพะน ั‡ะฐัั‚ัŒัŽ ัะฟะธัะบะฐ: C0
# - ะดะพะฑะฐะฒะปััŽั‰ะตะณะพ ะฟะพัะปะตะดะฝะธะต ัะปะตะผะตะฝั‚ั‹ ัะฟะธัะบะฐ: C2
git log --oneline --graph
git cherry-pick C0..C2
# ั€ะฐะทั€ะตัˆะธั‚ะต ะบะพะฝั„ะปะธะบั‚ั‹ ัะปะธัะฝะธั
# - ะพั‚ั€ะตะดะฐะบั‚ะธั€ัƒะนั‚ะต ci.md ะธ/ะธะปะธ ci.test.js
# - ะดะพะฑะฐะฒัŒั‚ะต ั„ะฐะนะปั‹ ะฒ ะธะฝะดะตะบั
# - ะฒั‹ะฟะพะปะฝะธั‚ะต "git cherry-pick --continue", ะผะพะถะตั‚ะต ะฝะต ะผะตะฝัั‚ัŒ ัะพะพะฑั‰ะตะฝะธะต ะบะพะผะผะธั‚ะฐ

# ะ”ะพะฑะฐะฒัŒั‚ะต ั€ะตะณั€ะตััะธะพะฝะฝั‹ะน ั‚ะตัั‚ ะฒ ci.test.js
# ะ—ะฐะฟัƒัั‚ะธั‚ะต ั‚ะตัั‚ั‹ ะปะพะบะฐะปัŒะฝะพ, ั‡ั‚ะพะฑั‹ ัƒะฑะตะดะธั‚ัŒัั, ั‡ั‚ะพ ะพะฝะธ ะฝะต ะทะฐะฒะตั€ัˆะฐัŽั‚ัั ัƒัะฟะตัˆะฝะพ.

# ะฃะดะฐะปะธั‚ะต ั‚ะตะบัั‚ " with a sneaky bug" ะฒ ci.md.

# ะ”ะพะฑะฐะฒัŒั‚ะต ะฒ ะธะฝะดะตะบั ะธะทะผะตะฝะตะฝะธั ั‚ะตัั‚ะพะฒ ะธ ะฒ ัะฟะธัะบะต ัˆะฐะณะพะฒ ะธ ะทะฐะบะพะผะผะธั‚ัŒั‚ะต ะธั….
git add ci.md ci.test.js
git commit -m "Fix the bug in steps list"

# ะžะฟัƒะฑะปะธะบัƒะนั‚ะต ะฒะตั‚ะบัƒ ะฒ ัƒะดะฐะปั‘ะฝะฝั‹ะน ั€ะตะฟะพะทะธั‚ะพั€ะธะน.
git push --set-upstream origin feature-fix

ํ’€ ์š”์ฒญ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ œ๋ชฉ์ด ํฌํ•จ๋œ ํ’€ ์š”์ฒญ ๋งŒ๋“ค๊ธฐ ๊ธฐ๋Šฅ ์ˆ˜์ •... ์„ค์น˜ feature-fix "๋ณธ์ "๊ณผ ๊ฐ™์€ master "๊ธฐ๋ณธ ์ง€์ "๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
ํ…Œ์ŠคํŠธ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค ์ฃผ์‹ญ์‹œ์˜ค. PR ํ† ๋ก  ํ•˜๋‹จ์—์„œ ํ…Œ์ŠคํŠธ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค์น˜ํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. master ๊ทธ์˜ ์ €์žฅ์†Œ๋ฅผ ํฌํฌํ•˜๋‹ค "๊ธฐ๋ณธ ๋ถ„๊ธฐ"๋กœ์„œ ์ €๋Š” ๊ฐ•์˜ ์ž๋ฃŒ ์ €์žฅ์†Œ ๋ณ€๊ฒฝ ์š”์ฒญ์— ์‘๋‹ตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ’€ ์š”์ฒญ ์Šน์ธ "๊ธฐ๋Šฅ ์ˆ˜์ • ์ค‘"

์ˆ˜์ •ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์Šน์ธํ•ด ์ฃผ์„ธ์š”. master ํ’€ ์š”์ฒญ์—์„œ.

๏ธ๊ณผ์ œ

  1. "ํ’€ ์š”์ฒญ ๋ณ‘ํ•ฉ"์„ ํด๋ฆญํ•˜์„ธ์š”.
  2. "๋ณ‘ํ•ฉ ํ™•์ธ"์„ ํด๋ฆญํ•˜์„ธ์š”.
  3. ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ "๋ธŒ๋žœ์น˜ ์‚ญ์ œ"๋ฅผ ํด๋ฆญํ•˜์„ธ์š”.

์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ง€๊ธˆ ๋‹น์‹ ์ด ๊ฐ€์ ธ์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ง€์†์ ์ธ ํ†ตํ•ฉ์˜ ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ

์ถ•ํ•˜ํ•ด!

์ง€์†์  ํ†ตํ•ฉ ์ค‘์— ์‚ฌ๋žŒ๋“ค์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“  ๋‹จ๊ณ„๋ฅผ ์™„๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ•์ขŒ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ๊ฐœ์„  ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ๋‹ค์Œ์—์„œ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์„ธ์š”. ๊ฐ•์ขŒ ์ž๋ฃŒ๊ฐ€ ์žˆ๋Š” ์ €์žฅ์†Œ. ์ด ์ฝ”์Šค์—๋Š” ๋˜ํ•œ ๋Œ€ํ™”ํ˜• ๋ฒ„์ „ GitHub Learning Lab์„ ํ”Œ๋žซํผ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

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