๐ฉ๐ป๐ป ํ ์คํธ๋ก ํด๋ฆญํ๋ฉด ๋ฒํผ์์ด ๋ฐ๋๋ ์ปดํฌ๋ํธ๋ฅผ storybook์ผ๋ก ๋ง๋ค๊ณ , chromatic CLI๋ก ๋ฐฐํฌํด ๋ณด์.
๐งพ ํด๋น ํ๋ก์ ํธ ์ค์ ์ ๋ค์์ ๋ฒ์ ๋ค์ ๊ธฐ์ค์ผ๋ก ์์ฑ๋์์ต๋๋ค.
โ pnpm 9.0.0
โ node >= 20
โ next 14.2.4
โ react ^18
โ chormatic ^11.5.5
โ storybook ^8.2.2
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 // โ ์ถ๊ฐ
}
๋ค์๊ณผ ๊ฐ์ด ๋ฐฐํฌ๋ ์ฌ์ดํธ์์ ํ์ธํ ์ ์๋ค.
(์ ํ) 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/
https://www.chromatic.com/docs/github-actions/
https://min-kyung.tistory.com/160
https://github.com/pnpm/action-setup