できるだけ長時間動かす

Glitch はそのままだと5分 HTTP アクセスがないと停止してしまいます。また12時間ずっと立ち上がっていても停止します。これは新しい HTTP アクセスがくると再度立ち上げてくれますが、少しラグがでます。

ということで、少しは止まってしまうもの定期アクセスがあれば23時間50分ぐらいは動かせれそうです。そこで使うのがcron-job.orgというサイトです。
これは定期的に(2,5分毎など)や特定の時間に指定したメソッドで HTTP アクセスの処理を予約できるサイトです。なので2分毎に自分の Glitch 上の Web アプリにアクセスすることで停止するのを防ぐようにします。

Express での例

これは簡単で、単にそれ用の GET ルートを作ってそのに定期アクセスするだけです。一応200は返す作りにしましょう。これはcron-job.orgのデフォルト設定ですが、「 HTTP アクセスに失敗しまくった時はその定期処理を一時停止する」というような設定になっています。これはオフにできるのですが、個人的にcron-job.orgの管理が楽になると思うので、 Web アプリ側を対応したほうが後々楽だと思います。

というわけでこんなコードを書きました。

const express = require('express');

const app = express();

app.get('/cron-job', (_, res) => {
  res.send('working!');
});

app.listen(3000);

https://<glitch-project-name>.glitch.me/cron-jobという URL にアクセスするとworking!と表示されるページができました。

定期処理の設定

適当に認証だけ済ませます。そして Cronjobs タブから「Create cronjob」をクリックします。

Image from Gyazo

アドレスには先程作った/cron-jobの URL を指定します。タイトルは何でもいいです。またデフォルトでは「Every 15 minute(s)」となっているので「Every 2 minute(s)」に忘れずに設定します。

登録して完了です。

git push で自動反映

Glitch でアプリケーションを作成するとそのプロジェクトはノンベアな Git リポジトリとして作られます。その為、上手いことやればgit push後に更新内容を即反映させれます。

ローカルマシンの準備

まずはgit pushできるようにする必要があります。

Glitch でアプリケーションを作った後の下部メニューにある Tools から確認できます。この URL がgit push先になります。

その URL がhttps://...@api.glitch.com/git/<アプリ名>のような場合、

git clone https://...@api.glitch.com/git/<アプリ名> --origin glitch
# リモート名を glitch としてクローンする

で持ってくるか、既存のプロジェクトの場合はglitchというリモート URL 情報を追記します。

git remote add glitch https://...@api.glitch.com/git/<アプリ名>

これでgit push glitch <branch>git pushコマンドは叩けるようになりました。

Glitch 側の準備

こちらは2つの準備が必要です。

  1. ローカルからgit pushできるように
  2. アプリ更新されるように

ローカルから git push できるように

今の状態ではまだ Glitch へgit pushできません。上記でも書いたとおりノンベアなリポジトリだからです。ちなみんこれは Glitch 上でmasterにいる場合masterへはgit pushできないことを意味します。

ですが、この制約は解除することが可能です。これには Glitch 側のコンソールに入りプロジェクトディレクトリの中で git config --add receive.denyCurrentBranch ignoreを実行します。
これでローカルからここへgit pushできるようになりました。

制約解除については、複数人で開発しているような場合に、履歴が狂わないようとの制約ですが、目的は単にアプリケーションを最新の状態にすることだけであって、コードの管理ではない為(それは GitHub などで行う)この制約は無くしても大丈夫だと考えます。

アプリ更新されるように

git pushされた後コードは更新されるはずですが、まだ完全ではありません。Glitch ではアプリケーションの更新にはターミナルでrefreshというコマンドを叩く必要があります。

この解決には Git フックのサーバーサイドフックであるpost-receiveフックを使います。これはgit pushされコードの更新などされた後に実行されるフックです。
Glitch ターミナルから.git/hooks/post-receiveファイルを以下のように書き換えます。

#!/bin/sh

cd /app;
git --git-dir=.git reset --hard
refresh

これは、

  1. /appディレクトリ(リポジトリ)へ移動
  2. 何故か差分があるので最新コードにリセット
  3. refreshでアプリケーション更新

を行います。

最後にこのファイルへ実行権限を渡しておきます。

chmod +x .git/hooks/post-receive

確認

うまく設定できれば、適当にgit push glitch ...後に一連のフローでアプリケーションが更新されるはずです。