ブログをJekyllからGatsby+Netlify CMSに移行する(途中)

この記事は [PONOS Advent Calendar 2019](https://qiita.com/advent-calendar/2019/ponos) の 15 日目の記事です。
昨日は @karizumai さんの [Unity で UI テストの自動化をやってみた](https://qiita.com/karizumai/items/502cb7977abc7c0f140f)でした。

## はじめに

この記事はまだ途中です。:weary: 力尽きました。

近々ちゃんと完了させて追記します。

### 今回やりたいこと

Jekyll+GitHub Pagesで運用していたブログを、Gatsby+Netlify CMSに移行したい。
理由は特にないんですが、GatsbyはReact.jsとGraphQLで出来ていて素敵だという噂を聞いたもので。

JekyllではMarkdownで全記事を書いていたので、ちょっと書き換えるだけで大半は移行できるんじゃないかと思っています。(いました。)

## やったこと

### GatsbyのQuickStartを見てみた

[QuickStart|GatsbyJS](https://www.gatsbyjs.org/docs/quick-start/)

インストールしてnewして``gatsby develop``したら表示できると。
Jekyllもこんな感じだったので、静的サイトジェネレータは大体こうなのかな？

### Netlifyを調べた

[Netlify](https://www.netlify.com/)

静的サイトジェネレータで生成したWebサイトをホスティングしてくれるサービス。
[Pricing](https://www.netlify.com/pricing/)のページを見た感じ、個人のブログくらいなら無料の範囲で全然やっていけそう。

### Netlify CMSを調べた

Jekyllでブログを書くとき、画像の取り扱いがめっちゃ面倒でした。

1. 画像に名前をつけて保存する
2. 所定のディレクトリに配置する
3. 記事の中にMarkdownで入力する

**「ワイは画像をエディタにコピペするだけで良い塩梅で取り込んで欲しいんや！！」**

そういう気持ちを込めて調べていたところ、[Netlify CMS](https://www.netlifycms.org/)というサービスがあり、どうやら画像を良い塩梅で扱ってくれそうなことを知りました。

### サイトを生成した

Netfily CMSに必要なアレコレを追加した上でサイトを生成してくれる[スターター](https://app.netlify.com/start/deploy?repository=https://github.com/AustinGreen/gatsby-starter-netlify-cms&stack=cms)があったので、それで生成。

自分のGitHubアカウントと連携して、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/2b8597f4-29ea-fa8a-5b46-b61e608fd74c.png)

サイトのソースコードを管理するリポジトリ名を指定して、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/d1b70c82-566e-ded1-690d-e36416f7074d.png)

自動生成→デプロイされるのを待つと、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/188a6b30-7a64-fd66-f458-8c00e447cd8b.png)

自動生成されたURLでホストされた状態で見えるようになりました。
独自ドメインは別途設定しないといけないみたいです。

どう見てもコーヒー屋さんのブログにしか見えませんが、Netlify CMSで生成した初期状態がこれです。

### 手元で編集できるようにした

この時点で、指定したリポジトリにソースコードが置かれている状態です。
新規記事を書くのはCMSでやってみるとして、まずは既存の記事を移行したりブログの設定を変えるため、ローカルにクローンしてきます。

クローンしたあとは

```
$ npm install
$ netlify develop
```

これでローカルで確認できるようになります。
記事の本文変更くらいなら自動リロードしてくれるみたいです。

### 記事を移行する

Jekyll版ブログから既存の記事を移行しようとしています。

自動生成で出来たコーヒー屋さん記事のMarkdownは、``/src/pages/blog/``配下に置かれているようなので、とりあえず同じパスに旧ブログから持ってきてみました。

するとエラー。

```
 ERROR #11325

Your site's "gatsby-node.js" created a page with a component that doesn't exist.

The path to the missing component is "/Users/honeniq/.ghq/github.com/honeniq/uwazumi.honeniq.net/src/templates/null.js"

The page object passed to createPage:
{
    "path": "/blog/2019-12-05-lily58/",
    "tags": [
        "Keyboard",
        "Hardware"
    ],
    "component": "/Users/honeniq/.ghq/github.com/honeniq/uwazumi.honeniq.net/src/templates/null.js",
    "context": {
        "id": "7face34d-7bf5-560d-9ca1-2fbd65b9324e"
    }
}

See the documentation for the "createPage" action — https://www.gatsbyjs.org/docs/actions/#createPage

not finished createPages - 0.102s
```

``/src/templates/null.js``が無いのでエラーになっているようです。

コーヒー屋さんの記事のFrontmatterには``templateKey: 'blog-post'``があるけど、自分の記事には無いのが問題のようです。
Jekyllの場合、``layout: post``の形式で指定していたので、ここは置き換えないといけない模様。

置き換えると、エラーが消えて表示できるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/6ae42f1d-c164-43ae-6759-a1a2fffe9311.png)

### 画像を表示できるようにする

画像ファイルを置く場所がJekyllと違うらしく、リンク切れになっていました。
Gatsby CMSの場合は``/static/img/``に入れておけばいいみたいです。

ここに画像を置いて、記事のMarkdown中のパスも修正すると、表示できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/14dbb9b3-17f7-0a87-e615-c67f138e7540.png)


### 記事のリダイレクト設定をする

Jekyllでは``/YYYY/MM/DD/xxxx.html``の形式で各記事のパーマリンクを作っていました。
Netlify CMSのデフォルトだと``/blog/YYYY-MM-DD-xxxx/``に設定されているようです。
特にこだわりがあるわけじゃないので、そのまま使います。

ただ、旧パスでアクセスできないのはまずいので、旧パスから新パスにリダイレクトさせるように設定します。

色々試してみた結果、[gatsby-redirect-from](https://www.gatsbyjs.org/packages/gatsby-redirect-from/)というプラグインを入れると、転送できるようになりました。

```
redirect_from: 
  - /2019/02/05/island-transfer-phangan.htm
```

Frontmatter内で``redirect_from``に転送元パスを書いておいてあげればOKです。

## いまハマっているところ

### Featured Image のエラー

だいたい記事の移行が終わったので、自動生成されたコーヒー屋さんの記事を消してみたところ、エラーが出るようになりました。

```
 ERROR #85909  GRAPHQL

Field "featuredimage" must not have a selection since type "String" has no subfields

File: src/components/BlogRoll.js:89:31

failed extract queries from components - 0.558s
```

色々切り分け中ですが、力尽きたのでまた明日にします。:sleepy:

明日は @ackyla さんです。