本サイトのCI/CDがNetlifyのビルドサービスを利用したが、最近Github Actionsに移行しました。キッカケはrenovateの導入およびGatsbyJSのビルド問題となります。
tl;dr
NetlifyへデプロイするためにGithub Actionを作りました。キャッシュもちゃんと効くので、Netlifyのビルドサービスに負けないビルドを体感できます。
https://github.com/thundermiracle/netlify-deploy
renovateの導入およびGatsbyJSのビルド問題
-
renovateの導入により、プルリクエストの数が増えてきました。
Netlifyのビルドに使える時間について、無料枠なら1カ月わずか300分となり、public, privateと関わらず、全部カウントされるので、1週間だけでも75%のビルド時間を使いました
-
GatsbyJSのプラグインgatsby-plugin-sharpのバージョンアップにより、メモリの消費量が増えてきて、Netlifyでビルドできなくなってきました。
https://github.com/gatsbyjs/gatsby/issues/35055
success Running gatsby-plugin-sharp.IMAGE_PROCESSING jobs - 12.929s - 90/90 6.96/s error UNHANDLED EXCEPTION write EPIPE Error: write EPIPE
Netlifyについて
Netlifyのビルドサービスのメリット
- 設定は特に簡単:GatsbyJSのサイトを例として、
netlify.toml
に下記のものを追記し、Netlifyの管理画面からレポジトリを選択するだけでです。
[build]
command = "yarn && yarn build"
publish = "public"
- ビルドスピードを向上するためのGatsby専用なプラグインが存在する
元々Jamstackの推進者の一員として、GatsbyJSとNetlifyの関係は深いということです。
- プルリクエストにデプロイログおよびプレビューURLをコメントしてくれる
Netlifyのビルドサービスのデメリット
-
ビルドに使える時間が短い
public, privateと関わらず、全部カウントされるが、Starterプランなら使えるビルド時間1カ月わずか300分となります。ライバルのVercelが6000分、Github Actionsがpublicなら無制限、privateなら2000分と比べると、かなり短いでしょう。
Netlify Pricing:
Vercel Pricing:
Github Actions Pricing:
※どのサービスを使うかは、Build minutesのみで決まらないので、それぞれのサービスの詳細は自分で確認してください。
Github ActionsにてGatsbyJSサイトをNetlifyへデプロイ
Netlifyと比べると結構面倒です。
Netlify中の処理
-
NetlifyのCDを停止
Site settings → Build & deploy → Continuous Deployment → Build settingsから、CDを停止します。
-
SiteのAPI IDを取得
Site settings → General → Site details → Site informationからAPI IDを取得します。
-
Personal access tokenを取得
User settings → Applications → Create new tokenから、Personal access tokenを取得します。
レポジトリの設定
-
Actions secretsを登録
レポジトリのSettings → Secrets → Actionsから登録します。
NETLIFY_SITE_ID
: NetlifyのSiteのAPI IDNETLIFY_AUTH_TOKEN
: NetlifyのPersonal access token
Github Actionsの設定
いよいよ始まります。もちろん自分でNetlify-cliをGithub Actionsの実行する時インストールし、スクリプトを組んでNetlifyへアップロードして問題ありません。ステップをできる限り簡単にするために、今回は既存のGithub Actionsを利用します。
利用するGithub Actions一覧。
※action-netlify-deploy
にキャッシュが効かなく多少スピードが遅いので、スピードに気になる方は自分でGithub Actionsのスクリプトを書いたほうがいいかもしれません。
プルリクエストのためのCDの設定
-
トリガーの設定
とりあえず全てのプルリクエストを設定しましょう。
on:
pull_request:
-
プレビューモードでデプロイ
プルリクエストを受け取ったら、プレビューモードでデプロイします。
steps:
- name: checkout
uses: actions/checkout@v3
- name: deploy preview version of GatsbyJS to Netlify
uses: jsmrcaga/action-netlify-deploy@v1.7.2
id: deploy_preview
with:
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}
build_command: yarn && yarn build
build_directory: 'public'
分解してみましょう。
uses: actions/checkout@v3
は、Github Actionsのチェックアウトを行うためのスクリプトです。uses: jsmrcaga/action-netlify-deploy@v1.7.2
は、Netlifyへのデプロイを行うためのスクリプトです。id: deploy_preview
は、他のステップが今のステップのoutputsを参照するためのIDです。with:
は、Netlifyへのデプロイに必要なパラメータを設定します。build_command: yarn && yarn build
は、GatsbyJSのビルドコマンドです。build_directory: 'public'
は、GatsbyJSのビルド結果を置くディレクトリです。
これでNetlifyのプレビューモードへのデプロイの設定が完了です。
-
プルリクエストへのコメントを追加
デプロイログとプレビュー用のURLをコメントに追加すると、プルリクエストに問題のないことの確認が簡単にできるでしょう。 このステップは、
find-comment
とcreate-or-update-comment
を使用しています。まず、やりたいことはこちらです。
- コメントが存在しない場合は、
create-or-update-comment
を使用して、コメントを作成します。 - コメントが存在する場合は、
find-comment
を使用して、コメントを検索し、create-or-update-comment
を使用して、コメントを更新します。
- コメントが存在しない場合は、
steps:
- name: find the comment
uses: peter-evans/find-comment@v1
id: fc
with:
issue-number: ${{ github.event.pull_request.number }}
comment-author: 'github-actions[bot]'
body-includes: Netlify Preview Deployment Information
- name: create or update comment
uses: peter-evans/create-or-update-comment@v1
with:
comment-id: ${{ steps.fc.outputs.comment-id }}
issue-number: ${{ github.event.pull_request.number }}
body: |
Netlify Preview Deployment Information
- Log URL: ${{ steps.deploy_preview.outputs.NETLIFY_LOGS_URL }}
- Preview URL: ${{ steps.deploy_preview.outputs.NETLIFY_PREVIEW_URL }}
edit-mode: replace
分解してみましょう。
issue-number
は、プルリクエストのIssue番号です。comment-author
は、コメントの作成者です(github actions[bot]に固定)。body-includes
は、コメントの本文に含める文字列です。
これでターゲットのコメントが検索できるようになりました。
comment-id
は、find-commentステップによって取得したコメントのIDです。(ない場合は空)issue-number
は、プルリクエストのIssue番号です。body
は、コメントの本文です。Netlify Preview Deployment Information
は、コメントの本文のタイトルとなり、検索用の文字列でもあります。${{ steps.deploy_preview.outputs.NETLIFY_LOGS_URL }}
は、Netlifyへデプロイステップによって生成されたログのURLです。${{ steps.deploy_preview.outputs.NETLIFY_PREVIEW_URL }}
は、Netlifyへデプロイステップによって生成されたプレビューのURLです。 ※action-netlify-deploy
のoutputsはこちらへ。
edit-mode
は、replaceにすると、コメントを追加ではなく、更新することを表します。
これで、プルリクエストのための設定が完了しました。
プルリクエストする時は、プレビューモードにデプロイしてくれて、このようなコメントも追加してくれます。
マージ後のCDの設定
マージしたら、プロダクションモードでデプロイするようにしましょう。設定は、.github/workflows/production.yaml
とほぼ同じです。ただし、コメントなどいらないため、コメント関連の設定は不要となります。
name: 'Netlify Deploy'
on:
push:
branches:
- master
jobs:
deploy:
name: 'Deploy'
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v3
- name: deploy production version of GatsbyJS to Netlify
uses: jsmrcaga/action-netlify-deploy@v1.7.2
with:
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}
NETLIFY_DEPLOY_MESSAGE: "Prod deploy v${{ github.ref }}"
NETLIFY_DEPLOY_TO_PROD: true
build_directory: 'public'
build_command: yarn && yarn build
唯一注意しなければいけないのは、NETLIFY_DEPLOY_TO_PROD
をtrueにすることです。
完了
これでNetlifyのビルドとほぼ同じDXの設定が完了です。Github Actionsがめっちゃ面白いですね。ご参考までに。