GitHub Actionsで一定時間ごとにコミット&プッシュを繰り返す→Vercelで自動デプロイ


最近Next.jsのチュートリアルを触り、初めてVercelにデプロイしてみたのですが、
GitHubにプッシュしたタイミングで自動でデプロイされる仕組みに感動しました。
技術どうこう語る方がいますが、たぶんあれは魔法だと思います。

Next.jsの学習開始とともに、ISRの概念についても学んでいたのですが、
もし、仮に強整合性を求められず単純に一定時間ごとにSSGしたいだけの場合、
「プッシュでデプロイしてくれるなら、ISRでなくともGitHub Actionsで一定時間ごとにプッシュすればいけるのでは?」と思い、今回実験してみました。

※ 見ての通り興味本位の記事です
※ 最近Next.jsを学び始めたばかりなのでこのあたりのベストプラクティスはわかりません
※ Next.jsチュートリアルで作成したリポジトリをそのまま使っています。nextjs-blogってやつです

シェルスクリプトを作る

一定時間ごとにコミット&プッシュを繰り返させると言っても、何の変更もなければコミットしようがないので、
github-action.logというログファイルを作り、ただそこに現在日時を追記することにしました。

write-to-log.sh
#!/bin/bash

echo `date` >> github-action.log
cat github-action.log
exit 0

GitHub Actionsを設定する

5分ごとに動くようcronでスケジュールしてみます。

.github/workflows/write-to-log.yml

name: write-to-log
on:
  schedule:
    - cron: '*/5 * * * *'

jobs:
  write-to-log:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@main
      - name: write-to-log
        run: |
          bash write-to-log.sh
      - name: git commit
        run: |
          git remote set-url origin https://github-actions:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}
          git config --global user.email "***@***.com"
          git config --global user.name "github workflow"
          git add .
          git commit -m 'write-to-log'
          git push origin main

動かしてみる

GitHub Actionsの仕様でしょうか、5分ごとで設定していたはずなのですが、
10〜20分ぐらいの間で繰り返し実行されていました。まぁ動いたのでOKです。

※ 実験をしてからこの記事を書くまでに6時間ほど空いてしまったので6 hors agoが並んでいる写真になってしまいましたが、実際は10〜20分おきに実行されていました。

Vercelのほうも問題なくデプロイされていました。

ということで実験成功です。

最後に

SSGJAMstackという概念を最近知ったので、Next.jsを学習しながら感動する日々を過ごしています。

去年会社でFirebaseを使ったアプリを作った際、公開範囲を広げた(使う人を増やした)タイミングで無料の50,000リクエストをオーバーしてしまったため有料版に切り替えるということがあったのですが、
そのアプリも強整合性を求めない(数時間ごとに更新されていればOKな)ものなので、
クライアントからフェッチさせるのではなく今回みたいな設計にすれば無料のままいけたりするのかな、と思ったりしています。

とはいえこのあたりの知識がまだ全然足りないので、引き続き学習を進めます。
「そういう要件なら◯○でやったほうがいいよ」みたいなコメントがあればとても嬉しいです。