数百台のコンピューター(ノード)のグループにインストールされた分散ソフトウェアシステムを想像してみてください。ノードは、スケジュールされたタスクを自動的に実行する責任があります。何百ものタスクがあり、すべてのタスクは約5〜10ノードで実行されるようにスケジュールされています。ノードは数日間停止する場合があり、システムから削除される場合があります。すべてのタスクは、1つ以上のソースファイルとノード固有の構成ファイルによって定義されます。コードはノード上で直接開発およびテストされます(リモートアクセスを使用)。これらのノードのみに特別なハードウェアが装備されており、タスクの実行に必要なネットワークコンテキストがあります(別のテストシステムを構築するとコストがかかりすぎます)。すべてのタスクのソースファイルは共有ソースファイル(ライブラリ)を参照し、ライブラリは他のライブラリを参照する場合があります。タスクとライブラリの依存関係ツリーは複雑です。
分散バージョン管理システムの経験はありませんが、このシステムはDVCSを中心に構築できると思います。さまざまなライブラリ、およびさまざまなタスクのソースファイルには、独自のリポジトリがあります。特定のタスクを実行するすべてのノードには、そのタスクのリポジトリのインスタンスが必要です。ノードの少なくとも1つのタスクで使用されるすべてのライブラリのリポジトリも、そのノードに存在する必要があります。開発者はcommit
、ノード上でローカルに変更およびコーディングし、DVCS技術を使用して他のノード上のリポジトリに変更を配布します。
質問#1 コードの変更を他のノードに配布するための最良のアプローチは何でしょうか?
考えられるシナリオ:
- 開発者
push
は、同じリポジトリのインスタンスを持つ他のすべてのノードへの変更を行います。(しかし、彼らはそうすることを忘れるか、そうする時間がないかもしれません。) - ノード
pull
は、他のすべてのリモートリポジトリからのすべての変更とupdate
それ自体を自動的に変更します。(ただし、競合が発生する可能性があります。) - リポジトリごとに、インスタンスの1つが「参照」として使用されます。開発者
push
はこのインスタンスへの変更を行い、インスタンスを持つ他のすべてのノードpull
はここから自動的に実行されupdate
ます。(ただし、参照インスタンスを持つノードが停止する場合があります。)
質問#2 依存関係を処理するための最良の方法は何でしょうか?
複数のタスク(またはライブラリ)が同じライブラリを参照していて、参照されたライブラリを変更する必要がある場合、1つまたは複数の参照タスク(またはライブラリ)が機能しなくなる可能性があります(依存関係地獄)。最初に参照されたバージョンを維持し、適切なテストを行った後、新しいバージョンにアップグレードすることをお勧めします。つまり、同じソースファイルの複数のバージョンが同じリポジトリに存在する必要がありますが、これは不可能と思われます。branch
参照されたライブラリの新しいバージョン用に新しいライブラリを作成する必要がありますか?はいの場合、参照リポジトリをどのようにアップグレードする必要がありますか?
ご協力ありがとうございました。