๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป dev

[ turborepo ์„ค์ •] storybook Chromatic CLI ์œผ๋กœ ๋ฐฐํฌํ•˜๋Š” ๋ฒ•

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป ํ…Œ์ŠคํŠธ๋กœ ํด๋ฆญํ•˜๋ฉด ๋ฒ„ํŠผ์ƒ‰์ด ๋ฐ”๋€Œ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ storybook์œผ๋กœ ๋งŒ๋“ค๊ณ , chromatic CLI๋กœ ๋ฐฐํฌํ•ด ๋ณด์ž.
๐Ÿงพ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ ์„ค์ •์€ ๋‹ค์Œ์˜ ๋ฒ„์ „๋“ค์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
โœ“ pnpm 9.0.0 
โœ“ node >= 20
โœ“ next 14.2.4
โœ“ react ^18
โœ“ chormatic ^11.5.5
โœ“ storybook ^8.2.2

torybook Chromatic CLI ๋ฐฐํฌ

[์ด์ „๊ธ€] 2024.07.11 - [๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป dev] - [turboRepo scss] Cannot find module './mybutton.module.scss' or its corresponding type declarations.ts(2307)

 

[turboRepo scss] Cannot find module './mybutton.module.scss' or its corresponding type declarations.ts(2307)

๐Ÿ•ต๏ธ ์ด์Šˆscss๋กœ ๋ฒ„ํŠผ ๋งŒ๋“ค์–ด๋ณด๊ธฐ ์ค‘..๋‹ค์Œ๊ณผ ๊ฐ™์€ ts ๊ฒฝ๊ณ ๊ฐ€ ๋–ด๋‹ค. ๋ฌธ์ œ๋Š” ts์™€ tsx ํ™•์žฅ์ž๋กœ ๋๋‚ด์•ผ๋งŒ ๋ชจ๋“ˆ๋กœ ์ธ์‹ํ•ด์„œ scss ํ™•์žฅ์ž์˜ ํŒŒ์ผ์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•œ ๊ฑฐ์˜€๋‹ค. ๐Ÿ“ ํ•ด๊ฒฐ1. tsconfig.ts ์™€ ๊ฐ™์€

pyotato-dev.tistory.com

 

 

 

1. ์„ค์น˜

pnpm --filter storybook add -D chromatic

 

์ด๋ ‡๊ฒŒ ์„ค์น˜ํ•ด ์ฃผ๋ฉด apps/storybook์˜ package.json์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์น˜๊ฐ€ ๋œ๋‹ค.

 

2. ์„ค์ •

- apps/storybook/chromatic.config.json

apps/storybook์— chromatic.config.jsonํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ฃผ์ž.

์„ค์ • ํ•„์ˆ˜ ํ•ญ๋ชฉ์€ project token์ด๊ณ , ๋‚˜๋จธ์ง€ ์ž์„ธํ•œ ์„ค์ •(ci, ํ…Œ์ŠคํŠธ ์—ฐ๋™ ๋“ฑ)๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

// ./chromatic.config.json

{
  "projectId": "Project:...",
  "projectToken": "chpt_์„ค์น˜_์‹œ_๋ถ€์—ฌ๋ฐ›๋Š”_ํ† ํฐ"
}

- apps/package.json

๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•ด ์ค„ ๋ช…๋ น์–ด๋„ package.json์— ์ถ”๊ฐ€ํ•ด ์ฃผ์ž.

// ...์ƒ๋žต
"scripts": {
    "dev": "storybook dev -p 6006",
    "build:storybook": "storybook build",
    "chromatic": "pnpm dlx chromatic --project-token=chpt_์„ค์น˜_์‹œ_๋ถ€์—ฌ๋ฐ›๋Š”_ํ† ํฐ" // โž• ์ถ”๊ฐ€
  },
// ...์ƒ๋žต

 

๐Ÿค” ์ €๋ ‡๊ฒŒ ํ† ํฐ๊ฐ’์ด ๋…ธ์ถœ๋˜๋Š” ๊ฒŒ ์˜ ์ฐ์ฐํ•˜๋‹ค... .env๋กœ ์„ค์ •ํ•ด ์ฃผ์ž.

.env ์„ค์ •

- apps/storybook/turbo.json

{
  "extends": ["//"],
  "tasks": {
    "build:storybook": {
      "dependsOn": ["^build:storybook"],
      "env": ["CHROMATIC_PROJECT_TOKEN"], 	// โž• ํ† ํฐ ์ด๋ฆ„ ์ถ”๊ฐ€
      "outputs": ["storybook-static/**"]
    }
  }
}

- apps/storybook/. env

CHROMATIC_PROJECT_TOKEN = chpt_๋กœ_์‹œ์ž‘ํ•˜๋Š”_ํ”„๋กœ์ ํŠธ_ํ† ํฐ // โž• ์ถ”๊ฐ€

- apps/storybook/package.json

 "scripts": {
    "dev": "storybook dev -p 6006",
    "build:storybook": "storybook build",
    "chromatic": "pnpm dlx chromatic --project-token" // โž• ์ˆ˜์ •
  },

 

package.json์— ์Šคํ† ๋ฆฌ๋ถ ๋นŒ๋“œ ๋ช…๋ น์–ด๋ฅผ "build:storybook": "storybook build"๋กœ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— 

chromatic.config.json๋„ ์„ค์ •์„ ํ•ด์ฃผ์ž.

- apps/storybook/chromatic.config.json

{
  "projectId": "Project:",
  "buildScriptName": "build:storybook"
}

 

์—ฌ๊ธฐ๊นŒ์ง€ ์„ค์ •์„ ํ•ด์ฃผ๋ฉด pnpm --filter storybook run chromatic ๋ช…๋ น์–ด๋กœ ๋ฐฐํฌ๋ฅผ ๋‹ค์Œ ๋งํฌ๋“ค์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค.

์Šคํ† ๋ฆฌ๋ถ : https://6695ee4a0eafb3b77660fc29-bognizhtkl.chromatic.com/

๋นŒ๋“œ ์ƒ์„ธ ๋‚ด์—ญ : https://www.chromatic.com/build?appId=6695ee4a0eafb3b77660fc29&number=11

(์„ ํƒ) ๋ณ€๊ฒฝ ์ž๋™ ์ ์šฉ ์—ฌ๋ถ€ ์„ค์ •

 

์œ„์˜ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

--auto-accept-changes๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฆ‰์‹œ ์ž๋™์œผ๋กœ ๋ฐ˜์˜ํ• ์ง€ ๋ช…์‹œํ•ด์•ผ ํ•ด์„œ ๋ฐœ์ƒํ•œ ๊ฒƒ์ด๋‹ค.

--exit-zero-on-changes๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ์ปค๋ฉ˜๋“œ๋ฅผ ์„ฑ๊ณต์‹œํ‚ฌ์ง€๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค.

๋‘ ์˜ต์…˜์˜ ๊ฐ’์€ true๋กœ ์„ค์ •ํ•˜๋ฉด ์ผ๊ด„ ์ ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ด๊ณ , ํŠน์ • ๋ธŒ๋žœ์น˜๋ฅผ ๋ช…์‹œํ•˜๋ฉด ํ•ด๋‹น ๋ธŒ๋žœ์น˜์—๋งŒ ์ ์šฉ์ด ๋˜๋„๋ก ์„ค์ • ๊ฐ€๋Šฅํ•˜๋‹ค.

 

ํ˜„์žฌ๋Š” ํ…Œ์ŠคํŠธ ์ปดํฌ๋„ŒํŠธ๋“ค์ด๋ฏ€๋กœ ๋‘˜ ๋‹ค true๋กœ ์„ค์ •ํ•ด ์ฃผ์ž.

- apps/storybook/chromatic.config.json

{
  "projectId": "Project:",
  "buildScriptName": "build:storybook",
  "exitZeroOnChanges": true, // โž• ์ถ”๊ฐ€
  "autoAcceptChanges": true // โž• ์ถ”๊ฐ€
}

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐฐํฌ๋œ ์‚ฌ์ดํŠธ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

https://www.chromatic.com/component?appId=6695ee4a0eafb3b77660fc29&csfId=example-mybutton&buildNumber=11&k=66960bf1ae1da1c6453b47b4-1200px-interactive-true&h=2&b=-1&inviteToken=chpi_d86ac5ca27c14a51b0978fe4f663ff8a

 

Sign in

Join a project You are invited to join a project on Chromatic.

www.chromatic.com

 

(์„ ํƒ) github actions์™€ ์—ฐ๋™ํ•˜๊ธฐ

๋งˆ๋ฌด๋ฆฌํ•˜๊ธฐ ์ „์— github actions์™€ ์—ฐ๋™ํ•ด์„œ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— pr์„ ์ƒ์„ฑํ•  ๋•Œ chromatic ๋ฐฐํฌ๋ฅผ ์ž‘์—… ์ž๋™ํ™”๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด์ž.

1. ๊นƒํ—ˆ๋ธŒ์— CHROMATIC_PROJECT_TOKEN ํ† ํฐ ์ถ”๊ฐ€ํ•˜๊ธฐ

2. workflow ์ถ”๊ฐ€

ํ”„๋กœ์ ํŠธ ์ตœ์ƒ๋‹จ์— .github/workflows/chromatic.yaml์„ ์ถ”๊ฐ€ํ•˜์ž.

name: "Chromatic Deployment"

on:
  pull_request:
    branches: [main]
    paths:
      - packages/design-system/src/** # โž• ui ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋งŒ๋“ค๊ณ  ์žˆ๋Š” ๊ฒฝ๋กœ์˜ src

jobs:
  chromatic-deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3
        with:
          fetch-depth: 0

      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: "18.16.0"

      - name: Install pnpm            # โž• pnpm ์„ค์น˜
        uses: pnpm/action-setup@v2
        id: pnpm-install
        with:
          version: 9
          run_install: false

      - name: Get pnpm store directory
        id: pnpm-cache
        shell: bash
        run: |
          echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
      - name: Setup pnpm cache
        uses: actions/cache@v3
        with:
          path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
          restore-keys: |
            ${{ runner.os }}-pnpm-store-
      - name: Install Dependency
        run: pnpm install -no-frozen-lockfile
        working-directory: packages/design-system     # โž• ์˜์กด์„ฑ ์„ค์น˜, ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋งŒ๋“ค๊ณ  ์žˆ๋Š” ๊ฒฝ๋กœ

      - name: Publish Chromatic
        id: chromatic
        uses: chromaui/action@v1
        with:
          workingDir: apps/storybook
          projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} # โž• ๊นƒํ—ˆ๋ธŒ secret์— ์ถ”๊ฐ€ํ•ด์คฌ๋˜ CHROMATIC_PROJECT_TOKEN
          token: ${{ secrets.SECRET_GITHUB }} # โž• ๊นƒํ—ˆ๋ธŒ SECRET ์ถ”๊ฐ€ํ•ด์ฃผ๊ธฐ, ์—†๋‹ค๋ฉด ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค.

      - name: Create comment PR
        uses: thollander/actions-comment-pull-request@v1
        env:
          GITHUB_TOKEN: ${{ secrets.SECRET_GITHUB }}
        with:
          message: "๐Ÿš€storybook: ${{ steps.chromatic.outputs.storybookUrl }}" # ๋ฐฐํฌํ•œ ์Šคํ† ๋ฆฌ๋ถ chromatic url

 

 

Actionsํƒญ์—์„œ ํ•ด๋‹น ์ž‘์—…์ด ์„ฑ๊ณตํ–ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์ž‘์„ฑํ–ˆ๋˜ pr์— chromatic ๋ฐฐํฌ url ๋„ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค.

 


๐Ÿ€ ๋งˆ์น˜๋ฉด์„œ

์•„์ง ์ƒ์†Œํ•œ ๋ชจ๋…ธ๋ ˆํฌ ๋™์ž‘ ๋ฐฉ์‹ ๋•Œ๋ฌธ์ธ์ง€ ์กฐ๊ธˆ ํ—ค๋งธ๋‹ค.
๋‹ค์Œ์—๋Š” ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์ค„ ์ง€์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด chromatic์œผ๋กœ ์Šคํ† ๋ฆฌ๋ถ ๋ฐฐํฌ์— ์ถ”๊ฐ€ํ•ด ๋ณด์ž.

๐Ÿ“š References

https://www.chromatic.com/docs/cli/

 

Introduction • Chromatic docs

Chromatic is a cloud-based toolchain that integrates with Storybook, Playwright, and Cypress to help teams test and review UI components.

www.chromatic.com

https://www.chromatic.com/docs/github-actions/

 

Introduction • Chromatic docs

Chromatic is a cloud-based toolchain that integrates with Storybook, Playwright, and Cypress to help teams test and review UI components.

www.chromatic.com

https://min-kyung.tistory.com/160

 

Chromatic์œผ๋กœ Storybook ์ง€์†์  ๋ฐฐํฌํ•˜๊ธฐ (Github Actions)

TL;DR 1. ์Šคํ† ๋ฆฌ๋ถ์„ ๋„์ž…ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ 2. chromatic์œผ๋กœ ์Šคํ† ๋ฆฌ๋ถ ๋ฐฐํฌํ•˜๊ธฐ 3. Github Actions๋ฅผ ์ด์šฉํ•ด Pull Reqeust์—์„œ ๋ฐ”๋กœ ์ปดํฌ๋„ŒํŠธ ํ™•์ธํ•˜๊ธฐ ์Šคํ† ๋ฆฌ๋ถ์„ ๋„์ž…ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ ํ˜‘์—…์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ

min-kyung.tistory.com

https://github.com/pnpm/action-setup

 

GitHub - pnpm/action-setup: Install pnpm package manager

Install pnpm package manager. Contribute to pnpm/action-setup development by creating an account on GitHub.

github.com