
틀릴 수 있음 주의 😅
turborepo 환경에서 chromatic으로 storybook을 배포하는 실습 과정을 그대로 나열한 글입니다.
💥 먼저 해당 레포에 storybook이 설치되어 있어야 합니다.
우선 chromatic 페이지에서 로그인 후, chromatic 설정을 원하는 레포를 선택한다.
특정 organization이 보이지 않는다면 하단에 Check permissions를 눌러 해당 organization 접근을 허용시키면 된다.

루트에서 터미널에 아래 명령어를 실행시킵니다.
pnpm --filter [설치할 repo] add -D chromatic
예시:
pnpm --filter web-ui add -D chromatic
설치할 repo로 이동해 아래 명령어를 실행시킵니다.
npx chromatic --project-token <your-project-token>
또는
pnpm dlx chromatic --project-token <your-project-token>
chromatic 페이지를 따라가다 보면 한번 더 위 배포 명령어를 실행시키라는 문구가 나온다.
이 때, chromatic이 설치된 폴더 내부에서 컴포넌트의 일부를 변경한 뒤 위 명령어를 실행하면 자동으로 변경점에 대한 비교 및 분석을 시각적으로 보여준다.

chromatic 배포 명령어를 실행하면 chromatic에서 자동으로 package.json에 script를 추가해주는데 token이 노출되므로 token을 .env로 관리하는 것이 좋다.
package.json
"scripts": {
"chromatic": "npx chromatic --project-token=chpt_0123456789"
},
또는
"scripts": {
"chromatic": "pnpm dlx chromatic --project-token=chpt_0123456789"
},
우선 chromatic을 설치한 폴더 내부에 script 폴더를 생성한 뒤 script.sh 파일을 생성한다.
packages/web-ui/scripts/chromatic_publish.sh
CHROMATIC_TOKEN=$(grep CHROMATIC_TOKEN .env | cut -d "=" -f2)
npx chromatic --project-token=$CHROMATIC_TOKEN --exit-once-uploaded --allow-console-errors
또는
CHROMATIC_TOKEN=$(grep CHROMATIC_TOKEN .env | cut -d "=" -f2)
pnpm dlx chromatic --project-token=$CHROMATIC_TOKEN --exit-once-uploaded --allow-console-errors
루트에 있는 .env을 활용하고 싶었는데 아직 어떻게 하는지 몰라요.😭
.env
CHROMATIC_TOKEN=chpt_0123456789
이후에 루트에서 pnpm --filter web-ui run chromatic으로 확인해보면 정상적으로 실행된다.
{
"private": true,
"scripts": {
"build": "turbo run build",
"dev": "turbo run dev",
"lint": "turbo run lint",
"format": "prettier --write \"**/*.{ts,tsx,md}\"",
"build-storybook": "turbo run build-storybook --filter=web-ui"
},
"devDependencies": {
"@turbo/gen": "^1.9.7",
"eslint": "^7.32.0",
"eslint-config-custom": "workspace:*",
"prettier": "^2.5.1",
"turbo": "latest"
},
"packageManager": "pnpm@7.15.0",
"name": "turborepo-chromatic"
}
더 나아가 stories.tsx 파일을 변경한 pr을 올렸을 때도 즉각 변경 사항을 확인하고 싶다면 github actions를 추가하면 된다.
레포지토리의 Setting/Secrets and variables/Actions에서 chromatic token을 넣어준다.

.github/workflows/chromatic.yml를 생성해 yml 파일을 작성해준다.

script를 다음과 같이 수정해 해결할 수 있었다.
"scripts": {
"chromatic": "bash ./scripts/chromatic_publish.sh"
},
처음에는 Install Dependency 부분에서 pnpm을 찾지 못하는 에러를 마주했다.

Install pnpm step을 추가해 해결할 수 있었다.
name: "Chromatic Deployment"
on:
pull_request:
branches: [main]
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
run: |
npm install -g pnpm
- name: Install Dependency
run: pnpm install -no-frozen-lockfile
working-directory: packages/web-ui
- name: Publish Chromatic
id: chromatic
uses: chromaui/action@v1
with:
workingDir: packages/web-ui/src
projectToken: ${{ secrets.CHROMATIC_TOKEN }}
token: ${{ secrets.GITHUB_TOKEN }}
- name: Create comment PR
uses: thollander/actions-comment-pull-request@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
message: "🚀storybook: ${{ steps.chromatic.outputs.storybookUrl }}"
또 다시 변경점을 주어야 한다는 문구이다...

chromatic이 설치된 부분에서 임의의 컴포넌트를 변경한 후
pnpm --filter web-ui run chromatic 실행시킨 뒤 다시 pr을 올리면 해결된다.
이제는 되나 싶었는데 Workflow permissions 에러가 발생했다.
레포지토리의 Setting/Actions/General/Workflow permissions에서 다음과 같이 변경한다.

✅ 이제야 초록불ㅠㅠ
이렇게만 yml 파일을 작성한다면 storybook과 관련없는 패키지에서 작업한 pr을 올렸을 때도 항상 chromatic이 실행된다.
아래와 같이 트리거할 경로를 적어주어 해당 경로에서만 pr을 올렸을 때 실행시키도록 했다.
on:
pull_request:
branches: [main]
paths:
- packages/web-ui/src/**
처음에는 이렇게도 작성할까 싶었지만 stories 파일과 관련된 component.tsx가 변경되어도 chromatic 배포가 이루어졌으면 해서 트리거할 폴더를 작성하는 것으로 다시 변경했다.
paths:
- "**.stories.ts"
- "**.stories.tsx"
packages/web-ui/src에서 변경된 경우에만 트리거되는 것을 확인할 수 있다.
📌 paths/paths-ignore
상황에 따라 paths-ignore도 활용하면 좋을 것 같다.
pnpm/GitHub Actions
pnpm과 관련된 github actions 내용을 찾아보니 pnpm에서 제공하는 setup-pnpm이 있었고 이를 적용해보았다.
위 전체 yml 파일에서 Install pnpm step을 아래와 같이 변경했다.
- name: Install pnpm
uses: pnpm/action-setup@v2
id: pnpm-install
with:
version: 8
run_install: false
아래는 전체 코드이다.
name: "Chromatic Deployment"
on:
pull_request:
branches: [main]
paths:
- packages/web-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
uses: pnpm/action-setup@v2
id: pnpm-install
with:
version: 8
run_install: false
- name: Install Dependency
run: pnpm install -no-frozen-lockfile
working-directory: packages/web-ui
- name: Publish Chromatic
id: chromatic
uses: chromaui/action@v1
with:
workingDir: packages/web-ui/src
projectToken: ${{ secrets.CHROMATIC_TOKEN }}
token: ${{ secrets.GITHUB_TOKEN }}
- name: Create comment PR
uses: thollander/actions-comment-pull-request@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
message: "🚀storybook: ${{ steps.chromatic.outputs.storybookUrl }}"
Dependency를 매번 install 하지 않고 caching 하면 더 좋을 것이라 판단했다.

아래는 최종 yml 파일이다.
name: "Chromatic Deployment"
on:
pull_request:
branches: [main]
paths:
- packages/web-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
uses: pnpm/action-setup@v2
id: pnpm-install
with:
version: 8
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/web-ui
- name: Publish Chromatic
id: chromatic
uses: chromaui/action@v1
with:
workingDir: packages/web-ui/src
projectToken: ${{ secrets.CHROMATIC_TOKEN }}
token: ${{ secrets.GITHUB_TOKEN }}
- name: Create comment PR
uses: thollander/actions-comment-pull-request@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
message: "🚀storybook: ${{ steps.chromatic.outputs.storybookUrl }}"
위 yml을 반영하면 아래처럼 처음에는 cache를 찾지 못해 dependency를 install하는데

한번 더 실행하면 cache가 제대로 된 것을 확인할 수 있다.

cache를 이용하지 않은 경우, Install Dependency에서 34초가 소요되었지만

cache를 적용하니 8초로 대폭 줄어든 것을 확인할 수 있었다.

pnpm + turborepo 환경에서 chromatic을 이용해 storybook을 배포하는 글이 없어 많이 삽질을 했는데 그래도 제대로 적용되는 것 같아 기쁘다.....🫠
Automate Chromatic with GitHub Actions
Storybook Deploy with Chromatic
Chromatic으로 Storybook 지속적 배포하기 (Github Actions)
좋은 글 감사합니다~~👏