このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

ソフトウェアをデプロイするためのソフトウェア

Caty(動画)のデプロイツールを作っているんですが、難しいですね。僕は、このテのツールに興味も経験もなかったし、あまり積極的になれなかったんですよね。『継続的デリバリー』という本を斜め読みした結果、ソフトウェアをデプロイするためのソフトウェアが大変重要だと理解しました。(僕はこの本について書いてないけど、Kuwataさんが触れてます → http://return0.info/note/2012-04.html#id2012-04-07)重要さを理解はしたけど、相変わらず気乗りしない … 、最近になってやっと「これじゃいかん!」と。

継続的デリバリー 信頼できるソフトウェアリリースのためのビルド・テスト・デプロイメントの自動化

継続的デリバリー 信頼できるソフトウェアリリースのためのビルド・テスト・デプロイメントの自動化

チョッとやってみたら、ちゃんとしたパッケージマネージャを作るのはすごく大変だー、と実感しました。とりあえずは基本的なアーカイバー/インストーラー/アンインストーラーあたりから始めています。

基本的なツールでさえ、最初のうちは、どういう機能をどうやって実現するか分からないで試行錯誤。しばらくジタバタしているうちに、割と単純な景色が見えてきました。デプロイツールは、ファイルをコピーすればいいのです。素朴なコピーではないけど、「ファイル群をコッチからアッチに運ぶ」ことが基本です。

そう考えると、次の課題が見えてきます。

  1. コピー元であるコッチのファイル群をどうやって選択するか。
  2. コッチからアッチに運ぶ手段をどうするか?
  3. コピー先であるアッチでファイル群をどうやって生成するか。

これをちゃんと決めればファイルコピーは出来るはずです。しかし当然に、ソフトウェアは、単なる物理的なファイルの集まりではないので、論理的な構造を考慮する必要があります。

「物理的なファイルの集まり」以上の構造を表現するにはメタデータが必要です。実にさまざまなメタデータフォーマットが存在しますが、Catyでは、node.jsなどで採用されているメタデータフォーマットであるpackage.jsonhttp://wiki.commonjs.org/wiki/Packages/1.1)を使うことにしました。Caty特有の項目を若干追加してます。

今回は、「コッチからアッチに運ぶ手段」としてZIPアーカイブを選んだので、「ファイル群+メタデータ」をまとめて一つのZIPアーカイブに突っ込むことにしました。jarなどでお馴染みのMETA-INF/ というディレクトリにメタデータを置くことにします。そして、META-INF/ は特別扱いします。

これで、「ファイル群+メタデータを、コッチからアッチに運ぶ」メカニズムは、まーいいでしょう。パッケージ管理で大変なのは依存性と互換性の扱いです。たくさんのパッケージをインストールして構成したソフトウェアシステムの整合性を維持していく必要があります -- これはけっこう難しい。

package.jsonフォーマットには、dependenciesという項目があり、これにより配布パッケージ間の依存性グラフを構成することができます。足りない配布パッケージを知るにはdependenciesをたどればいいのですが、インストール済みの機能を更新したときの影響を知るにはグラフ構造だけでは不十分です。

ソフトウェア構成要素の互換性を判断する目安としてSemantic Versioning(SemVer; http://semver.org/)が使えます。SemVerの規則が厳密に運用・適用できるならば、ソフトウェアシステムの整合性を壊さざすに部分(モジュール、コンポネント、フィーチャ)ごとに更新(バージョンアップ)を行えます。

SemVerは理想論/努力目標なので、現実には色々と難しい点があるのは確かです。とはいえ、これ以外の有効な手段があるわけでもないので、ソフトウェアのデプロイと構成管理を円滑に進めるためには、SemVerに沿ったバージョニングをすべく努力するしかないでしょう。

いつものように、依存性や互換性の問題も含めたデプロイと構成管理の形式化は出来ないか? と、しばらく考え込んだのですが、関係圏の計算がうまいこと適用できそうです。パッケージマネージャ(デプロイマネージャ)を実装する気になったら、この話をするかもしれません。