リリースされたバイナリをバージョン管理下に保つにはどうすればよいですか?


14

リリースされたバイナリをバージョン管理下に保つにはどうすればよいですか?これにより、各リリース間で変更された内容を追跡できます。ソースリポジトリからリリースされたバイナリを分離するつもりです。リリースされたバイナリは、継続的インテグレーションソフトウェアから構築されるか、手動でコンパイルされます。


「変化したものを追跡する」とはどういう意味ですか?リリースバイナリのどの属性を追跡していますか(追跡したいですか)?奇妙に思えるので、興味があります。
ジェレミーハイラー

依存DEF.dllは変化しないままで例えばv1.0.0デベロッパーとv1.0.1デベロッパーの間で、唯一ABC.exeは、変更された
linquize

1
バイナリを見て、これをどのように判断しますか?
ジェレミーハイラー

同じファイルの古いバージョンと新しいバージョンの差分
-linquize

回答:


21

2つのオプション:

a)しないでください。再現可能な決定論的ビルドがあることを確認してください。つまり、同じ構成で同じソース管理リビジョンをビルドすると、常にまったく同じバイナリが生成されます。

b)ディレクトリを公開ビルドの信頼できるソースとして指定します。展開/配布手順のバイナリ部分をアップロードし、published-buildディレクトリがバックアップ計画でカバーされていることを確認してください。ここではバージョン管理は必要ありません。ビルドはライトワンスです。何か変更する必要がある場合は、新しいビルドを作成します。

いずれにしても、バイナリおよびその他のビルド出力は、さまざまな理由により、ソース管理下にありません。


7
a)は、多くの場合、コースのことはできませんblogs.msdn.com/b/ericlippert/archive/2012/05/31/...
JK。

@jk:素敵なリンク。ビルド段階のソースコードとすべての入力ファイルを完全にソース管理下に置く(そして適切なコンパイラバージョンをインストールする)ことは、多くの実際のシナリオでは「十分に決定的」であると考えられます)。再現可能なバイナリをビット単位で保持することの重要性は、ケースによって異なります。
Doc Brown

10

バージョン管理システムではなく、バイナリ用のアーティファクトリポジトリを使用します。リリースされたバイナリの特定のバージョンは、時間の経過とともに変化することは想定されていません。したがって、ファイルが変更されないため、バージョン管理は意味がありません。

たとえば、Mavenリポジトリをアーカイブ/公開/提供リリースおよび他のバイナリ(ドキュメントなど)のリポジトリとして参照してください。


リリースされたソースファイルの特定のバージョンも、時間の経過とともに変わることはありません。SCMは、出荷されたバイナリを配置するのに最適な場所であり、ビルドに使用されるソースファイルと一緒に保存するだけです。
-gbjbaanb

2
gbjbaanb、SCMは「ソース管理」の略です。これにより、これらのシステムはバイナリではなくソースを格納するように設計されているというヒントが得られます。それでもバイナリを保存する場合は、先に進みます。しません。
-mhaller

4
SCMは「Software Control Management」の略ですが、良い試みです。「ソースコードは、」多くの場合、単なるテキストファイルではなく、画像、文書、図面など
gbjbaanb

通常、「ソフトウェア構成管理」。「ソフトウェア制御管理」について聞いたことがありません。
ジェームズマクロード

7

gitを使用している場合(バイナリを適切にマージしないため、自分で管理する必要があります)またはコミットしすぎている場合(コミットした場合にのみコミットする場合)を除き、問題ありません。ビルドするたびにではなく、出荷する準備ができています)。

ほとんどのSCMのデルタバイナリは非常によく、2MbのリソースdllをSVNに配置していたため、毎回数KBのデルタになりました。

SCMはバイナリ用ではなくソース用であるという多くの議論がありますが、ほとんどのソフトウェアがイメージで構成されていると考えると、これは単なるアイコンファイルであっても明らかに間違っています。それらはバイナリですが、ソースの一部なので、それらを入れて、それについてそれほど独断的ではありません。また、必要に応じてバイナリを再構築することもできますが、これはよくあるケースですが、積極的にサポートされなくなった古いシステムでは多大な時間の浪費になる可能性があります。3年前にバイナリを構築するために使用されたシステムに対応するために、古いサービスパックまたはパッチのみを使用してシステムを再作成する必要がある場合は、そのSCMにビンを追加していただければ幸いです。

SCMにビルドを追加することについて心配する必要があるのは、ビルドサーバープロセスの一部としてビルドを自動的に実行する場合だけです。これはしないでください。SCMを、自分にとってメリットのないビルドで埋めることができます。代わりに、リリースされたときにのみ追加してください。このようにして、顧客が何を持っているかを正確に把握し、顧客が報告した問題を、再構築したものではなく、使用しているバイナリで再現できます(たとえば、コンパイラまたはOSの最新の更新を使用して)。


1
@ MarnenLaibow-Koserあなたは明らかに長い間業界で働いていません。ビルド環境は時間とともに変化するため、古い環境を再構築することはできますが、適切な古いツールとSDKを使用して環境を再作成するのに何日もかかる可能性があります。どの私はあなたがバージョン管理されてきました願っています....
gbjbaanb

1
Microsoftがリリースに適さないと思われる古いSDKを使用して、XPマシンでコンパイルされた古いVC6バイナリをビルドできると思います。誰かがそのバイナリを要求した場合、他のすべてが保存されている同じ場所からそれを取得するのは簡単です。再構築しなければならない苦痛と比較して、それを管理するコストは膨大であり、ソースとともに保存するコストは取るに足りません。(顧客がバグを報告したときにサードパーティのコントロールで作られたVB6のアプリで-バイナリを取得し、それが不可能であることが判明しており、それを再構築するよりもはるかに簡単だったランニング)私はそこにされている
gbjbaanb

1
@gjbaanb私はまた、あなたが別の方法で私とは異なる状況にあることを認めます:私の外部依存関係はすべてOSSなので、一部の会社がそれらをリリースするのにふさわしくないという理由だけで、それらは消えません。
Marnen Laibow-Koser

1
私のポイントは、SCMがすべてを保存できるため、バイナリをソースとは別に保存する必要がないことです。便利で簡単で、何年後に何が起こるかを保証します。そうすることの欠点はありません。特定のリリース自体は、特定の1つのソースコミットとのみ同期しています。SCMはソースコードテキストのみを意味すると考える人を除き、問題は見当たりません。いいえ、ほとんどすべてを保存するために使用します(巨大ではない場合、ビルドツールまたはライブラリを含む場合があります)。
gbjbaanb

1
@gjbaanbそして、私のポイントはあなたがそれについて間違っているということです。:)確かに、VCSはすべてを保存できますが、1回のコミットでのみ有効なファイルを保存するように設定されていません(結局、r550のリポジトリにr500ビルドを入れたくないので、混乱するでしょう) 。リポジトリにビルドアーティファクトを保存する場合の基本的な問題は、それらがバイナリであるということではなく、派生データであり、同じリポジトリ内のソースと同期しなくなることです。私が使用しているのと同じ引数が、生成されたテキストファイルに適用されます。
Marnen Laibow-Koser

5

リリースバイナリをバージョン管理下に置いていません。代わりに、他のツールが検査および使用できるように、それらを適切に定義された場所に公開します。私はJavaで多くの仕事をしているので、ローカルのMavenリポジトリにJarを公開しています。ただし、これらのツールを使用して、リリースごとに何が変更されたかを追跡しません。結局のところ、それらはバイナリであり、ファイル数以外に追跡することはあまりありません。

リリース間の変更を追跡するために、バージョン管理システム内のリリースにリリースのバージョン番号をタグ付けまたはラベル付けします。ただし、これはソースファイルを追跡するためだけであり、バイナリではありません。バイナリはビルドのアーティファクトであり、バージョン管理下にある必要はありません。


1

最善の解決策は、組織的に重要なすべてのビルド(リリース、リリース候補など)でCIシステムを排他的に使用することです。

これにより、リポジトリに実際にバイナリを保存することなく、リリースされたバイナリがリポジトリコンテンツに体系的に関連付けられます。

たとえば、SVNを使用している場合、ブランチメジャー組織スキームを使用します。/ trunkで日々の開発をすべて行い、準備ができたらリリースごとに/ tagを作成します。

トランクだけでなくタグからもビルドするようにCIシステムを構成し、リポジトリの最上位構造をミラーリングする構造を持つネットワークディレクトリに出力を書き込むようにします。

  • / builds / trunk / [rev] [date] [build_id] /
  • / builds / tags / release_0_1_3beta4 / [rev] [date] [build_id] /

ビルドシステムは、/ builds / trunk /ディレクトリを循環バッファーのように扱い、最後のn個のビルドを保存し、古いビルドを削除する必要があります。

一方、/ builds / tags /ディレクトリは永続的なストアです。ビルドアーティファクト自体は、次のスキームに従って生成された名前でディレクトリに保存されます。

  • [rev] [日付] [build_id]

ここで、[rev]はSVNリビジョンID、[date]はYYYYMMDD形式の日付、[build_id]は3桁の一意のカウンターです。最初のビルド以降、各ビルドディレクトリが一意になります。

上記のプロセスには、次の利点があります。

  1. ビルドアーティファクトは、それらを生成したソースに体系的に関連付けられているため、特定のビルドアーティファクトのソースを非常に簡単に見つけることができます(逆も同様です)。

  2. これは、リリースの自動化の基礎となります。たとえば、リリース文書などの自動生成...

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