notebook

都内でWEB系エンジニアやってます。

Cloudflare PagesでGatsby5.12以上を動かすにはBuildSystemV2が必要

Gatsby + Cloudflare Pagesで作っているブログサイトの話

Renovateで自動的にバージョンを上げているが5.11 -> 5.12へのPRでCloudflareのビルドが失敗するようになっていた

  • 失敗時のログ
|02:55:49.076|NestedError: Cannot copy from `.cache/api-runner-browser-plugins.js` to `/opt/|
|02:55:49.076|build/cache/cwd/.cache/api-runner-browser-plugins.js`: Cannot create directory|
|02:55:49.077|`/opt/build/cache/cwd/.cache`: EACCES: permission denied, mkdir '/opt/build/c|
|02:55:49.077|ache'|
|02:55:49.079||
|02:55:49.079|- index.js:274 pMap.concurrency.concurrency|
|02:55:49.080|[adapters]/[cpy]/index.js:274:12|
|02:55:49.080||
|02:55:49.080|- index.js:141|
|02:55:49.080|[adapters]/[p-map]/index.js:141:20|
|02:55:49.080||
|02:55:49.081|- Caused By: NestedError: Cannot create directory `/opt/build/cache/cwd/.cache|
|02:55:49.081|`: EACCES: permission denied, mkdir '/opt/build/cache'|
|02:55:49.081||
|02:55:49.081|- fs.js:61|
|02:55:49.082|[adapters]/[cp-file]/fs.js:61:8|
|02:55:49.082||
|02:55:49.082|- index.js:15 cpFileAsync|
|02:55:49.082|[adapters]/[cp-file]/index.js:15:2|
|02:55:49.082||
|02:55:49.083|- index.js:269 pMap.concurrency.concurrency|
|02:55:49.083|[adapters]/[cpy]/index.js:269:6|
|02:55:49.083||
|02:55:49.084|- index.js:141|
|02:55:49.084|[adapters]/[p-map]/index.js:141:20|
|02:55:49.084||
|02:55:49.084|- Caused By: Error: EACCES: permission denied, mkdir '/opt/build/cache'|

Cloudfalre側で対応してもらわといと厳しそう?

さっと調べた感じではよく分からずどうしようもなさそう…という結論でいったん時間を置くことにしてた

Build system v2

別のタイミングで、Cloudflare Pagesでビルドキャッシュが使えるとの記事を発見した(リンクは失念してしまった)

見ているとBuild systemのv2を使うと書いてあり、その中で、新たなビルドイメージと書いてあったので新しいバージョンのGatsbyにも対応しているかも?ということで試した

  • Build system v2の記事

Modernizing the toolbox for Cloudflare Pages builds

blog.cloudflare.com

  • ドキュメント

Language support and tools · Cloudflare Pages docs

developers.cloudflare.com

これにより、サポートされる言語バージョンが上がる、ビルドキャッシュを使えるようになるなど色々メリットがあるよう

で、実際に試したらしっかり動いたので無事Gatsby v5.12でデプロイした

Build system v1との違い

デプロイ時、コンテンツに差分があるかチェックして挙動を変えたかったためシェルスクリプトも使っていて、その中でjqを使っていたがBuild v2だとjqが入っていなかった

対応として、スクリプトの先頭でjqをインストールするコマンドを入れた

curl -o $HOME/.local/bin/jq -L https://github.com/jqlang/jq/releases/download/jq-1.7/jq-linux64 && chmod +x $HOME/.local/bin/jq

インストール先は、PATHが通っているディレクトリを探しその中から、$HOME/.local/binが良さそうと判断して決めた

また、node_modules/.binのディレクトリがv1のときはPATHに含まれていたがv2では含まれなくなったようで単純にgatsby buildするだけだとコマンドがないと怒られる

なのでこちらはyarn build(gatsby build)というようにyarnを通して実行するようにした

  • 対応したときのPR、他にも色々修正入れているので参考になるかは微妙

Cloudflare build v2 by swfz · Pull Request #1637 · swfz/til

ビルドキャッシュについては一応ONにしてみたが、効果など確認してないので後日確認したい