๋ฐ˜์‘ํ˜•


๐ŸŽฏ 

Github Actions๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.


โœ… Github Actions

์†Œํ”„ํŠธ์›จ์–ด workflow๋ฅผ ์ž๋™ํ™” ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋„๊ตฌ

 

ex)
1. ๋‚ด๊ฐ€ github์— ์ฝ”๋“œ๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ํŠน์ • ์ˆ˜ํ–‰์„ ํ•˜๋„๋ก ํ•˜๊ณ  ์‹ถ๋‹ค.

2. ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ–ˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค. (๋‚ ์”จ, ๋‰ด์Šค ํฌ๋กค๋ง ๋“ฑ)

 

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

 

์ด๋ ‡๊ฒŒ ์†Œํ”„ํŠธ์›จ์–ด ํ”„๋กœ์ ํŠธ์—์„œ ์ง€์†์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋Š” ๋ฐ˜๋ณต ์ž‘์—…๋“ค์„ ์—…๊ณ„์—์„œ๋Š” ์†Œ์œ„ CI/CD๋ผ๊ณ  ๋งŽ์ด ์ค„์—ฌ์„œ ๋ถ€๋ฅด๋Š”๋ฐ ์‚ฌ๋žŒ์ด ๋งค๋ฒˆ ์ง์ ‘ ํ•˜๊ธฐ์—๋Š” ๋น„ํšจ์œจ์ ์ธ๋ฐ๋‹ค๊ฐ€ ์‹ค์ˆ˜ํ•  ์œ„ํ—˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— GitHub Actions๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค๋กœ ์ž๋™ํ™”์‹œํ‚ค๋Š” ๊ฒƒ์ด ์œ ๋ฆฌํ•˜๋‹ค.

 

GitHub Actions๋Š” ๊ธฐ์กด CI/CD ์„œ๋น„์Šค ๋Œ€๋น„ ๊ฐ„ํŽธํ•œ ์„ค์ •๊ณผ ๋†’์€ ์ ‘๊ทผ์„ฑ์œผ๋กœ ํŠนํžˆ ๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์—์„œ ๋งŽ์€ ํ˜ธ์‘์„ ์–ป๊ณ  ์žˆ๋Š”๋ฐ ์˜ˆ์ „์—๋Š” CI/CD๊ฐ€ DevOps ์—”์ง€๋‹ˆ์–ด์˜ ์ „์œ ๋ฌผ๋กœ๋งŒ ์—ฌ๊ฒจ์ง€๊ณค ํ–ˆ์—ˆ๋Š”๋ฐ ์ตœ๊ทผ์—๋Š” GitHub Actions์„ ํ†ตํ•ด์„œ ์ผ๋ฐ˜ ๊ฐœ๋ฐœ์ž๋“ค๋„ ์–ด๋ ต์ง€ ์•Š๊ฒŒ CI/CD ์„ค์ •์„ ์Šค์Šค๋กœ ํ•˜๊ธฐ ์‰ฌ์›Œ์กŒ๋‹ค.

์ด๋ ‡๋“ฏ ์ „์„ธ๊ณ„์— ๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ด๋ฏธ GitHub ๊ณ„์ •์ด ์žˆ๋‹ค๊ณ  ํ•ด๋„ ๊ณผ์–ธ์ด ์•„๋‹Œ ์œ ๋ฆฌํ•œ ์ƒํ™ฉ์—์„œ, GitHub๊ฐ€ Microsoft์— ์ธ์ˆ˜๋œ ์ดํ›„ ์•ผ์‹ฌ์ฐจ๊ฒŒ ์ถœ์‹œํ•œ GitHub Actions์€ Jenkins, Circle CI, Travis CI์™€ ๊ฐ™์€ ๊ธฐ์กด์— ์œ ์ˆ˜์˜ ์„œ๋น„์Šค๊นŒ์ง€๋„ ์œ„ํ˜‘ํ•˜๋Š” ์ค‘์ด๋‹ค.



โœ… Github Actions Example

  • ์ฝ”๋“œ ์ €์žฅ์†Œ์— Pull Request๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด GitHub Actions๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ฝ”๋“œ ๋ณ€๊ฒฝ๋ถ„์— ๋ฌธ์ œ๊ฐ€ ์—†๋Š”์ง€ ๊ฐ์ข… ๊ฒ€์‚ฌ๋ฅผ ์ง„ํ–‰
  • ์–ด๋–ค ์ƒˆ๋กœ์šด ์ฝ”๋“œ๊ฐ€ ๋ฉ”์ธ(main) ๋ธŒ๋žœ์น˜์— ์œ ์ž…(push)๋˜๋ฉด GitHub Actions๋ฅผ ํ†ตํ•ด ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋นŒ๋“œ(build)ํ•˜๊ณ  ์ƒ์šฉ ์„œ๋ฒ„์— ๋ฐฐํฌ(deploy) ๊ฐ€๋Šฅ
  • ํŠน์ • ์‹œ๊ฐ์— ํŠน์ • ๋ฐ์ดํ„ฐ ํฌ๋กค๋ง ๊ฐ€๋Šฅ



โœ… Workflows

 

GitHub Actions์—์„œ ๊ฐ€์žฅ ์ƒ์œ„ ๊ฐœ๋…์ธ ์›Œํฌํ”Œ๋กœ์šฐ(Workflow, ์ž‘์—… ํ๋ฆ„)๋Š” ์ž๋™ํ™”ํ•ด๋†“์€ ์ผ๋ จ์˜ ์ž‘์—… ๊ณผ์ •์ด๋‹ค.

์ด๋•Œ ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ์ฝ”๋“œ ์ €์žฅ์†Œ ๋‚ด์—์„œ .github/workflows ํด๋” ์•„๋ž˜์— ์œ„์น˜ํ•œ YAML ํŒŒ์ผ ๋กœ ์„ค์ •ํ•˜๋ฉฐ, ํ•˜๋‚˜์˜ ์ฝ”๋“œ ์ €์žฅ์†Œ์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์›Œํฌํ”Œ๋กœ์šฐ, ์ฆ‰ ์—ฌ๋Ÿฌ ๊ฐœ์˜ YAML ํŒŒ์ผ์„ ์ƒ์„ฑ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

Workflow์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ

  • Test Codevalue์— ํŠน์ • ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋Š”๊ฐ€?
  • ํŠน์ • ํ•จ์ˆ˜์˜ return ๊ฐ’์ด ์–ด๋–ป๊ฒŒ ๋‚˜์˜ค๋Š”์ง€ ํ™•์ธํ•˜๋Š” TC
  • Deploy
  • ์„œ๋ฒ„์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ, ๋ฒ„์ „ ๋“ฑ์„ ๋ฐฐํฌ
  • Automation
  • ์ž๋™ํ™”ํ•˜๊ณ ์ž ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ ์ƒ์„ฑ
  • ๋‹ค์–‘ํ•œ ๋ฒ„์ „์—์„œ ์‹คํ–‰๋˜๋Š”์ง€ ํ™•์ธ
  • Ubuntu์˜ ์ตœ์‹ ๋ฒ„์ „์—์„œ ๋™์ž‘ํ•˜๋Š”์ง€, Python 3.5~3.8 ๋ฒ„์ „์—์„œ ๋™์ž‘ํ•˜๋Š”์ง€

 


main ๋ธŒ๋žœ์น˜์— push ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ๋งˆ๋‹ค ์›Œํฌํ”Œ๋กœ์šฐ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•

 

.github/workflows/example.yml

on:
  push:
    branches:
      - main

jobs:
  # ...(์ƒ๋žต)...

 

๋งค์ผ ์ž์ •์— ์›Œํฌํ”Œ๋กœ์šฐ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•

 

.github/workflows/example.yml

on:
  schedule:
  - cron: "0 0 * * *"

jobs:
  # ...(์ƒ๋žต)...



โœ… Jobs

์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์ผ์„ ํ•ด์•ผํ•˜๋Š”์ง€ ๋ช…์‹œํ•˜๋Š” ๊ณณ์ด๋‹ค.

 

๋…๋ฆฝ๋œ ๊ฐ€์ƒ ๋จธ์‹ (machine) ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ(container)์—์„œ ๋Œ์•„๊ฐ€๋Š” ํ•˜๋‚˜์˜ ์ฒ˜๋ฆฌ ๋‹จ์œ„๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

ํ•˜๋‚˜์˜ ์›Œํฌํ”Œ๋กœ์šฐ ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์—… ์œผ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ ์ ์–ด๋„ ํ•˜๋‚˜์˜ ์ž‘์—…์€ ํ•„์š”ํ•˜๋‹ค.

๋ชจ๋“  ์ž‘์—…์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์‹œ์— ์‹คํ–‰๋˜๋ฉฐ, ํ•„์š” ์‹œ ์ž‘์—… ๊ฐ„์— ์˜์กด ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•˜์—ฌ ์ž‘์—…์ด ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.

 


์ž‘์—…์€ ์›Œํฌํ”Œ๋กœ์šฐ YAML ํŒŒ์ผ ๋‚ด์—์„œ jobs ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉฐ ์ž‘์—… ์‹๋ณ„์ž(ID)์™€ ์ž‘์—… ์„ธ๋ถ€ ๋‚ด์šฉ ๊ฐ„์˜ ๋งตํ•‘(mapping) ํ˜•ํƒœ๋กœ ๋ช…์‹œ

์˜ˆ๋ฅผ ๋“ค์–ด job1, job2, job3์ด๋ผ๋Š” ์ž‘์—… ID๋ฅผ ๊ฐ€์ง„ 3๊ฐœ์˜ ์ž‘์—…์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •

 

.github/workflows/example.yml

# ...(์ƒ๋žต)...

jobs:
  job1:
    # job1์— ๋Œ€ํ•œ ์„ธ๋ถ€ ๋‚ด์šฉ
  job2:
    # job2์— ๋Œ€ํ•œ ์„ธ๋ถ€ ๋‚ด์šฉ
  job3:
    # job3์— ๋Œ€ํ•œ ์„ธ๋ถ€ ๋‚ด์šฉ

์ž‘์—…์˜ ์„ธ๋ถ€ ๋‚ด์šฉ์œผ๋กœ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋‚ด์šฉ์„ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ

ํ•„์ˆ˜๋กœ ๋“ค์–ด๊ฑฐ์•ผ ํ•˜๋Š” runs-on ์†์„ฑ์„ ํ†ตํ•ด ํ•ด๋‹น ๋ฆฌ๋ˆ…์Šค๋‚˜ ์œˆ๋„์šฐ์ฆˆ์™€ ๊ฐ™์€ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ์ง€์ •

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์šฐ๋ถ„ํˆฌ์˜ ์ตœ์‹  ์‹คํ–‰ ํ™˜๊ฒฝ์—์„œ ํ•ด๋‹น ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •

 

.github/workflows/example.yml

# ...(์ƒ๋žต)...

jobs:
  job1:
    runs-on: ubuntu-latest
    steps:
      # ...(์ƒ๋žต)...



โœ…  Steps

์ž‘์—… ์ˆœ์„œ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ณณ์ด๋‹ค.

 

๊ฐ ์ž‘์—…(job)์€ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋‹จ๊ณ„(step)๋กœ ๋ชจ๋ธ๋งํ•œ๋‹ค.

์ž‘์—… ๋‹จ๊ณ„๋Š” ๋‹จ์ˆœํ•œ ์ปค๋งจ๋“œ(command) ํ˜น์€ ์Šคํฌ๋ฆฝํŠธ(script*๊ฑฐ๋‚˜ ์•ก์…˜(action)๊ฐ™์€ ๋ณต์žกํ•œ ๋ช…๋ น์ด๋‹ค.

์ปค๋งจ๋“œ๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋Š” run ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์•ก์…˜์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” uses ์†์„ฑ์„ ์‚ฌ์šฉํ•œ๋‹ค.

 


์˜ˆ๋ฅผ ๋“ค์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ์ ํŠธ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ๋ฆฌ๋ ค๋ฉด

์ฝ”๋“œ ์ €์žฅ์†Œ์— ์ฝ”๋“œ๋ฅผ ์ž‘์—… ์‹คํ–‰ ํ™˜๊ฒฝ์œผ๋กœ ๋‚ด๋ ค ๋ฐ›๊ณ  → ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ → ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

์ด๋Ÿฌํ•œ 3๋‹จ๊ณ„ ์ž‘์—…์€ ์•„๋ž˜์™€ ๊ฐ™์ด steps ์†์„ฑ์„ ํ†ตํ•ด์„œ ๋ช…์‹œ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

.github/workflows/example.yml

# ...(์ƒ๋žต)...

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - run: npm install
      - run: npm test

๐Ÿ’ก ์›Œํฌํ”Œ๋กœ์šฐ ํŒŒ์ผ ๋‚ด์—์„œ ์ž‘์—… ๋‹จ๊ณ„๋ฅผ ๋ช…์‹œํ•ด์ค„ ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ - ๋ฅผ ๋ถ™์—ฌ์•ผ ํ•จ

(YAML ๋ฌธ๋ฒ•์—์„œ ์‹œํ€€์Šค(sequence) ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ)




โœ…  Actions

๋ฐ˜๋ณต ๋‹จ๊ณ„๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์šฉ์ดํ•˜๋„๋ก ์ œ๊ณต๋˜๋Š” ์ผ์ข…์˜ ์ž‘์—… ๊ณต์œ  ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค.

 

ํ•˜๋‚˜์˜ ์ฝ”๋“œ ์ €์žฅ์†Œ ๋ฒ”์œ„ ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ์›Œํฌํ”Œ๋กœ์šฐ ๊ฐ„์—์„œ ๊ณต์œ ๋ฅผ ํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๊ณต๊ฐœ ์ฝ”๋“œ ์ €์žฅ์†Œ๋ฅผ ํ†ตํ•ด ์•ก์…˜์„ ๊ณต์œ ํ•˜๋ฉด GitHub ์ƒ์˜ ๋ชจ๋“  ์ฝ”๋“œ ์ €์žฅ์†Œ์—์„œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

GitHub์—์„œ ์ œ๊ณตํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๊ณต๊ฐœ ์•ก์…˜ : ์ฒดํฌ ์•„์›ƒ ์•ก์…˜(actions/checkout)

๋Œ€๋ถ€๋ถ„์˜ CI/CD ์ž‘์—…์€ ์ฝ”๋“œ ์ €์žฅ์†Œ๋กœ ๋ถ€ํ„ฐ ์ฝ”๋“œ๋ฅผ ์ž‘์—… ์‹คํ–‰ ํ™˜๊ฒฝ์œผ๋กœ ๋‚ด๋ ค๋ฐ›๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ → ์ฒดํฌ ์•„์›ƒ ์•ก์…˜์€ ์—„์ฒญ๋‚˜๊ฒŒ ๋ฒ”์šฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

๋ฟ๋งŒ์•„๋‹ˆ๋ผ GitHub Marketplace์—์„œ๋Š” ์ˆ˜๋งŽ์€ ๋ฒค๋”(vendor)๊ฐ€ ๊ณต๊ฐœํ•ด๋†“์€ ๋‹ค์–‘ํ•œ ์•ก์…˜์ด ์กด์žฌํ•œ๋‹ค.

์ฆ‰, ์ด๋Ÿฌํ•œ ์•ก์…˜์„ ์ค‘์‹ฌ์œผ๋กœ ํ•˜๋‚˜์˜ ํฐ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ํ˜•์„ฑ์ด ๋˜๊ณ  ๋” ๋งŽ์€ ์‚ฌ์šฉ์ž์™€ ๋ฒค๋”๊ฐ€ GitHub Actions์œผ๋กœ ๋ชฐ๋ ค๋“œ๋Š” ์„ ์ˆœํ™˜์ด ๋ฐœ์ƒํ•œ๋‹ค.

 

 

[์ถœ์ฒ˜]

https://www.invicti.com/support/integrating-invicti-enterprise-github-actions/

https://zzsza.github.io/development/2020/06/06/github-action/

https://www.daleseo.com/github-actions-basics/

๋ฐ˜์‘ํ˜•