Skip to content

Design System Publish in NPM (3)

Published: at 오전 09:52

해당 게시글은 vite v4, typescript v5, react v18, storybook v8, pnpm v8 환경에서 작성되었습니다.

Storybook & NPM 배포 자동화

YDS는 github action을 활용하여 storybook을 버전 별로 aws s3에 배포하며, 패키지를 npm에 배포하고 있다.

  1. S3 버킷 생성 및 설정 - 생략
  2. Bucket Versioning 설정

Storybook을 버전 별로 배포하기 위해 먼저 AWS S3 버킷 버전 관리를 활성화한다.

YDS는 {주소}/v0.1.0/* 형태로 Storybook을 배포하고 있다!

버전 정보는 deploy 전 package.json에서 가져오며, deploy 시 가져온 버전 정보를 넣어주도록 yml script를 작성하였다.

- name: Extract version from package.json
  id: version
  run: echo ::set-output name=VERSION::$(node -p "require('./package.json').version")

- name: Deploy to s3
  env:
    AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
    AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
  run: |
    aws s3 cp \
      --recursive \
      --region ap-northeast-2 \
      ./storybook-static \
      s3://yds-react-storybook/${{ steps.version.outputs.VERSION }}
  1. Repository secrets 등록
  1. .npmrc 설정

로컬에서 npm publish를 진행할 때는 로그인이 되어있는 상태였기 때문에 문제가 발생하지 않았지만, github action에서는 로그인 NPM_TOKEN을 넣어주지 않을 시 인증 에러가 발생하였다.

따라서 root 경로에 .npmrc 파일을 생성하고, yml에서 사용하는 NPM_TOKEN을 넣어주었다.

//registry.npmjs.org/:_authToken=${NPM_TOKEN}

yarn to pnpm in github workflow

YDS는 원래 yarn을 사용하고 있었지만 최근 pnpm으로 마이그레이션을 진행하였고, 이에 따라 workflows 명령어도 변경이 필요했다.

# 변경 전 yarn 명령어를 사용하던 steps 부분
- name: Install dependencies
  run: yarn install --immutable --immutable-cache --check-cache

- name: Build storybook
  run: yarn build-storybook --output-dir=storybook-static

해당 부분을 변경하지 않는다면 Install dependencies에서 에러가 발생하며, 변경 시 yarn과 달리 (pnpm의 경우) set up 및 version을 명시해주어야 한다.

Set Up을 하지 않았을 경우

PackageManager, Version 명시를 하지 않았을 경우

# 전체 코드 (packageManager: pnpm)
name: build and deploy storybook to s3, publish to npm

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout source code
        uses: actions/checkout@v3

      - name: Set up pnpm
        uses: pnpm/action-setup@v2
        with:
          version: 8

      - name: Set up Node.js
        uses: actions/setup-node@v3
        with:
          node-version: 20

      # 이전 yml script와 달리 cache 설정을 따로 하지 않았다.
      - name: Install dependencies
        run: pnpm install

      - name: Build
        run: pnpm build

      - name: Build storybook
        run: pnpm build-storybook --output-dir=storybook-static

      - name: Extract version from package.json
        id: version
        run: echo ::set-output name=VERSION::$(node -p "require('./package.json').version")

      - name: Deploy to s3
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        run: |
          aws s3 cp \
            --recursive \
            --region ap-northeast-2 \
            ./storybook-static \
            s3://yds-react-storybook/${{ steps.version.outputs.VERSION }}

      - name: Publish to NPM
        run: npm publish
        env:
          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

yml 작동 과정을 간략하게 요약해보자면, main branch로 push가 되면, jobs의 steps 순서대로 실행된다.

Storybook 문서 url이 현재 버전 정보를 포함하고, NPM 패키지도 정상 배포 되었다면 성공이다!

개발자에게 효율은 생명 ¡¡¡( •̀ ᴗ •́ )و!!!

Reference