21
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

コードレビューに役立つ React Storybook の閲覧環境を作る

Last updated at Posted at 2017-12-16

本エントリでは、CircleCI と Storybook を組み合わせて、GitHub のプルリクエストから簡単に Storybook を表示する方法を紹介します。

はじめに

Storybook は React をコンポーネント単位で開発することができる開発環境です1

私の会社でも少し前から導入しているのですが、コードレビューの時に GitHub 上から Storybook が開けたらなあと思うことがありました。
やりかたは色々あると思いますが、今回は CircleCI を使って、手軽に Storybook を閲覧できる環境をつくる方法を紹介します。

説明は良いからサンプルが欲しい!という人は、
リポジトリを用意したのでご覧ください。

手順

さっそく導入方法に入りますが、Storybook が既に build-storybook という便利な機能を用意してくれているので、特別難しいことはありません。
以下のような手順になります。

  1. GitHub に push
  2. CircleCI でテストを実行
  3. build-storybook コマンドで Storybook の静的ファイルを作成し、Build artifacts フォルダに保存
  4. 生成された html ファイルへのリンクを GitHub のプルリクエストコメントとして投稿
  5. レビュアーがリンクから Storybook を開く

導入

今回、コンポーネントに変更がない場合は、Storybook の生成をスキップするようにしました。

以下、storybook の導入は終わっていると仮定して、重要な部分のみ説明します。
途中に出てくる GITHUB_API_TOKEN は GitHub の API トークンを入れた環境変数です。プルリクエストにコメントを POST できる権限を与えたトークンを CircleCI の設定画面で登録しておいてください。

まず、build-storybook コマンドを npm コマンドで使えるようにしておきます。

package.json
{
  ...
  "scripts": {
    "build-storybook": "build-storybook -c .storybook"
  },
  ...
}

メインとなる処理。やや長いので設定ファイルから分離しています。
条件判定が大雑把なのはご了承ください。

scripts/build-storybook-for-code-review.sh
#!/bin/bash
set -eu

# コンポーネントに変更がなければスキップ
if git diff master...HEAD --name-only | grep -q "src/\|stories/" ; then
  :
else
  echo "[Storybook] Skip"
  exit 0
fi

# プルリクエストが作られていなければスキップ
PULL_REQUEST_ID="${CI_PULL_REQUEST##*/pull/}"
if [ -z "$PULL_REQUEST_ID" ]; then
  echo "[Storybook] Skip"
  exit 0
fi

# 静的ファイルを作り build artifacts として保存
npm run build-storybook
mkdir -p "$CIRCLE_ARTIFACTS/storybook/"
mv storybook-static "$CIRCLE_ARTIFACTS"

# GitHub のプルリクエストにリンクを付けてコメントを投稿
STORYBOOK_URL="$CIRCLE_BUILD_URL/artifacts/$CIRCLE_NODE_INDEX/$CIRCLE_ARTIFACTS/storybook-static/index.html"
curl -X POST \
     -H "Authorization: bearer $GITHUB_API_TOKEN" \
     -H "Accept: application/vnd.github.v3.html+json" \
     -d "{\"body\":\"[Storybook] Created ([view stories]($STORYBOOK_URL))\"}" \
     "https://api.github.com/repos/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/issues/$PULL_REQUEST_ID/comments"

CircleCI 設定例を載せておきます。
以下は 1.0 の設定ですが、少し修正すれば 2.0 でも使えるはず。。

circle.yml
machine:
  node:
    version: 8.9.3
deployment:
  development:
    branch: /feature\/.*/
    commands:
      - ./scripts/build-storybook-for-code-review.sh

実行例

Screen Shot 2017-12-16 at 10.55.08.png 図1: GitHub Screen Shot 2017-12-16 at 10.57.43.png 図2: Storybook

おわりに

iframe などで Storybook の画面を埋め込めるとさらに便利かもしれませんが、そこそこ快適になりました。
現状、プルリクエストを作ってから CircleCI が実行されないと、コメントが投稿されないという問題があるので、そのうち直したいです。

Travis CI でも同様の環境を作ることはできますが、AWS S3 のバケットを自分で用意しておく必要がありそうです。

  1. 最近は Vue.js にも対応したようです。

21
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?