๐Ÿ“’ GitHub - Action(CI/CD)_(1)

Kimdongkiยท2024๋…„ 6์›” 8์ผ

Git

๋ชฉ๋ก ๋ณด๊ธฐ
1/2

๐Ÿ“Œ Git์ด๋ž€?

  • Git์€ ๋ถ„์‚ฐํ™˜๊ฒฝ์„ ์ง€์›ํ•˜๋Š” ์†Œ์Šค ๋ฒ„์ „ ์ปจํŠธ๋กค ์‹œ์Šคํ…œ

    • CVS, SVN์€ ํ•ญ์ƒ ์„œ๋ฒ„์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋Š” ์ „์ œํ•˜์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ (์ค‘์•™ ๊ฐœ๋ฐœ)
  • ๋ฆฌ๋ˆ…์Šค๋ฅผ ๋งŒ๋“  Linus Torvalds๊ฐ€ ๊ฐœ๋ฐœ

    • ๋ฆฌ๋ˆ…์Šค ์ปค๋„ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ๋งŒ๋“ค์—ˆ์œผ๋ฉฐ GPL v2 ์˜คํ”ˆ์†Œ์Šค
  • SVN/CVS์— ๋น„ํ•ด ํ˜„์ €ํ•˜๊ฒŒ ๋น ๋ฅด๋‚˜ ์‚ฌ์šฉ๋ฒ•์€ ํ›จ์”ฌ ๋” ๋ณต์žกํ•จ :(


๐Ÿ“Œ Git์˜ ์žฅ์  ์งง์€ ๋ฒ„์ „

  • ๋‹ค์ˆ˜์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ณต๋™ ๊ฐœ๋ฐœ
  • ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๊ฐ€๋Šฅ
  • ์ฝ”๋“œ ๋ฐฑ์—…
  • ๊ณผ๊ฑฐ์˜ ์ฝ”๋“œ๋กœ ๋กค๋ฐฑ ๊ฐ€๋Šฅ

๐Ÿ“Œ Git์˜ ์žฅ์  ๊ธด ๋ฒ„์ „

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

๐Ÿ“Œ Git ์‚ฌ์šฉ์‹œ ํ•„์š”ํ•œ ๊ฒƒ

  • ์ง์ ‘ git์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด git์ด ์„ค์น˜๋œ ์ปดํ“จํ„ฐ์™€ ์ €์žฅ ๊ณต๊ฐ„
  • ํด๋ผ์šฐ๋“œ ๋ฒ„์ „ ์‚ฌ์šฉ (GitHub, BitBucket, GitLab ๋“ฑ๋“ฑ)
    • ํด๋ผ์ด์–ธํŠธ๋Š” ๋ณ„๋„ ์„ค์น˜
    • Github์ด ๊ฐ€์žฅ ์ธ๊ธฐ๊ฐ€ ๋งŽ์Œ

๐Ÿ“Œ Github์ด๋ž€?

  • Git repo ํ˜ธ์ŠคํŒ…/ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค (http://github.com)
    • ๋Œ€๋ถ€๋ถ„์˜ ํšŒ์‚ฌ๋“ค์ด Git์„ ์ง์ ‘ ์„ค์น˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ๋ณด๋‹ค๋Š” github์„ ์‚ฌ์šฉ
  • Git์€ ํ…์ŠคํŠธ ์ปค๋งจ๋“œ๋ผ์ธ ํˆด์ด์ง€๋งŒ Github์€ ์›น๊ธฐ๋ฐ˜ ์ธํ„ฐํŽ˜์ด์Šค๋„ ์ œ๊ณต
    (์ผ๋ถ€)
  • ์ž์‹ ์ด ๋งŒ๋“  repo๋“ค์ด ๋ชจ๋‘ public์ผ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ด ๋ฌด๋ฃŒ
    • private repo์˜ ์ˆ˜์— ๋”ฐ๋ผ ๊ฐ€๊ฒฉ๋Œ€๊ฐ€ ๊ฒฐ์ •๋จ
    • ๊ฐœ๋ฐœ์ž๋“ค์„ ์œ„ํ•œ Facebook!
  • ๋‹ค์–‘ํ•œ ํˆด์„ ์ œ๊ณตํ•˜์—ฌ ์ƒํƒœ๊ณ„ ๋งˆ๋ จ
    • Code ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ ์ฆ๋Œ€๋ฅผ ์œ„ํ•œ Copilot
    • CI/CD๋“ฑ์˜ ๋‹ค์–‘ํ•œ ์—ฐ๋™์„ ์œ„ํ•œ Workflows ์ œ๊ณต
    • ๋˜ํ•œ ๋ฌธ์„œํ™”๋ฅผ ์œ„ํ•œ Wikis์™€ ๋ฒ„๊ทธ๋ฆฌํฌํŠธ์™€ ํŠธ๋ž™ํ‚น์„ ์œ„ํ•œ Issues ๊ธฐ๋Šฅ์„ ์ œ๊ณต
  • 2018๋…„์— ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ๊ฐ€ $7.5B์— ์ธ์ˆ˜ํ•จ

๐Ÿ“Œ Git ์‚ฌ์šฉ๋ฐฉ๋ฒ•

  • CLI (์ปค๋งจ๋“œ๋ผ์ธ)
  • GUI (์›น UI ํ˜น์€ ๋ฐ์Šคํฌํƒ‘ ํ”„๋กœ๊ทธ๋žจ)
    • Github์ด ๊ฐ€์žฅ ์ธ๊ธฐ๊ฐ€ ๋งŽ์Œ

๐Ÿ“Œ ๋ถ„์‚ฐ๊ฐœ๋ฐœ vs. ์ค‘์•™๊ฐœ๋ฐœ

  • ์ค‘์•™๊ฐœ๋ฐœ: SVN/CVS

  • ๋ถ„์‚ฐ๊ฐœ๋ฐœ: Github


๐Ÿ“Œ Git ๊ด€๋ จ ์šฉ์–ด

  • Repo:

    • Repository์˜ ์ค€๋ง๋กœ Git์œผ๋กœ ๊ด€๋ฆฌ๋˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง€์นญ
  • Master/Main:

    • ํ•œ Repo์—์„œ ๊ธฐ๋ณธ์ด ๋˜๋Š” ๋ฉ”์ธ ์ฝ”๋“œ๋ฅผ ์ง€์นญ. Git์—์„œ๋Š” master์ด๊ณ  github์—์„œ๋Š” ์ด์ œ main
  • Branch:

    • ์ž์‹ ์˜ Repo์—์„œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ๋“ฑ์„ ์œ„ํ•ด Master ํ˜น์€ ๋‹ค๋ฅธ Branch๋กœ๋ถ€ํ„ฐ ๋งŒ๋“  ์ฝ”๋“œ
      ์ž‘์—…๋ณธ์„ ์ง€์นญ. ์ž‘์—… ํ›„ ๋‚˜์ค‘์— ์›๋ณธ Branch์™€ ๋‹ค์‹œ ๋ณ‘ํ•ฉํ•˜๋ ค๋Š” ๋ชฉ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„๋‹ค.
  • Clone:

    • ๋‹ค๋ฅธ ๊ณ„์ •์— ์กด์žฌํ•˜๋Š” repo๋กœ๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด local repository๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ
  • Commit (Check-in):

    • ๋‚ด๊ฐ€ ๋งŒ๋“  ์ฝ”๋“œ ๋ณ€๊ฒฝ์„ Branch์˜ Local Repository์— ๋ฐ˜์˜ํ•˜๋Š” ๊ฒƒ
  • ์ž‘์—…์€ ํ•ญ์ƒ ๋‚ด ์ปดํ“จํ„ฐ์— ์žˆ๋Š” Local Repo์—์„œ ์ผ์–ด๋‚˜๋ฉฐ Pull๊ณผ Push๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์ƒ์˜ Remote
    Repo์™€ ์—ฐ๊ฒฐ

  • Pull:

    • Master์™€ ๊ฐ™์€ Remote Repo๋กœ๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ Pull์ดํ›„ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์„ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค๋Š” ์ž‘์—…. ์ฆ‰
      Master(ํ˜น์€ Branch)์™€ ์”ฝํฌํ•˜๋Š” ๊ฒƒ์„ ์ง€์นญ
  • Push:

    • ์ž‘์—… ์ค‘์ธ ๋กœ์ปฌ ๋ณต์‚ฌ๋ณธ (Local Repo)์—์„œ ์„œ๋ฒ„(Remote Repo)๋กœ ๋ณ€๊ฒฝ์‚ฌํ•ญ๋“ค์„ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์„
      ์ง€์นญ
  • Merge:

    • Pull์ด๋‚˜ Pushํ–ˆ์„ ๊ฒฝ์šฐ ๋‘ Branch(๋Œ€๋ถ€๋ถ„ ์ด ์ค‘ ํ•˜๋‚˜๋Š” Master)๊ฐ„์˜ ์ถฉ๋Œ(Conflict)์„

๐Ÿ“Œ ๋ฉ”์ธ/๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜

  • Github์—์„œ๋Š” ์ด์ „์— master๋ผ ๋ถˆ๋ €๊ณ  ์ง€๊ธˆ์€ main์ด๋ผ ๋ถ€๋ฅด๋Š” source of
    truth๊ฐ€ ๋˜๋Š” ํŠน๋ณ„ํ•œ branch

  • ํŠน์ •ํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ mainline์˜ ๋ณต์‚ฌ๋ณธ. ๊ตฌํ˜„๊ณผ ํ…Œ์ŠคํŠธ๊ฐ€
    ์ด๋ค„์ง„ ํ›„์— main branch์™€ ๋จธ์ง€๋จ


๐Ÿ“Œ ์ „์ฒดํ”Œ๋กœ์šฐ


๐Ÿ“Œ Push๋‚˜ Merge ์‹œ์ ์ด CI/CD๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ ˆํ˜ธ์˜ ์ˆœ๊ฐ„

  • ์ฝ”๋“œ๊ฐ€ ๋ฉ”์ธ/๋งˆ์Šคํ„ฐ๋‚˜ ๋ธŒ๋žœ์น˜์— ์ถ”๊ฐ€๋˜๋Š” ์ˆœ๊ฐ„ CI/CD๋ฅผ ํŠธ๋ฆฌ๊ฑฐ
    • ์ด๋ฅผ ํŠน์ • ๋ฉ”์ธ/๋งˆ์Šคํ„ฐ๋‚˜ ํŠน์ • ๋ธŒ๋žœ์น˜๋งŒ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋„๋ก ์„ค์ • ๊ฐ€๋Šฅ
    • ์ด ๋•Œ ํ…Œ์ŠคํŠธ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ตœ์ข…์ ์œผ๋กœ Docker Image๋“ฑ์„ ๋งŒ๋“ค๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅ
    • ๊ทธ๋ž˜์„œ CI/CD๋Š” Github์— ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ž์—ฐ์Šค๋Ÿฌ์›€
  • Github์—์„œ๋Š” ์ด๋ฅผ Actions๋ผ๋Š” ๊ธฐ๋Šฅ์„ ํ†ตํ•ด Workflow๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅ

๐Ÿ“Œ ์†Œํ”„ํŠธ์›จ์–ด ๋นŒ๋“œ๋ž€?

  • ์ž์‹ (ํ˜น์€ ํŒ€)์ด ๊ฐœ๋ฐœํ•œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ตœ์ข…์ ์œผ๋กœ ์ถœ์‹œํ•˜๊ธฐ ์œ„ํ•œ ํ˜•ํƒœ๋กœ
    ๋งŒ๋“œ๋Š” ๊ฒƒ
    • ํ…Œ์ŠคํŠธ๊ฐ€ ๋นŒ๋“œ์˜ ์ค‘์š”ํ•œ ์ผ๋ถ€๋กœ ํฌํ•จ
  • ์ฐธ์—ฌ ๊ฐœ๋ฐœ์ž๋“ค์ด ๋งŽ์„์ˆ˜๋ก ์ด๋Š” ๋” ์ค‘์š”
  • ๊ฐœ๋ฐœ์ด ๋๋‚˜๊ธฐ ์ „๋ถ€ํ„ฐ ๋นŒ๋“œ๋ฅผ ํ•˜๋ฉด ์†Œํ”„ํŠธ์›จ์–ด์˜ ์•ˆ์ •์„ฑ ์ฆ๋Œ€
    • Continuous Integration!

๐Ÿ“Œ Continuous Integration์ด๋ž€?

  • Software Engineering Practice์˜ ํ•˜๋‚˜
  • ๊ธฐ๋ณธ ์›์น™
    • ์ฝ”๋“œ Repo๋Š” ํ•˜๋‚˜๋งŒ ์œ ์ง€ (Master)
    • ์ฝ”๋“œ๋ณ€๊ฒฝ์„ ์ตœ๋Œ€ํ•œ ์ž์ฃผ ๋ฐ˜์˜
    • ํ…Œ์ŠคํŠธ๋ฅผ ์ตœ๋Œ€ํ•œ ์ถ”๊ฐ€
      • Test Coverage
    • ๋นŒ๋“œ๋ฅผ ๊ณ„์†์ ์œผ๋กœ ์ˆ˜ํ–‰ (์ž๋™ํ™”)
      • Commit Build vs. Nightly Build
    • ์„ฑ๊ณตํ•œ ๋นŒ๋“œ์˜ ํ”„๋กœ๋•์…˜ ๋ฆด๋ฆฌ์Šค (์ž๋™ํ™”)
      • CD: Continuous Delivery

๐Ÿ“Œ ๋นŒ๋“œ ์‹คํŒจ!

  • ์ƒˆ ์ฝ”๋“œ์˜ ์ปค๋ฐ‹์œผ๋กœ ์ธํ•ด ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ

  • ๋งŽ์€ ํšŒ์‚ฌ๋“ค์ด ๋นŒ๋“œ ์‹คํŒจ์‹œ ๋นŒ๋“œ๊ฐ€ ๋‹ค์‹œ ์„ฑ๊ณตํ• ๋•Œ๊นŒ์ง€ ์ฝ”๋“œ ๋ณ€๊ฒฝ์„ ๊ธˆ์ง€

    • ์ฆ‰ ๋นŒ๋“œ ์‹คํŒจ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์„ ์žก์•„๋‘๋Š” ์กฑ์‡„

    • ๊ทธ๋ž˜์„œ ์–ด๋А ์ •๋„ ์กฐ์ง์ด ์ปค์ง€๋ฉด ๋นŒ๋“œ๋งŒ ์ „๋‹ดํ•˜๋Š” ์—”์ง€๋‹ˆ์–ด๊ฐ€ ์ƒ๊น€

      • ์ด ์‚ฌ๋žŒ์˜ ์—…๋ฌด ์ค‘์˜ ํ•˜๋‚˜๋Š” ๋นŒ๋“œ ์‹คํŒจ์‹œ ๋ˆ„๊ฐ€ ์ฃผ๋ฒ”์ธ์ง€ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ โ˜บ
    • ๋นŒ๋“œ์‹คํŒจ์‹œ ๊ฐ€๋ฒผ์šด ํ˜•ํƒœ๋กœ ํŽ˜๋„ํ‹ฐ ๋ถ€์—ฌ


๐Ÿ“Œ CI/CD๋ž€?


๐Ÿ“Œ Github Actions์ด๋ž€?

  • CI/CD๋ฅผ Github์œ„์—์„œ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์„œ๋น„์Šค
    • ์ฝ”๋“œ ํ…Œ์ŠคํŠธ, ๋นŒ๋“œ, ๋ฐฐํฌ ์ž๋™ํ™” ๊ธฐ๋Šฅ ์ œ๊ณต
  • Workflow๋ผ ๋ถ€๋ฅด๋ฉฐ ์•„๋ž˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌ์„ฑ
    • Events
    • Jobs
    • Actions
    • Runner
      - Github hosted runners
      - Self hosted runners

๐Ÿ“Œ Github Actions - Workflow

  • Workflow๋Š” ํŠธ๋ฆฌ๊ฑฐ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์‹œ์ž‘๋˜๋Š” ์ผ๋ จ์˜ ๋™์ž‘๋“ค์„ ์ง€์นญ

  • ํŠธ๋ฆฌ๊ฑฐ ์ด๋ฒคํŠธ์˜ ์˜ˆ๋“ค์€?

    • ์ฝ”๋“œ ์ปค๋ฐ‹ (main๊ณผ ๊ฐ™์€ ํŠน์ • ๋ธŒ๋žœ์น˜๋ฅผ ๋Œ€์ƒ์œผ๋กœ๋งŒ ์ œํ•œ ๊ฐ€๋Šฅ)
    • PR ์ƒ์„ฑ
    • ๋‹ค๋ฅธ Workflow์˜ ์„ฑ๊ณต์ ์ธ ์‹คํ–‰
  • Workflow๋ฅผ ์œ„ํ•œ ๋ช…๋ น์–ด๋“ค์€ YAML ํŒŒ์ผ๋กœ ์ €์žฅ

    • ๋ช…๋ น์–ด๋“ค๋กœ๋Š” ํ™˜๊ฒฝ์„ค์ •๊ณผ scripts ์‹คํ–‰๋“ค์ด ๋Œ€ํ‘œ์ 
  • Workflow๋Š” Job๋“ค๋กœ ๋‚˜๋ˆ ์ง€๋ฉฐ ๊ฐ Job์€ ์ผ๋ จ์˜ ์Šคํ…์„ ์ˆ˜ํ–‰

    • ๊ฐ ์Šคํ…์€ ํ•˜๋‚˜ ํ˜น์€ ๊ทธ ์ด์ƒ์˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰
      • ์ด ๋ช…๋ น์–ด๋Š” actions๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๋ช…๋ น์–ด๋“ค์˜ ์ง‘ํ•ฉ์ด ๋  ์ˆ˜๋„ ์žˆ์Œ
    • ๊ฐ ์Šคํ…์€ ์œˆ๋„์šฐ๋‚˜ ๋ฆฌ๋ˆ…์Šค ์„œ๋ฒ„ ์œ„์—์„œ runner์— ์˜ํ•ด ์‹คํ–‰
      • ์ด๊ฑธ Docker Image์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์„œ๋น„์Šค ๋ฐฐํฌ ๊ณผ์ •์— ๋”ฐ๋ผ ๋” ์ผ๋ฐ˜์ ์ด๊ธฐ๋„ ํ•จ

๐Ÿ“Œ Github์—์„œ ์–ด๋–ป๊ฒŒ Github Actions๋ฅผ ์„ ํƒํ•˜๋Š”๊ฐ€?

  • ์ ์šฉํ•˜๋ ค๋Š” repo์— ๋ณด๋ฉด Actions ๋ฉ”๋‰ด๊ฐ€ ์žˆ์Œ
  • ๋‹ค์Œ์œผ๋กœ workflow๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑ
  • yml ํŒŒ์ผ์„ ์ง์ ‘ ์ƒ์„ฑ ํ˜น์€ ํ…œํ”Œ๋ฆฟ(CI Templates) ์„ ํƒ ํ›„ ์ˆ˜์ •
    • Python Application ํ˜น์€ Docker Image

0๊ฐœ์˜ ๋Œ“๊ธ€