JUST DO IT!

Python unittest๋ฅผ Github Actions ๊ธฐ๋Šฅ์œผ๋กœ CI/CD ๊ตฌํ˜„ํ•˜๊ธฐ(with Docker) - TIL230613 ๋ณธ๋ฌธ

TIL

Python unittest๋ฅผ Github Actions ๊ธฐ๋Šฅ์œผ๋กœ CI/CD ๊ตฌํ˜„ํ•˜๊ธฐ(with Docker) - TIL230613

sunhokimDev 2023. 6. 14. 22:45

๐Ÿ“š KDT WEEK 11 DAY 2 TIL

  • CI/CD
  • Git
  • Github Actions
  • Actions ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ Python CI/CD ๊ตฌํ˜„

๐ŸŸฅ CI/CD

์†Œํ”„ํŠธ์›จ์–ด ๋นŒ๋“œ : ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ตœ์ข…์ ์œผ๋กœ ์ถœ์‹œํ•˜๊ธฐ ์œ„ํ•œ ํ˜•ํƒœ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ

Continuous Intergration(CI) : ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ๊ณ ์น  ๋•Œ๋งˆ๋‹ค ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ๋ ค๋ด„์œผ๋กœ์จ ์•ˆ์ •์„ฑ์„ ์ฆ๋Œ€์‹œํ‚ด

Continuous Delivery(CD) : ์„ฑ๊ณตํ•œ ๋นŒ๋“œ์˜ ํ”„๋กœ๋•์…˜ ๋ฆด๋ฆฌ์Šค (์ž๋™ํ™”)

 

์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ โžก๏ธ Code Commit โžก๏ธ CI(ํ…Œ์ŠคํŠธ ์ˆ˜ํ–‰) โžก๏ธ CD(์†Œํ”„ํŠธ์›จ์–ด ๋ฐฐํฌ)๊ฐ€ ๋ฐ˜๋ณต๋˜๋Š” ๊ตฌ์กฐ

 

๐ŸŸฆ Git

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

SVN/CVS(๋‹ค๋ฅธ ์†Œํ”„ํŠธ์›จ์–ด ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ)์— ๋น„ํ•ด ํ˜„์ €ํ•˜๊ฒŒ ๋น ๋ฅด์ง€๋งŒ ์‚ฌ์šฉ๋ฒ•์€ ํ›จ์”ฌ ๋” ๋ณต์žกํ•˜๋‹ค.

 

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

 

๐ŸŒ Github

http://github.com 

 

GitHub: Let’s build from here

GitHub is where over 100 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and fea...

github.com

Git repo ํ˜ธ์ŠคํŒ…/ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค

  • Private repo ์ˆ˜์— ๋”ฐ๋ผ ๊ฐ€๊ฒฉ๋Œ€๊ฐ€ ๊ฒฐ์ •๋˜๋ฉฐ, public๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ฌด๋ฃŒ์ด๋‹ค.
  • Copilot(์ฝ”๋“œ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ ์ฆ๋Œ€), Workflows(CI/CD), Issues(๋ฌธ์„œํ™”) ๋“ฑ ๋‹ค์–‘ํ•œ ํˆด์„ ์ œ๊ณตํ•œ๋‹ค.

 

๐Ÿ†Ž Git ๊ด€๋ จ ์šฉ์–ด

 

  • Repo : Repository์˜ ์ค€๋ง๋กœ Git์œผ๋กœ ๊ด€๋ฆฌ๋˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง€์นญ
  • Master/Main : ํ•œ Repo์—์„œ ๊ธฐ๋ณธ์ด ๋˜๋Š” ๋ฉ”์ธ ์ฝ”๋“œ๋ฅผ ์ง€์นญ, ์š”์ฆ˜์€ ๊ฑฐ์˜ main์œผ๋กœ ์“ด๋‹ค.
  • Branch : Repo์—์„œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ๋ฉ”์ธ ์ฝ”๋“œ๋กœ๋ถ€ํ„ฐ ๋งŒ๋“  ์ƒˆ๋กœ์šด ์ฝ”๋“œ ์ž‘์—…๋ณธ์„ ์ง€์นญํ•œ๋‹ค.
  • Clone : ๋‹ค๋ฅธ ๊ณ„์ •์˜ repo๋ฅผ ์ƒˆ๋กœ์šด local repository๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ
  • Commit : ๋‚ด๊ฐ€ ๋งŒ๋“  ์ฝ”๋“œ ๋ณ€๊ฒฝ์„ Branch์˜ Local Repository์— ๋ฐ˜์˜ํ•˜๋Š” ๊ฒƒ
  • Pull : ์—ฐ๊ฒฐ๋œ Repo๋กœ๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ Pull ์ดํ›„ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์„ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค๋Š” ์ž‘์—…, ์„œ๋ฒ„์˜ Repo์™€ ๋™์ผํ•˜๊ฒŒ ์”ฝํฌํ•œ๋‹ค.
  • Push : ์ž‘์—… ์ค‘์ธ ๋กœ์ปฌ ๋ณต์‚ฌ๋ณธ์—์„œ ์„œ๋ฒ„๋กœ ๋ณ€๊ฒฝ์‚ฌํ•ญ๋“ค์„ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ
  • Merge : Pull์ด๋‚˜ Pushํ–ˆ์„ ๊ฒฝ์šฐ ๋‘ Branch๊ฐ„์˜ ์ถฉ๋Œ(Conflict)์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •, ๋ณ‘ํ•ฉ๋˜๋Š” ๊ณผ์ •.

 

Github Branch Flow

 

Git์—์„œ๋Š” ๋‘ Branch๋ฅผ Mergeํ•˜๋Š” ๊ณผ์ •์—์„œ ์ƒˆ๋กœ์šด ์ฝ”๋“œ๊ฐ€ ์‚ฝ์ž…๋  ๊ฒƒ์ด๋‹ค.

์ด ์ƒˆ๋กœ์šด ์ฝ”๋“œ๋ฅผ ๋„ฃ๊ณ ๋‚˜์„œ๋„ ๋ณธ๋ž˜์˜ ๊ธฐ๋Šฅ๊ณผ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ž˜ ์ž‘๋™ํ•˜๋Š” ์ง€ ํ…Œ์ŠคํŠธํ•ด๋ณด๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•  ๊ฒƒ์ด๊ณ ,

์ด๋Ÿฌํ•œ ๊ณผ์ •(์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ , ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •)์„ ์œ„์—์„œ ์„ค๋ช…ํ–ˆ๋˜ CI/CD๋ผ๊ณ  ํ•œ๋‹ค.

 

๋”ฐ๋ผ์„œ Github์—์„œ๋Š” ์ฝ”๋“œ๊ฐ€ ํŠน์ • ๋ธŒ๋žœ์น˜์— ์ถ”๊ฐ€๋˜๋Š” ์ˆœ๊ฐ„ CI/CD๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•  ์ˆ˜ ์žˆ๋„๋ก Actions๋ผ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค!

 

๐ŸŸฉ Github Actions

Github์œ„์—์„œ CI/CD๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์„œ๋น„์Šค

Actions ๊ธฐ๋Šฅ์€ Repo๊ฐ€ Public์ด๋ฉด ๋ฌด๋ฃŒ์ง€๋งŒ, Private์€ ํŠน์ • ๊ธฐ์ค€์— ๋”ฐ๋ผ ์œ ๋ฃŒ๋กœ ์ œ๊ณต๋˜๊ณ  ์žˆ๋‹ค.

 

๐ŸŒŠ Workflow

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

ํŠธ๋ฆฌ๊ฑฐ ์ด๋ฒคํŠธ๋Š” ์ฝ”๋“œ ์ปค๋ฐ‹, Pull Request, ๋‹ค๋ฅธ Workflow์˜ ์‹คํ–‰ ๋“ฑ์œผ๋กœ ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Workfow๋ฅผ ์œ„ํ•œ ๋ช…๋ น์–ด(ํ™˜๊ฒฝ์„ค์ •์ด๋‚˜ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ๋“ฑ)๋“ค์€ YAML ํŒŒ์ผ๋กœ ์ €์žฅํ•œ๋‹ค.

YAML์€ JSON๊ณผ ํ˜•ํƒœ๊ฐ€ ๋น„์Šทํ•œ ํ™˜๊ฒฝ์„ค์ •์„ ๋‹ด์•„๋‘” format์ด๋‹ค.

Workflow๋Š” ํ•˜๋‚˜์˜ repo์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ Workflow๋กœ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๐ŸŸจ Actions ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ Python CI/CD ๊ตฌํ˜„

Python์˜ unittest ๋ชจ๋“ˆ์„ ์ด์šฉํ•œ test๋ฅผ Github Actions ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ CI/CD๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด๋Š” ์‹ค์Šต์„ ์ง„ํ–‰ํ•œ๋‹ค.

โŒจ๏ธ ๋ฉ”์ธ ์ฝ”๋“œ ์†Œ๊ฐœ

๋จผ์ €, CI/CD๊ฐ€ ์ ์šฉ๋  ๋ฉ”์ธ ์ฝ”๋“œ๋ฅผ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค.

 

Python์œผ๋กœ hangman ๊ฒŒ์ž„์„ ๊ตฌํ˜„ํ•˜๊ณ , flask๋ฅผ ์ด์šฉํ•ด ๊ฐ„๋‹จํ•œ ์›น UI๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

 

  • app.py : flask์˜ ๋ฉ”์ธ ํ•จ์ˆ˜๊ฐ€ ์กด์žฌ, ์ปค๋งจ๋“œ๋ผ์ธ์œผ๋กœ ๋ฐ›์€ ํฌํŠธ์— ๋ฐ”์ธ๋“œํ•˜๊ณ  ์š”์ฒญ์ด ๋“ค์–ด์˜ค๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
  • requirements.txt : flask ๋ชจ๋“ˆ๋“ค์„ ์„ค์น˜ํ•˜๋Š”๋ฐ ํ™œ์šฉ, flask์™€ ๊ด€๋ จ๋œ 4๊ฐœ์˜ ๋ชจ๋“ˆ๋“ค ํฌํ•จ
  • test.py : app.py์— ์žˆ๋Š” ์ฝ”๋“œ์˜ ์œ ๋‹› ํ…Œ์ŠคํŠธ ๋กœ์ง์ด ๋“ค์–ด๊ฐ€์žˆ๋‹ค. CI/CD ๊ตฌ์„ฑ์‹œ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์˜ˆ์ •

Python ํ…Œ์ŠคํŠธ ๋ชจ๋“ˆ๋กœ๋Š” pytest๊ฐ€ ์•„๋‹Œ unittest๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

์ด ๋ถ€๋ถ„๋•Œ๋ฌธ์— ์•„๋ž˜์—์„œ ์‹ค์Šตํ•˜๋ฉด์„œ ๋ณ€๊ฒฝํ•ด์•ผํ•  ๋ถ€๋ถ„์ด ์กฐ๊ธˆ ์žˆ๋‹ค.

์ถ”๊ฐ€๋กœ, Repo์—๋Š” dockerization์„ ์œ„ํ•œ Dockerfile๋„ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. ์ด๊ฒƒ๋„ CI/CD์—์„œ ์ถ”๊ฐ€๋กœ ๊ตฌํ˜„ํ•ด๋ณผ ๊ฒƒ์ด๋‹ค.

 

1. Github Actions ๊ธฐ๋Šฅ์œผ๋กœ CI ๊ตฌํ˜„ํ•˜๊ธฐ

 

CI/CD๋ฅผ ๊ตฌํ˜„ํ•  repo๋กœ ๋“ค์–ด๊ฐ€์„œ, ์ƒ๋‹จ ํƒญ์˜ Actions(์•„๋ž˜ ์ด๋ฏธ์ง€์˜ ๋นจ๊ฐ„ ๋ฐ•์Šค)๋ฅผ ํด๋ฆญํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Python application์˜ Configure ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์ž.

๋งŒ์•ฝ Python application์ด ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ฒ€์ƒ‰์œผ๋กœ ์ฐพ์œผ๋ฉด ๋‚˜์˜จ๋‹ค.

 

๋นจ๊ฐ„ ๋ฐ•์Šค๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋œ๋‹ค.

 

๊ทธ๋Ÿฌ๋ฉด, ์•„๋ž˜ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ python-app.yml ์„ ์ƒ์„ฑํ•˜๋Š” ํ™”๋ฉด์œผ๋กœ ๋„˜์–ด์˜ค๊ฒŒ ๋œ๋‹ค.

 

python-app.yml์€ ํ•ด๋‹น repo์— .github/workflows/ ํด๋” ๋ฐ‘์œผ๋กœ ์ถ”๊ฐ€๋œ๋‹ค.

 

ํŒŒ๋ž€ ๋ฐ•์Šค๋ฅผ ๋ณด๋ฉด, ์–ด๋–ค ํŠน์ • ๋ธŒ๋Ÿฐ์น˜์˜ push๋‚˜ pull_request (ํŠน์ • ์ด๋ฒคํŠธ)์— ๋ฐ˜์‘ํ•  ๊ฒƒ์ธ์ง€ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

on: ๋ฐ‘์œผ๋กœ ํŠธ๋ฆฌ๊ฑฐ ์ด๋ฒคํŠธ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ณ , push: , pull_request: ๋Š” ํŠน์ • ์ด๋ฒคํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

๋งŒ์•ฝ ๋ชจ๋“  ๋ธŒ๋žœ์น˜์— ์ ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ["main", "dev"] ์ฒ˜๋Ÿผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ๋ฐ‘์œผ๋กœ jobs: ๋Š” ์‹ค์ œ CI ํ”„๋กœ์„ธ์Šค๊ฐ€ ์Šคํ…(name)๋ณ„๋กœ ๊ธฐ์ˆ ๋œ๋‹ค.

์ด ๋ถ€๋ถ„์—์„œ pytest๊ฐ€ ์•„๋‹Œ unittest ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ–ˆ์œผ๋ฏ€๋กœ ์กฐ๊ธˆ์˜ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค.

 

 

์ˆ˜์ • ์ „

 

์ฐธ๊ณ ๋กœ flake8์€ ์ฝ”๋“œ ์Šคํƒ€์ผ๊ณผ ๋ฌธ๋ฒ•์„ ์ฒดํฌํ•˜๋Š” ๋ชจ๋“ˆ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

 

๋นจ๊ฐ„ ๋ฐ‘์ค„ ๋ถ€๋ถ„์˜ pytest๋ฅผ ์ง€์šด๋‹ค.

 

์ฒซ ๋ฒˆ์งธ ํŒŒ๋ž€์ค„์˜ pytest --> unittest ๋กœ ๋ฐ”๊พธ๊ณ ,

๋‘ ๋ฒˆ์งธ ํŒŒ๋ž€์ค„์˜ pytest --> python -m unittest discover -p 'test*.py' ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๋‘ ๋ฒˆ์งธ ํŒŒ๋ž€์ค„์˜ ๊ฒฝ์šฐ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์„œ๋ธŒ ๋””๋ ‰ํ† ๋ฆฌ๊นŒ์ง€ test๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  python ํŒŒ์ผ์„ unittest ํ•˜๋ผ๋Š” ๋ช…๋ น์–ด์ด๋‹ค.

 

์ˆ˜์ • ํ›„์—๋Š” ์ด๋Ÿฌํ•œ ํ˜•ํƒœ๊ฐ€ ๋‚˜์™€์•ผํ•œ๋‹ค.

 

์ˆ˜์ • ํ›„

 

์ด์ œ CI๊ฐ€ ์ œ๋Œ€๋กœ ๊ตฌ๋™๋˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž.

๋‚˜๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ README ํŒŒ์ผ์„ ๊ณ ์ณ์„œ main ๋ธŒ๋žœ์น˜์— push ํ•ด๋ณด์•˜๋‹ค.

๊ทธ๋ฆฌ๊ณ  Repo๋กœ ๋Œ์•„๊ฐ€๋ฉด, ์•„๋ž˜ ์ด๋ฏธ์ง€ ๋นจ๊ฐ„ ๋ฐ•์Šค ์•ˆ์— now๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

now๋ฅผ ๋ˆŒ๋Ÿฌ๋ณด๋ฉด, ๋งŒ๋“ค์—ˆ๋˜ Python application์ด ๊ตฌ๋™๋˜๊ณ  ์žˆ๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์•„์ง ์ง„ํ–‰ ์ค‘์ธ ์ƒํƒœ๋กœ ๋ณด์ธ๋‹ค.

 

์—ฌ๊ธฐ์„œ Details ๋ฅผ ํด๋ฆญํ•ด๋ณด๋ฉด ์ง„ํ–‰๋œ Actions๋ฅผ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์•„๋ž˜ ์ด๋ฏธ์ง€์˜ ๊ฒฝ์šฐ ์ง„ํ–‰์ด ์™„๋ฃŒ๋˜์–ด ํ…Œ์ŠคํŠธ์˜ ๊ฒฐ๊ณผ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‚˜์™”๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

flake8๊ณผ unittest ๋ชจ๋‘ ์•„๋ฌด ๋ฌธ์ œ์—†์ด ์„ฑ๊ณตํ•œ ๋ชจ์Šต์ด๋‹ค!

 

์„ฑ๊ณต์ ์œผ๋กœ CI๊ฐ€ ์ง„ํ–‰๋˜์—ˆ๋‹ค!

 

2. Github Actions ๊ธฐ๋Šฅ์œผ๋กœ CD ๊ตฌํ˜„ํ•˜๊ธฐ(with Docker)

์ฝ”๋“œ๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •์„ Actions๋กœ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ, Docker hub์— Docker Image๋ฅผ ์˜ฌ๋ฆฌ๋Š” ํ˜•ํƒœ๋กœ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

 

์ด ๊ณผ์ •์—๋Š” Docker hub์— ๋Œ€ํ•œ ์กฐ๊ธˆ์˜ ๋ช…๋ น์–ด์™€ Docker hub ๊ณ„์ •์ด ํ•„์š”ํ•˜๋‹ค.

Docker hub์— ๊ณ„์ •์„ ๋งŒ๋“ค๊ณ  Docker Image๋ฅผ ์˜ฌ๋ฆฌ๋Š” ๊ณผ์ •์€ ์ด์ „๊ธ€์—์„œ ์—ด์‹ฌํžˆ ์‹ค์Šตํ•ด๋ดค์œผ๋‹ˆ ๊ด€๋ จ ๋‚ด์šฉ์€ ๋ชจ๋‘ ์Šคํ‚ต!

https://sunhokimdev.tistory.com/45

 

๊ฐ„๋‹จํ•œ Docker ์ด๋ฏธ์ง€ ๋งŒ๋“ค์–ด์„œ Docker hub์— ๋„ฃ๊ณ  ์‹ค์Šตํ•ด๋ณด๊ธฐ - TIL230612

๐Ÿ“š KDT WEEK 11 DAY 1 TIL Docker ์‹ค์Šต ๋ฆฌ๋ˆ…์Šค ์šฐ๋ถ„ํˆฌ MySQL Airflow ์ธก๋ฉด์—์„œ ๋ฐ”๋ผ๋ณด๋Š” Docker ๋”๋ณด๊ธฐ Airflow ์šด์˜์ƒ์˜ ์–ด๋ ค์›€ DAG์˜ ์ˆ˜๊ฐ€ ๋งŽ์•„์ง€๋ฉด ๋ฐ์ดํ„ฐ ํ’ˆ์งˆ์ด๋‚˜ ๋ฐ์ดํ„ฐ ๋ฆฌ๋‹ˆ์ง€ ์ด์Šˆ ๋“ฑ ์™ธ์—๋„ ๋‹ค๋ฅธ๋„ ๋ฐœ์ƒ

sunhokimdev.tistory.com

 

CD ๊ตฌํ˜„์„ ์œ„ํ•œ Workflow๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด Actions ํƒญ์— ๋“ค์–ด๊ฐ„๋‹ค.

์•„๋ž˜ ์ด๋ฏธ์ง€ ๋นจ๊ฐ„ ๋ฐ•์Šค์˜ New workflow ๋ฒ„ํŠผ์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด Workflow๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋œ๋‹ค.

 

๋นจ๊ฐ„ ๋ฐ•์Šค์˜ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ๋‹ค.

 

์•„๋ž˜ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ Docker Image๋ฅผ ์ฐพ์•„์„œ Configure ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ๋‹ค.

 

Docker Image๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋ฉด ๊ฒ€์ƒ‰์œผ๋กœ ์ฐพ์•„๋ณด์ž.

 

Configure ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €๋‹ค๋ฉด ์•„๊นŒ์ฒ˜๋Ÿผ yml ํŒŒ์ผ์ด ํ•˜๋‚˜ ์ƒ์„ฑ๋˜์–ด ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋Š” ํ™”๋ฉด์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ Docker hub์— ๋กœ๊ทธ์ธํ•˜๊ณ , docker build ๋ฐ push ์ปค๋งจ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ Docker hub์— image๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์จ์•ผํ•œ๋‹ค.

 

์•„๋ž˜๋Š” ํŽธ์ง‘ํ•œ ๋‚ด์šฉ์ด๋‹ค.

 

ํŽธ์ง‘๋œ docker-image.yml

 

๋นจ๊ฐ„ ๋ฐ•์Šค์˜ ๋‚ด์šฉ์— ๋‚ด Docker hub์˜ ๊ณ„์ •๋‚ด์šฉ์ด ๋“ค์–ด๊ฐ„๋‹ค.

DOCKER_USER์™€ DOCKER_PASSWORD๋ฅผ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•ด์„œ ๋‚ด ๊ณ„์ •์ •๋ณด๋ฅผ ๊ธฐ์ž…ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ,

์—ฌ๊ธฐ์„œ ํ•˜๋“œ์ฝ”๋”ฉ์œผ๋กœ ๋‚ด ๊ณ„์ •์ •๋ณด๋ฅผ ์ง์ ‘ ์ž…๋ ฅํ•œ๋‹ค๋ฉด ๋ณด์•ˆ์„ ์ƒ๊ฐํ–ˆ์„ ๋•Œ ๊ต‰์žฅํžˆ ์œ„ํ—˜ํ•œ ๋ฐฉ๋ฒ•์ด ๋  ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Github์—์„œ๋Š” ์ด๋ฅผ ์•”ํ˜ธํ™”ํ•ด์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ณด์•ˆ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

์ด ๋ณด์•ˆ ๊ธฐ๋Šฅ์— Dockerhub ๊ณ„์ •์„ DOCKER_USER ์™€ DOCKER_PASSWORD ์ด๋ฆ„์œผ๋กœ ์ €์žฅํ•œ ๋’ค,

์œ„ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ${{secrets.์ด๋ฆ„}} ํ˜•ํƒœ๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์€ yml ํŒŒ์ผ์„ ํŽธ์ง‘ํ•œ ๋’ค์— ๊ตฌํ˜„ํ•  ์˜ˆ์ •์ด๋ฏ€๋กœ ์ผ๋‹จ ์œ„ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ์ž‘์„ฑํ•ด๋‘์ž.

 

+ DOCKER_USER์™€ DOCKER_PASSWORD ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํŒŒ๋ž€ ๋ฐ‘์ค„์˜ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•ด๋ณด์ž

+ ์ด์™ธ์˜ ๋ช…๋ น์–ด์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์ด์ „๊ธ€์—์„œ ์„ค๋ช…ํ–ˆ์œผ๋‹ˆ ํŒจ์Šคํ•˜๊ฒ ๋‹ค..

 

์ž‘์„ฑ์ด ์™„๋ฃŒ๋˜๋ฉด ์ปค๋ฐ‹ํ•ด์„œ Repo์— ์ถ”๊ฐ€ํ•˜๋„๋ก ํ•˜์ž.

๊ทธ๋ฆฌ๊ณ  Repo๋กœ ๋Œ์•„์™€์„œ ์•„๋ž˜ ์ด๋ฏธ์ง€์˜ ๋นจ๊ฐ„ ๋ฐ•์Šค ์ˆœ์„œ๋Œ€๋กœ ํด๋ฆญํ•ด์„œ Docker hub ๊ณ„์ •์ •๋ณด๋ฅผ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค.

 

New repository secret ๋ฒ„ํŠผ์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค.

 

์•„๊นŒ yml ํŒŒ์ผ์—์„œ DOCKER_USER ์™€ DOCKER_PASSWORD ํ˜•ํƒœ๋กœ ๋ถˆ๋Ÿฌ์™”์œผ๋‹ˆ ๊ทธ๋Œ€๋กœ ์ €์žฅํ•ด์ค€๋‹ค.

 

๋‚ด Docker hub ๊ณ„์ •์ •๋ณด๊ฐ€ ์ €์žฅ๋˜์—ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  CI/CD๊ฐ€ ์ž˜ ๋™์ž‘ํ•˜๋Š”์ง€ ์•„๋ฌด ๋‚ด์šฉ์ด๋‚˜ ์ปค๋ฐ‹ํ•ด๋ณด๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ–ˆ๋‹ค.

 

CD ๊ณผ์ •๋„ ๋ฌธ์ œ ์—†์—ˆ๋‹ค.

 

Docker hub์—๋„ ์ž˜ ์ด๋ฏธ์ง€๊ฐ€ ๋“ฑ๋ก๋˜์—ˆ๋‹ค!