顧客固有のソフトウェアパッチを処理する現実的な方法は何ですか?


16

私は、他の人が次の問題を解決した効果的な方法を集めようとしています。職場では、特定のお客様にのみ表示したいソフトウェアパッチ(エンドユーザーシステムにインストールする)のリリースを余儀なくされています。カスタムコードは、独自のソース管理ブランチにあります。問題は、同期を保つために2つの並列コード行(およびビルドスクリプト)があり、元のコードにパッチを適用するたびに、顧客固有のコードにパッチを適用してテストする必要があることです。

他の組織はこのシナリオをどのように処理しますか?技術的な(ソース管理に関連する)ソリューションだけでなく、ビジネスソリューションにもオープンです。たとえば、そのブランチで更新を受信できないことを顧客に伝えることについて話してきました。

分岐戦略は次のようになります(Visual Studio TFS Branching Guideに基づいていますが、Subversionを使用しています) ここに画像の説明を入力してください


使用している場合、hgまたはgitパッチキュー(Mercurial Queues ExtensionまたはStacked Git)の使用を検討することをお勧めしますが、TFSに同様のものがあるかどうかはわかりません。
マークブース

TFSを提案する分岐戦略を使用している場合でも、Subversionを使用していることを指定する必要があります。Pパッチキューは必要なテストを削減しますか?これらはソース管理パッチ用ですか?お客様がエンドユーザーシステムにインストールするパッチを扱っています。
-Vimes

2
ビジネスソリューションは次のとおりです。
ジェフ

@JeffO good call =)いずれにしても、これをデータ駆動型のランタイムスイッチにする方法はありますか?
パトリックヒューズ

1
@JohnBは-申し訳ありませんが、私は知りませんが、あなたがソースパッチを持っている場合は、あなたのビルドシステムは、テストを自動化することができるはず、プラスに保つあたりの顧客パッチを外のsvn手段彼らはあなたの通常のワークフローを散らかしていません。パッチキューが役立つように見える場合は、git-svnまたはhgsubversionを使用して試してみることができます。DVCSフロントエンドを使用してトリッキーなワークフローをスムーズにするsvnと、他のすべてのメリットを得るために、DVCSホールセールへの移行を検討することさえ奨励される可能性があります。
マークブース

回答:


5

お客様固有のパッチの提供を開始すると、製品の新しいバージョンがすぐに作成されます。これは、製品の横で保守する必要があります。つまり、2つのバージョン間で変更を伝達する必要があります。通常、顧客固有のパッチは、ソースコードを含め、顧客が所有する必要があるカスタマイズです。

差し迫った問題に対する一時的な修正が最適でない場合を除き、何かを修正するパッチがメインラインブランチに反映されない可能性は低いようです。その場合、パッチは、予想される修正がメインラインに反映されるまで維持する必要があるだけです。


5

私には、鍵は「見える」ようです。別のコードブランチをまったく持たず、動作を変更する構成オプションについてはどうでしょうか?


これは単純なカスタマイズでは機能しますが、より複雑なカスタマイズでは、すべての顧客にとって製品がより厄介で不安定になる可能性があります。
FrustratedWithFormsDesigner

3
@FrustratedWithFormsDesigner単一のクライアントに対する複雑なカスタマイズは、製品の管理と設計における重大な過失を表します。製品の単一の顧客に個別の支店を必要とするソリューションは、製品所有者のすべての顧客のニーズと不十分なスチュワードシップを満たすために製品が著しく不十分であることを表します。
maple_shaft

2
また、これは私の以前の雇用主が何度も噛むのを見てきました。それは単なる悪い習慣ですが、通常は経営陣が望んでおり、後戻りすることはありません。特にSubversionを使用している場合、これは消えない悪夢です-コードの同期を維持すると、何度も何度も傷つきます。
スティーブヒル

1
@maple_shaft-しかし、「国際化を実装するためにコード分岐を使用したことがありますか?」という質問をすると思いましたか?
psr

3
@maple_shaft-私は冗談を言っていましたが、実際にはそれが私のポイントでした。国際化を処理するためにブランチを使用することは、少なくとも顧客固有のブランチと同じくらい悪いです。おそらくそのような場所で働きたくないという意味では、意味がありません。私はかなり話題から外れていたので、意味がありません。
-psr

3

これは短期的または長期的なものだと思いますか?事実、ビジネスはすでにこの顧客に対応することを決定しているため、短期的にはビジネス慣行(追加費用の受け入れ/顧客への費用請求)によって主に解決されるビジネス上の決定です。

長期的な場合、構成(またはセットアップなど)を通じて顧客のニーズに簡単に対応できるようにソフトウェアをリファクタリングすると、おそらく節約になります。

比較的短期間で、それらの変更をすぐにメイン/開発ブランチにマージし、すべてのユーザーに変更が表示される場合、現在の状況の制限内で作業することはおそらく受け入れられます。私が言ったように、何をすべきかの決定は、顧客に対応する決定が下されたときになされるべきでした。

長い話は短い。技術的には長期的に修正し、短期的にはそれを処理します。

もちろん、それはコイントスである点があります。その時点であなたがいるなら、私は開発者が好むものは何でもします。


2

Subversionも使用します-そして、まさにそのようなシナリオに遭遇します。

覚えておくべき重要なポイントを次に示します。

  1. 顧客のために特定の分岐を避ける必要がありますが、その必要性は可能な限り最小化する必要があります。すべてに有効なソリューションを一般化できるかどうかを常に確認してください。

  2. 顧客固有のブランチは、新しいリリースから作成する必要があります。バージョン1.2があり、バージョン1.2.1から1.2.11まで派生している場合-顧客ブランチにはすべてのパッチを許可する必要があるため、顧客ブランチはメインバージョンとの互換性を維持する必要があります。

  3. 互換性のない新しいバージョンを開始するときは、顧客固有のブランチを新しく作成する必要があります。不幸な部分は、どういうわけかあなたが仕事をやり直す必要があるかもしれないということです。解決策の1つは、顧客ブランチからすべてのパッチを作成して抽出する必要があり、まだ互換性があるものはすべて新しい顧客ブランチに適用できることです。

  4. 常に、いかなる状況でも、お客様固有の変更をリリースブランチまたはトランクにプッシュするべきではありません。ただし、理想的には、このような顧客固有の作業が削減され続けるように作業を一般化するようにしてください。

私はこれらのアイデアをまとめて見せようとしました下の図


1

コードに拡張メカニズムを導入するのはどうですか?

あなたのメインコードは次のとおりです。

class Foo
{
}

プログラムが起動すると、ローカルカスタマイズ用のスタートアップフォルダーでDLL /道徳上の同等物をチェックします。見つかった場合はロードされ、会社固有のバージョンのFooが含まれている可能性があります

class FooForABC : Foo
{
}

FooForABCはFooと同じ動作を実装しますが、ABCが必要とする特定の動作を提供するために必要に応じて機能をオーバーライドします。この手法は、サポートする必要のあるシナリオを処理するのに十分な柔軟性が必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.