メインコンテンツへスキップ
  1. Posts/

配管地獄を止める:`bs` を作っている話

·80 文字·1 分·
Go Devops Build-Systems Bs Engineering
アミット・デイブ
著者
アミット・デイブ
ソフトウェアエンジニアで、しっかりしたシステムを作るのが得意です。難しい問題をわかりやすくすることも得意です。好きなことは、分散システムクリーンアーキテクチャ、そしてオープンソースプロジェクトです。仕事以外では、山を歩くことや日本語の勉強、そしてstderrなどから学ぶことを楽しんでいます。
目次

断り書き:俺はN5レベルで日本語を勉強中です。間違いがあるかもしれないけど、頑張っています!

「配管地獄」とは
#

分散システムはスケールしやすい。でも、開発者には大変なことが多い。

俺はこれを「配管地獄」と呼んでいる。一つのサービスをローカルで動かすために、Kafka、Postgres、Redis、他のマイクロサービスも全部必要になる。500行の docker-compose.yaml を書いたり、ノートPCでKubernetesを動かしたりする。APIの小さい変更をテストするだけなのに。

コードを書く時間より、ポートの設定やコンテナのネットワークのデバッグに時間を使っている。これは普通になってしまった。でも、これが普通でいいわけがない。

意図 vs 実装
#

一番の問題は、今のツールが 意図(何をしたいか)と 実装(どうやるか)を混ぜていることだ。

「Postgresが必要」と言ったら、手動でポートを設定したり、KubernetesのStatefulSetを書く必要はないはずだ。意図は分かりやすい。実装はツールの仕事であるべきだ。

これが bs を作る理由だ。

bs とは
#

The No Bullshit Build System。 Go言語で作っている、意図を中心にしたビルドツールだ。

考え方はシンプル:意図を書いて、システムに配管を任せる。bs.yaml にアーキテクチャを書くと、bsTranslator(翻訳者)として動く:

  • ローカル開発: Docker APIを直接使って、ホットリロードできる軽い環境を作る。Kubernetesは不要。
  • 本番: 同じ bs.yaml からKubernetesマニフェストやHelmチャートを作る。

Docker Composeファイルを書かなくていい。環境ごとの設定ファイルも管理しなくていい。必要なものを書くだけで、Translatorが動かし方を決める。

設計で大事にしていること
#

Translatorパターン
#

bs はサービスの定義と実行を分ける。同じ bs.yamldevtestprod で違う結果を出す。開発者の考え方は、どこで動いても同じだ。

自動設定とシークレット
#

ローカル開発で一番面倒なのは、設定の管理だ。サービスAがデータベースを必要とする時、bs はURLだけじゃなく、環境変数、APIキー、TLS証明書も自動で用意する。.env をコピーしたり、シークレットをハードコードしなくていい。

全部がアーティファクト
#

bs では、データベースもアーティファクトだ。スキーマを入れて、スナップショットを取って、キャッシュできる。ローカルの開発データベースが毎回同じ状態で使える。

今の状況
#

はっきり言うと、まだ完成していない。フェーズ1を作っている:

  1. コアCLIspf13/cobra を使っている
  2. DAGエンジン — 並列実行と依存関係のグラフ
  3. Dockerアダプタ — Dockerクライアントと話すインターフェース
  4. ローカルストア — ビルドアーティファクト用のCAS(Content Addressable Store)

これは意図の表明だ。俺が毎日感じるマイクロサービス開発の問題を解決するために作っている。進捗があったら、ここに書くよ。

楽しみにしていてね。