Skip to content

๐Ÿ–ฅ๏ธGitHub Actions๋กœ CI CD ๊ตฌ์ถ• ๋ฐฉ๋ฒ•

๋…ธํ˜„์ง„ edited this page Nov 9, 2024 · 3 revisions

Environment

  • OS: Raspberry Pi OS (64 bit)

๋ชฉ์ฐจ


๊ฐœ์š”

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” GitHub Actions๋กœ CI/CD ๊ตฌ์ถ• ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


CI/CD๋ž€?

CI/CD๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๋ฐ ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž๋™ํ™”ํ•˜๊ณ  ํšจ์œจํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ, Continuous Integration(์ง€์†์  ํ†ตํ•ฉ)๊ณผ Continuous Deployment(์ง€์†์  ๋ฐฐํฌ)๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.


CI (Continous Integration)

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


CD (Continuous Deployment)

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


GitHub Actions๋ž€?

GitHub Actions๋ž€ GitHub์—์„œ ์ œ๊ณตํ•˜๋Š” CI/CD(Continuous Integration/Continuous Deployment) ์„œ๋น„์Šค๋กœ, ํ”„๋กœ์ ํŠธ ๋‚ด์˜ workflow๋ฅผ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ ๋“ฑ์˜ ์ž‘์—…์„ GitHub Repository ๋‚ด์—์„œ ์ง์ ‘ ์„ค์ •ํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GitHub Actions๋Š” GitHub์˜ YAML ๊ธฐ๋ฐ˜ ์„ค์ • ํŒŒ์ผ์„ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ(Ex. Push, Pull Request ๋“ฑ)์— ๋”ฐ๋ผ ์‹คํ–‰๋˜๋„๋ก workflow๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


GitHub Actions ๊ตฌ์„ฑ ์š”์†Œ

GitHub Actions ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Workflow

    ์ž๋™ํ™”๋œ ์ž‘์—…์˜ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค. .github/workflows/ ๋””๋ ‰ํ† ๋ฆฌ ์•„๋ž˜์— YAML ํŒŒ์ผ๋กœ ์„ค์ •ํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์—…(Ex. ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ ๋“ฑ)์„ ๋‹จ๊ณ„๋ณ„๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Event

    workflow๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ์ด๋ฒคํŠธ๋กœ, ์ฃผ๋กœ ์ฝ”๋“œ ํ‘ธ์‹œ(Push), PR ์ƒ์„ฑ(Pull Request), release, issue ์ƒ์„ฑ ๋“ฑ์˜ GitHub ํ™œ๋™์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ workflow๊ฐ€ ์ž๋™์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

  • Job

    workflow ์•ˆ์—์„œ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—… ๋‹จ์œ„์ž…๋‹ˆ๋‹ค. ๊ฐ job์€ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ณ , ์„œ๋กœ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์—์„œ ๋ณ‘๋ ฌ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  • Step

    job ๋‚ด๋ถ€์—์„œ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฐœ๋ณ„ ์ž‘์—…์ž…๋‹ˆ๋‹ค. Shell ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜, GitHub์—์„œ ์ œ๊ณตํ•˜๋Š” ์•ก์…˜(Action)์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Action

    GitHub Actions์—์„œ ์ œ๊ณตํ•˜๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ž‘์—… ๋‹จ์œ„์ž…๋‹ˆ๋‹ค. Node.js ์„ค์น˜, AWS S3์— ํŒŒ์ผ ์—…๋กœ๋“œ ๋“ฑ์„ ์•ก์…˜์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Step 1 - GitHub Actions ์‹œ์ž‘ํ•˜๊ธฐ

GitHub Actions์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € yml ์„ค์ • ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. yml ์„ค์ • ํŒŒ์ผ์€ GitHub Repository์—์„œ ์ง์ ‘ ๋งŒ๋“ค์–ด๋„ ๋˜๊ณ , ์•„๋‹ˆ๋ฉด VSCode์—์„œ ๋งŒ๋“ค์–ด๋„ ๋ฉ๋‹ˆ๋‹ค.


GitHub Repository์—์„œ ๋งŒ๋“ค๊ธฐ

๋จผ์ € ๋‹ค์Œ๊ณผ ๊ฐ™์ด GitHub Repository์˜ Actions ํƒญ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

pic1

ํ•ด๋‹น ํŽ˜์ด์ง€๋กœ ๋“ค์–ด๊ฐ€๋ฉด ์œ„์™€ ๊ฐ™์ด GitHub์—์„œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ…œํ”Œ๋ฆฟ์„ ์ œ๊ณตํ•ด ์ค๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ํ…œํ”Œ๋ฆฟ์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ configure ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ฑฐ๋‚˜, ํ…œํ”Œ๋ฆฟ ์—†์ด ์ง„ํ–‰ํ•˜๋ ค๋ฉด set up a workflow yourself๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

pic3


VSCode์—์„œ ๋งŒ๋“ค๊ธฐ

๋จผ์ € ๋‹ค์Œ๊ณผ ๊ฐ™์ด VSCode์—์„œ GitHub Actions Extensions์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

pic2

์ดํ›„ ํ”„๋กœ์ ํŠธ ์ตœ์ƒ๋‹จ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ .github ํด๋”๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ์•ˆ์— workflows๋ผ๋Š” ํด๋”๋ฅผ ์ƒ์„ฑํ•œ ํ›„ yml ์„ค์ • ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ๋ช…์€ ์›ํ•˜๋Š” ๋Œ€๋กœ ์ง€์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฐํฌ ๊ด€๋ จ workflow ์„ค์ • ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค๋ฉด .github/workflows/deploy.yml ๊ตฌ์กฐ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

pic10


Step 2 - Workflow ์ž‘์„ฑํ•˜๊ธฐ

๋‹ค์Œ ์˜ˆ์‹œ๋Š” Next.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Raspberry Pi์— ๋ฐฐํฌํ•˜๊ณ ์ž CI/CD๋ฅผ ๊ตฌ์ถ•ํ•œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

pic11

์œ„์˜ workflow ์„ค์ •์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


workflow ์ด๋ฆ„ ์„ค์ •ํ•˜๊ธฐ

# workflow ์ด๋ฆ„ ์„ค์ •
name: GitHub Actions๋กœ Next.js ์•ฑ CI/CD ๊ตฌ์ถ• ์˜ˆ์‹œ

๋จผ์ € ์œ„์™€ ๊ฐ™์ด workflow ์ด๋ฆ„์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. workflow ์ด๋ฆ„์€ name ํ•„๋“œ์—์„œ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ด๋ฆ„์€ GitHub์˜ Actions ํƒญ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

pic5


์ด๋ฒคํŠธ ์„ค์ •ํ•˜๊ธฐ

# workflow๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ์ด๋ฒคํŠธ ์„ค์ •
on:
  push:
    # main ๋ธŒ๋žœ์น˜์— ํ‘ธ์‹œํ•  ๋•Œ ์‹คํ–‰
    branches: ["main"]

on ํ•„๋“œ์—์„œ๋Š” workflow๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฒคํŠธ๋กœ๋Š” push, pull_request ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์˜ˆ์‹œ๋Š” main ๋ธŒ๋žœ์น˜์— ์ฝ”๋“œ ํ‘ธ์‹œ๊ฐ€ ์ด๋ฃจ์–ด์งˆ ๋•Œ workflow๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.


Job ์„ค์ •ํ•˜๊ธฐ

pic12

jobs ํ•„๋“œ๋Š” workflow ๋‚ด์—์„œ ์‹คํ–‰๋  ๊ฐœ๋ณ„ ์ž‘์—…์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ job์€ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ € ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•  job์˜ ์ด๋ฆ„์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์€ ์ž์œ ๋กญ๊ฒŒ ์ง€์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์˜ ๊ฒฝ์šฐ์—๋Š” ๋นŒ๋“œ ํ›„ ๋ฐฐํฌ๋ฅผ ํ•˜๋Š” job์„ ์ •์˜ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฆ„์„ build-and-deploy๋ผ๊ณ  ์ง€์—ˆ์Šต๋‹ˆ๋‹ค.

# ์‹คํ–‰ํ•  jobs ์„ค์ •
jobs:
  # job ์ด๋ฆ„ ์„ค์ •
  build-and-deploy:

๋‹ค์Œ์œผ๋กœ ํ•ด๋‹น job์ด ์‹คํ–‰๋  ํ™˜๊ฒฝ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. GitHub์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ runs-on๋Š” ubuntu-latest, macos-latest, windows-latest ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

# Ubuntu ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰
runs-on: ubuntu-latest

steps ํ•„๋“œ์—๋Š” job ๋‚ด๋ถ€์—์„œ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฐœ๋ณ„ ์ž‘์—…์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. Shell ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜, GitHub์—์„œ ์ œ๊ณตํ•˜๋Š” ์•ก์…˜(Action)์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” Next.js๋กœ ๋งŒ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Raspberry Pi์— ๋ฐฐํฌํ•˜๋Š” ์ž‘์—…์„ ์ •์˜ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฐฐํฌ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  1. GitHub Repository์— push๋œ ์ฝ”๋“œ ๊ฐ€์ ธ์˜ค๊ธฐ
  2. Node.js ์„ค์น˜ํ•˜๊ธฐ
  3. Next.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œํ•˜๊ธฐ
  4. scp๋ฅผ ์‚ฌ์šฉํ•ด ๋นŒ๋“œ ํŒŒ์ผ์„ Raspberry Pi๋กœ ์ „์†กํ•˜๊ธฐ
  5. ssh๋ฅผ ์‚ฌ์šฉํ•ด Raspberry Pi์— ์›๊ฒฉ ์ ‘์†ํ•œ ํ›„ pm2๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์‹คํ–‰ํ•˜๊ธฐ

1. GitHub Repository์— push๋œ ์ฝ”๋“œ ๊ฐ€์ ธ์˜ค๊ธฐ

๋จผ์ € GitHub Repository์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. GitHub์—์„œ ์ œ๊ณตํ•˜๋Š” ์•ก์…˜์œผ๋กœ actions/checkout์ด ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ์•ก์…˜์„ ์‚ฌ์šฉํ•ด์„œ Repository์˜ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

steps:
  - name: Checkout code
    uses: actions/checkout@v4

name ํ•„๋“œ๋Š” ๊ฐ ๋‹จ๊ณ„์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๋ถ€๋ถ„์œผ๋กœ, job ์‹คํ–‰ ์‹œ ๋กœ๊ทธ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์€ ํ•ด๋‹น ๋‹จ๊ณ„๊ฐ€ ํ•˜๊ณ ์ž ํ•˜๋Š” ์ž‘์—…์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. uses ํ•„๋“œ๋Š” GitHub์—์„œ ์ œ๊ณตํ•˜๋Š” ์•ก์…˜ ๋˜๋Š” ์„œ๋“œํŒŒํ‹ฐ ์•ก์…˜์„ ์‚ฌ์šฉํ•  ๋•Œ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, actions/checkout@v4๋Š” Code Repository๋ฅผ ์ฒดํฌ์•„์›ƒ(=์ฝ”๋“œ ๊ฐ€์ ธ์˜ค๊ธฐ)ํ•˜๋Š” ์•ก์…˜์ž…๋‹ˆ๋‹ค.


2. Node.js ์„ค์น˜ํ•˜๊ธฐ

์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜จ ํ›„์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก Node.js๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. GitHub์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด Node.js๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ์•ก์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ, ํŠน์ • ์•ก์…˜์— ์ถ”๊ฐ€ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” with ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์น˜ํ•˜๊ณ ์ž ํ•˜๋Š” Node.js ๋ฒ„์ „์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

- name: Set up Node.js
  uses: actions/setup-node@v4
    with:
      # Node.js ๋ฒ„์ „ ์„ค์ •
      node-version: 20

3. Next.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œํ•˜๊ธฐ

๋‹ค์Œ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•ด npm install ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์˜์กด์„ฑ ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ•œ ํ›„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉํ•œ run์€ ์…ธ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์–ด๋Š” ์ •์˜๋œ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

- name: Install dependencies
  run: npm install

- name: Build Next.js Project
  run: npm run build

4. scp๋ฅผ ์‚ฌ์šฉํ•ด ๋นŒ๋“œ ํŒŒ์ผ์„ Raspberry Pi๋กœ ์ „์†กํ•˜๊ธฐ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•œ ํ›„์—๋Š” scp๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ ํŒŒ์ผ์„ Raspberry Pi๋กœ ์ „์†กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” appleboy/scp-action@v0.1.7๋ผ๋Š” ์„œ๋“œํŒŒํ‹ฐ ์•ก์…˜์„ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

pic13

Next.js์—์„œ๋Š” ๋นŒ๋“œ ์‹œ .next ํด๋”๊ฐ€ ์ƒ์„ฑ๋˜๋ฏ€๋กœ ํ•ด๋‹น ํด๋”๋ฅผ source๋กœ ์ง€์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์œ„์—์„œ Raspberry Pi์˜ IP ์ฃผ์†Œ๋‚˜ ๋น„๋ฐ€๋ฒˆํ˜ธ, ํฌํŠธ ๋ฒˆํ˜ธ ๋“ฑ์€ ์ค‘์š”ํ•œ ์ •๋ณด์ด๋ฏ€๋กœ yml ํŒŒ์ผ์— ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  GitHub Secrets๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. GitHub Secrets๋Š” ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์œผ๋กœ, yml ํŒŒ์ผ ๋‚ด์—์„œ secrets.<SECRET_NAME> ํ˜•ํƒœ๋กœ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GitHub Secrets๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € ๋‹ค์Œ๊ณผ ๊ฐ™์ด GitHub Repository ๋‚ด์—์„œ settings > Secrets and variable > Actions๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

pic6

์ดํ›„ New repository secret์„ ํด๋ฆญํ•˜์—ฌ secrets๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

pic7


5. ssh๋ฅผ ์‚ฌ์šฉํ•ด Raspberry Pi์— ์›๊ฒฉ ์ ‘์†ํ•œ ํ›„ pm2๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์‹คํ–‰ํ•˜๊ธฐ

๋นŒ๋“œ ํŒŒ์ผ์„ ์ „์†กํ•œ ํ›„์—๋Š” ssh๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Raspberry Pi์— ์›๊ฒฉ ์ ‘์†ํ•œ ํ›„ ์ด์ „์— ์‹คํ–‰๋˜๊ณ  ์žˆ๋˜ ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„๋ฅผ ์ข…๋ฃŒํ•œ ํ›„ pm2๋ฅผ ์‚ฌ์šฉํ•ด ์ƒˆ๋กญ๊ฒŒ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” appleboy/ssh-action@v1.1.0๋ผ๋Š” ์„œ๋“œํŒŒํ‹ฐ ์•ก์…˜์„ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

pic14

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


Step 3 - CI/CD ํ…Œ์ŠคํŠธํ•˜๊ธฐ

CI/CD ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

pic8

pic9

์ฐธ๊ณ  ์ž๋ฃŒ

MafiaCamp

๐Ÿ“”์†Œ๊ฐœ
๐ŸŽฏํ”„๋กœ์ ํŠธ ๊ทœ์น™
๐Ÿ’ปํ”„๋กœ์ ํŠธ ๊ธฐํš
๐Ÿ€๊ธฐ์ˆ  ์Šคํƒ
๐Ÿ“š๊ทธ๋ฃน ํšŒ๊ณ 
๐ŸŒˆ๊ฐœ๋ฐœ ์ผ์ง€
๐Ÿ€๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฒฝํ—˜
๐Ÿ”งํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…
Clone this wiki locally