Skip to content

Instantly share code, notes, and snippets.

@xl1
Last active September 15, 2024 07:52
Show Gist options
  • Save xl1/3b7835c6c5b25b5cf1f9348b4cf5aeca to your computer and use it in GitHub Desktop.
Save xl1/3b7835c6c5b25b5cf1f9348b4cf5aeca to your computer and use it in GitHub Desktop.
Git-backed self modifying application

Git-backed self modifying application

管理するデータをローカルファイルとして、とくに実行されるソフトウエアと同じディレクトリの下に保存する、古典的なアプリケーションがある。 このデータは普通なんらかの構造化されたファイルになっているが、これを git などでバージョン管理することを考える

とくにそのアプリのコードがスクリプト言語で直接実行される場合は、コードとデータを同じリポジトリにして、 区別せずにバージョン管理することが(良いかどうかは別として)できるだろう

ソフトウエア自体が、「自身のリポジトリにコミットを積む」という機能を持っていてもよい

flowchart LR
 subgraph repository
  direction RL
  code --commit--> data
  data --use--> code
 end
Loading

さらに、これをローカルではなく GitHub(など)の上にホストされたリポジトリで行うことを考える。 こうすると、もうソフトウエアをどこか固定のマシンで動かす必要はない

GitHub Actions でソフトウエア(= コードとデータ)の配置を自動化することで、アプリが書き換えたデータを再反映するループができる。 もうコードと実行されるアプリケーションが同じものでなくても(ビルドが必要でも)構わない

flowchart LR
 subgraph runtime env
  app --use--> data
 end
 subgraph git repository
  code
  rdata[data]
 end
 app --commit--> rdata
 code --publish--> app
 rdata --publish--> data
Loading

これによって少しおもしろいことが起きていると思う:

  • データを保持する機能はあるが独立したデータベースはない
  • コードの変更も、データの更新も、データのマイグレーションも同じように実行環境に反映される
  • リポジトリ内のデータだけでなくコードの側を書き換えても別によいわけで、間接的な自己書き換えみたいなことができる
  • publish されるまでのタイムラグをカバーする仕組みが必要

サンプルアプリ

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment