サイトを予約更新したい

このサイトは HTML で書いている部分と、Markdown で書いている部分とがある。そしてブログ部分はオレオレ SSG (Static Site Generating) している。サイトのソースコードは GitHub で管理している。

しかし、このサイトをホスティングしているのは XREA というサーバで、ココは FTP アップロードが原則だ。

XREA は2002年から使っていて気に入っているので、有料プランにして Value Domain を契約したぐらいなのだが、FTP というのがなかなかやりづらい。一応 SSH してサーバ領域を自分で操作することもできるのだけど、接続元 IP の許可が必要で、作業しようと思った時に5分待たされるので、あまり多用はできない。

GitHub Pages でホスティングするなら、GitHub Actions でコミットの度に全量ビルドしてブチ込めば良いのだが、FTP だとなかなかそうもいかない。どういうワケか ftp-client などの npm パッケージで CLI から繋いでいると頻繁に接続が切れるし、変更のない画像などをイチイチアップロードする必要もないので、都度全量アップロードしようと思うと無駄が多い。

そんなワケで、最近は master ブランチのコミットの度に、差分ファイルだけビルドしてそれを FTP アップロードするようにした。

ココまでは良かった。


自分が今までやっていたはてなブログでは、予約投稿機能を使って毎日記事を投稿していた。コレにより毎日定期的にウェブに露出できるので、それなりにアクセスをいただけていたのだ。予約投稿機能自体は大抵のブログサービスにあるフツーのモノだが、コレを静的サイトジェネレータでやろうと思うと結構大変だ。

一旦 FTP アップロードの話は忘れるとして、大抵の SSG はソースコードを Git 管理していて、CI ツールでビルド・デプロイされているだろう。本番リリースされる資材は mater ブランチにコミットされたモノと一致するのが自然な流れだが、そうすると予約投稿したい内容はその日付ごとに別ブランチで管理しておかないといけなくなる。一見「そうすりゃいいじゃん」なのだが、記事の予約投稿とは別に、ビルドシステムに手を加えたりしたい場合は面倒臭いことになる。ビルドやサイト全体の変更はまた別ブランチで行い master ブランチへマージするにしても、予約投稿しようとしているブランチとコンフリクトが置きていたりすると、毎日の定期実行でマージさせたりするのが難しくなる。

そんじゃあ、master ブランチに予約投稿の内容も全部コミットしておくけど、サーバにデプロイする資材を選択するようにしたら…?

そう思って、ブログ部分のビルドシステムを見直して、ビルド時点から見て未来日の資材はビルドしない仕組みにしてみた。

その制御自体は上手く作れたので、よーしコレで未来日の記事はデプロイされないな、と思ってたのだけど、もう一つ抜けていた。

ビルドは毎日動かして、未来日でなくなった資材を特定して、FTP アップロードしてやらないといけない。この差分はコミットログからは探せないので、ファイル名などから特定しないといけない。コレの作り込みを忘れていた…。


ブログコンテンツの場合は、ファイルパスで日付を表現しているので、こうした日付に応じた処理も何とか出来ると思うが、そうでない静的ページのコンテンツで予約投稿をやりたくなった場合はどうしようか。それも考えている。

ビルド前の各 HTML 内には、最終更新日を示す Front Matter (メタデータ) があるのだが、コレを未来日にしておいて、Grep してビルド・デプロイ対象を見つけるようにしようかな。Grep するとなると Node.js スクリプトだけじゃ済ませられないかもな。面倒くさくなってきた。

そして、こうした自前のビルドシステムを組み上げてはちょくちょく失敗したりしていて、その度にデプロイされ損ねたファイルを自分でアップし直している。スクリプトの修正コミットとコンテンツの更新コミットは分けてやらないといけないワケだが、面倒くさがっている。

なんかこー、かしこくやりたいんだけど、なかなか賢く作れない。