Skip to main content

Node.js ๋นŒ๋“œ ๋ฐ ํ…Œ์ŠคํŠธ

CI(์—ฐ์† ํ†ตํ•ฉ) ์›Œํฌํ”Œ๋กœ๋ฅผ ๋งŒ๋“ค์–ด Node.js ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์„ธ์š”.

์†Œ๊ฐœ

์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” Node.js ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๋Š” CI(์—ฐ์† ํ†ตํ•ฉ) ์›Œํฌํ”Œ๋กœ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค. CI ํ…Œ์ŠคํŠธ์— ํ†ต๊ณผํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌํ•˜๊ฑฐ๋‚˜ ํŒจํ‚ค์ง€๋ฅผ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•„์ˆ˜ ์กฐ๊ฑด

Node.js, YAML, ์›Œํฌํ”Œ๋กœ ๊ตฌ์„ฑ ์˜ต์…˜๊ณผ ์›Œํฌํ”Œ๋กœ ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

Node.js ์›Œํฌํ”Œ๋กœ ํ…œํ”Œ๋ฆฟ ์‚ฌ์šฉ

๋น ๋ฅด๊ฒŒ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ์›Œํฌํ”Œ๋กœ ํ…œํ”Œ๋ฆฟ์„ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ .github/workflows ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

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

  1. GitHub์—์„œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ๊ธฐ๋ณธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

  2. ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ด๋ฆ„ ์•„๋ž˜์—์„œ ์ž‘์—…์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

    "github/docs" ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ํƒญ ์Šคํฌ๋ฆฐ์ƒท. "์ž‘์—…" ํƒญ์€ ์ฃผํ™ฉ์ƒ‰ ์œค๊ณฝ์„ ์œผ๋กœ ๊ฐ•์กฐ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

  3. ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์›Œํฌํ”Œ๋กœ๊ฐ€ ์ด๋ฏธ ์žˆ๋Š” ๊ฒฝ์šฐ ์ƒˆ ์›Œํฌํ”Œ๋กœ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  4. "์›Œํฌํ”Œ๋กœ ์„ ํƒ" ํŽ˜์ด์ง€์—๋Š” ๊ถŒ์žฅ๋˜๋Š” ์›Œํฌํ”Œ๋กœ ํ…œํ”Œ๋ฆฟ์˜ ์„ ํƒ ํ•ญ๋ชฉ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. "Node.js"๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

  5. ์ง€์†์  ํ†ตํ•ฉ์„ ํด๋ฆญํ•˜์—ฌ ์›Œํฌํ”Œ๋กœ ์„ ํƒ์„ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.

  6. "Node.js" ์›Œํฌํ”Œ๋กœ์—์„œ ๊ตฌ์„ฑ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  7. ํ•„์š”์— ๋”ฐ๋ผ ์›Œํฌํ”Œ๋กœ๋ฅผ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉํ•˜๋ ค๋Š” ๋…ธ๋“œ ๋ฒ„์ „์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

  8. ๋ณ€๊ฒฝ ๋‚ด์šฉ ์ปค๋ฐ‹์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

node.js.yml ์›Œํฌํ”Œ๋กœ ํŒŒ์ผ์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ .github/workflows ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

Node.js ๋ฒ„์ „ ์ง€์ •

Node.js ๋ฒ„์ „์„ ์ง€์ •ํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ GitHub์—์„œ ์ œ๊ณตํ•˜๋Š” setup-node ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ setup-node๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ด setup-node ์ž‘์—…์€ Node.js ๋ฒ„์ „์„ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹คํ–‰๊ธฐ์—์„œ ํ•ด๋‹น ๋ฒ„์ „์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. setup-node ์ž‘์—…์€ ๊ฐ ์‹คํ–‰๊ธฐ์˜ ๋„๊ตฌ ์บ์‹œ์—์„œ Node.js์˜ ํŠน์ • ๋ฒ„์ „์„ ์ฐพ์•„ ํ•„์ˆ˜ ์ด์ง„ ํŒŒ์ผ์„ PATH์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ด์ง„ ํŒŒ์ผ์€ ๋‚˜๋จธ์ง€ ์ž‘์—… ๋™์•ˆ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. setup-node ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์–‘ํ•œ ์‹คํ–‰๊ธฐ ๋ฐ Node.js ๋ฒ„์ „ ๊ฐ„์— ์ผ๊ด€๋œ ๋™์ž‘์„ ๋ณด์žฅํ•˜๋ฏ€๋กœ GitHub Actions๋กœ Node.js๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ž์ฒด ํ˜ธ์ŠคํŠธ ์‹คํ–‰๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Node.js๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์ด๋ฅผ PATH์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์›Œํฌํ”Œ๋กœ ํ…œํ”Œ๋ฆฟ์—๋Š” node-version์— ๋‚˜์—ด๋œ Node.js ๋ฒ„์ „์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๋Š” ํ–‰๋ ฌํ˜• ์ „๋žต์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. โ€˜xโ€™๋Š” ๋ฒ„์ „์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์‹  ๋ถ€ ๋ฒ„์ „ ๋ฐ ํŒจ์น˜ ๋ฆด๋ฆฌ์Šค์™€ ์ผ์น˜ํ•˜๋Š” ์™€์ผ๋“œ์นด๋“œ ๋ฌธ์ž์ž…๋‹ˆ๋‹ค. node-version ๋ฐฐ์—ด์— ์ง€์ •๋œ Node.js์˜ ๊ฐ ๋ฒ„์ „์€ ๋™์ผํ•œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ž‘์—…์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๊ฐ ์ž‘์—…์€ matrix ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งคํŠธ๋ฆญ์Šค node-version ๋ฐฐ์—ด์— ์ •์˜๋œ ๊ฐ’์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. setup-node ์ž‘์—…์€ ์ปจํ…์ŠคํŠธ๋ฅผ node-version ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. setup-node ์ž‘์—…์€ ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์ „์— ๋‹ค๋ฅธ Node.js ๋ฒ„์ „์œผ๋กœ ๊ฐ ์ž‘์—…์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ–‰๋ ฌ ์ „๋žต ๋ฐ ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ GitHub Actions์— ๋Œ€ํ•œ ์›Œํฌํ”Œ๋กœ ๊ตฌ๋ฌธ ๋ฐ ์ปจํ…์ŠคํŠธ ์ฐธ์กฐ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

YAML
strategy:
  matrix:
    node-version: ['18.x', '20.x']

steps:
- uses: actions/checkout@v4
- name: Use Node.js ${{ matrix.node-version }}
  uses: actions/setup-node@v4
  with:
    node-version: ${{ matrix.node-version }}

๋˜๋Š” ์ •ํ™•ํ•œ Node.js ๋ฒ„์ „์œผ๋กœ ๋นŒ๋“œํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

YAML
strategy:
  matrix:
    node-version: ['10.17.0', '17.9.0']

๋‹จ์ผ ๋ฒ„์ „์˜ Node.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

YAML
name: Node.js CI

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4
      - name: Use Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20.x'
      - run: npm ci
      - run: npm run build --if-present
      - run: npm test

Node.js ๋ฒ„์ „์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด GitHub์—์„œ ํ™˜๊ฒฝ์˜ ๊ธฐ๋ณธ Node.js ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GitHub ํ˜ธ์ŠคํŒ… ์‹คํ–‰๊ธฐ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

์ข…์†์„ฑ ์„ค์น˜

GitHub ํ˜ธ์ŠคํŠธ ์‹คํ–‰๊ธฐ์—๋Š” npm ๋ฐ Yarn ์ข…์†์„ฑ ๊ด€๋ฆฌ์ž๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์ „์— npm ๋ฐ Yarn์„ ์‚ฌ์šฉํ•˜์—ฌ ์›Œํฌํ”Œ๋กœ์— ์ข…์†์„ฑ์„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Windows ๋ฐ Linux GitHubํ˜ธ์ŠคํŠธ ์‹คํ–‰๊ธฐ์—๋„ Grunt, Gulp, Bower๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ข…์†์„ฑ์„ ์บ์‹œํ•˜์—ฌ ์›Œํฌํ”Œ๋กœ ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ข…์†์„ฑ ์บ์‹ฑ ์ฐธ์กฐ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

npm์„ ์‚ฌ์šฉํ•œ ์˜ˆ์‹œ

์ด ์˜ˆ์‹œ์—์„œ๋Š” package-lock.json ๋˜๋Š” npm-shrinkwrap.json ํŒŒ์ผ์— ๋ฒ„์ „์„ ์„ค์น˜ํ•˜๊ณ  ์ž ๊ธˆ ํŒŒ์ผ์ด ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ npm ci๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด npm install์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋น ๋ฆ…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ npm ci ๋ฐ ๋” ๋น ๋ฅด๊ณ  ์•ˆ์ •์ ์ธ ๋นŒ๋“œ๋ฅผ ์œ„ํ•œ npm ci ์†Œ๊ฐœ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

YAML
steps:
- uses: actions/checkout@v4
- name: Use Node.js
  uses: actions/setup-node@v4
  with:
    node-version: '20.x'
- name: Install dependencies
  run: npm ci

npm install์„ ์‚ฌ์šฉํ•˜๋ฉด package.json ํŒŒ์ผ์— ์ •์˜๋œ ์ข…์†์„ฑ์ด ์„ค์น˜๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ npm install๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

YAML
steps:
- uses: actions/checkout@v4
- name: Use Node.js
  uses: actions/setup-node@v4
  with:
    node-version: '20.x'
- name: Install dependencies
  run: npm install

Yarn์„ ์‚ฌ์šฉํ•œ ์˜ˆ์‹œ

์ด ์˜ˆ์‹œ์—์„œ๋Š” yarn.lock ํŒŒ์ผ์— ์ •์˜๋œ ์ข…์†์„ฑ์„ ์„ค์น˜ํ•˜๊ณ  yarn.lock ํŒŒ์ผ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ yarn install๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

YAML
steps:
- uses: actions/checkout@v4
- name: Use Node.js
  uses: actions/setup-node@v4
  with:
    node-version: '20.x'
- name: Install dependencies
  run: yarn --frozen-lockfile

๋˜๋Š” package.json ํŒŒ์ผ์— ์ •์˜๋œ ์ข…์†์„ฑ์„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

YAML
steps:
- uses: actions/checkout@v4
- name: Use Node.js
  uses: actions/setup-node@v4
  with:
    node-version: '20.x'
- name: Install dependencies
  run: yarn

ํ”„๋ผ์ด๋น— ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  .npmrc ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ์˜ˆ์‹œ

setup-node ์ž‘์—…์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋ฐ ๋ฒ”์œ„๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์‹คํ–‰๊ธฐ์—์„œ ๋กœ์ปฌ .npmrc ํŒŒ์ผ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ setup-node ์ž‘์—…์€ ํ”„๋ผ์ด๋น— ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์•ก์„ธ์Šคํ•˜๊ฑฐ๋‚˜ ๋…ธ๋“œ ํŒจํ‚ค์ง€๋ฅผ ๊ฒŒ์‹œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ž…๋ ฅ์œผ๋กœ ์ธ์ฆ ํ† ํฐ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ setup-node๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

ํ”„๋ผ์ด๋น— ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์ธ์ฆํ•˜๋ ค๋ฉด npm ์ธ์ฆ ํ† ํฐ์„ ๋น„๋ฐ€๋กœ ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด NPM_TOKEN์ด๋ผ๋Š” ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋น„๋ฐ€์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GitHub Actions์—์„œ ๋น„๋ฐ€ ์‚ฌ์šฉ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

์•„๋ž˜ ์˜ˆ์‹œ์—์„œ ๋น„๋ฐ€ NPM_TOKEN์€ npm ์ธ์ฆ ํ† ํฐ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. setup-node ์ž‘์—…์€ NODE_AUTH_TOKEN ํ™˜๊ฒฝ ๋ณ€์ˆ˜์—์„œ npm ์ธ์ฆ ํ† ํฐ์„ ์ฝ๋„๋ก .npmrc ํŒŒ์ผ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. setup-node ์ž‘์—…์„ ์‚ฌ์šฉํ•˜์—ฌ .npmrc ํŒŒ์ผ์„ ๋งŒ๋“ค ๋•Œ npm ์ธ์ฆ ํ† ํฐ์ด ํฌํ•จ๋œ ๋น„๋ฐ€๋กœ NODE_AUTH_TOKEN ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ข…์†์„ฑ์„ ์„ค์น˜ํ•˜๊ธฐ ์ „์— setup-node ์ž‘์—…์„ ์‚ฌ์šฉํ•˜์—ฌ .npmrc ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ž‘์—…์—๋Š” ๋‘ ๊ฐœ์˜ ์ž…๋ ฅ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. node-version ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” Node.js ๋ฒ„์ „์„ ์„ค์ •ํ•˜๊ณ  registry-url ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” ๊ธฐ๋ณธ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ๋ฒ”์œ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ scope ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ npm-scope๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

YAML
steps:
- uses: actions/checkout@v4
- name: Use Node.js
  uses: actions/setup-node@v4
  with:
    always-auth: true
    node-version: '20.x'
    registry-url: https://registry.npmjs.org
    scope: '@octocat'
- name: Install dependencies
  run: npm ci
  env:
    NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

์œ„์˜ ์˜ˆ์ œ์—์„œ๋Š” ๋‹ค์Œ ์ฝ˜ํ…์ธ ๊ฐ€ ํฌํ•จ๋œ .npmrc ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

//registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN}
@octocat:registry=https://registry.npmjs.org/
always-auth=true

์ข…์†์„ฑ ์บ์‹ฑ ์˜ˆ์‹œ

setup-node์ž‘์—…์„ ์‚ฌ์šฉํ•˜์—ฌ ์ข…์†์„ฑ์„ ์บ์‹œํ•˜๊ณ  ๋ณต์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” npm์— ๋Œ€ํ•œ ์ข…์†์„ฑ์„ ์บ์‹œํ•ฉ๋‹ˆ๋‹ค.

YAML
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
  with:
    node-version: '20'
    cache: 'npm'
- run: npm install
- run: npm test

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” Yarn์— ๋Œ€ํ•œ ์ข…์†์„ฑ์„ ์บ์‹œํ•ฉ๋‹ˆ๋‹ค.

YAML
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
  with:
    node-version: '20'
    cache: 'yarn'
- run: yarn
- run: yarn test

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” pnpm(v6.10 ์ด์ƒ)์— ๋Œ€ํ•œ ์ข…์†์„ฑ์„ ์บ์‹œํ•ฉ๋‹ˆ๋‹ค.

YAML
# ์ด ์›Œํฌํ”Œ๋กœ๋Š” GitHub์—์„œ ์ธ์ฆ๋˜์ง€ ์•Š์€ ์ž‘์—…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
# ์ž‘์—…์€ ํƒ€์‚ฌ์—์„œ ์ œ๊ณตํ•˜๋ฉฐ
# ๋ณ„๋„์˜ ์„œ๋น„์Šค ์•ฝ๊ด€, ๊ฐœ์ธ์ •๋ณด์ฒ˜๋ฆฌ๋ฐฉ์นจ, ์ง€์› ์„ค๋ช…์„œ์—์„œ ๊ทœ์ •๋ฉ๋‹ˆ๋‹ค.
# ์ฐธ์กฐํ•˜์„ธ์š”.

# NOTE: pnpm caching support requires pnpm version >= 6.10.0

steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@0609f0983b7a228f052f81ef4c3d6510cae254ad
  with:
    version: 6.10.0
- uses: actions/setup-node@v4
  with:
    node-version: '20'
    cache: 'pnpm'
- run: pnpm install
- run: pnpm test

์‚ฌ์šฉ์ž ์ง€์ • ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ๊ฑฐ๋‚˜ ์บ์‹ฑ์— ๋Œ€ํ•œ ์„ธ๋ถ€์ ์ธ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ cache ์ž‘์—…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ข…์†์„ฑ ์บ์‹ฑ ์ฐธ์กฐ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

์ฝ”๋“œ ๋นŒ๋“œ ๋ฐ ํ…Œ์ŠคํŠธ

์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ๋กœ์ปฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด npm run build๋ฅผ ์‹คํ–‰ํ•˜์—ฌ package.json ํŒŒ์ผ์— ์ •์˜๋œ ๋นŒ๋“œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ  npm test๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ…Œ์ŠคํŠธ ๋ชจ์Œ์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ์›Œํฌํ”Œ๋กœ ํŒŒ์ผ์— ํ•ด๋‹น ๋ช…๋ น์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

YAML
steps:
- uses: actions/checkout@v4
- name: Use Node.js
  uses: actions/setup-node@v4
  with:
    node-version: '20.x'
- run: npm install
- run: npm run build --if-present
- run: npm test

์›Œํฌํ”Œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์•„ํ‹ฐํŒฉํŠธ๋กœ ํŒจํ‚ค์ง€

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

ํŒจํ‚ค์ง€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๊ฒŒ์‹œ

CI ํ…Œ์ŠคํŠธ์— ํ†ต๊ณผํ•˜๋ฉด Node.js ํŒจํ‚ค์ง€๋ฅผ ํŒจํ‚ค์ง€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๊ฒŒ์‹œํ•˜๋„๋ก ์›Œํฌํ”Œ๋กœ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. npm ๋ฐ GitHub Packages์— ๊ฒŒ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Node.js ํŒจํ‚ค์ง€ ๊ฒŒ์‹œ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.