私はビルド プロセスと継続的インテグレーションの自動化にかなり慣れていないため、小さな開発者チームのためにビルド プロセス/サーバーのセットアップに取り組んでいます。SVN、CMake、および Jenkins ビルド サーバーを使用しています。ソース言語は C++ です。
library
(dll) と の2 つのプロジェクトがあるとしexecutable
ます。executable
へのリンクがlibrary
あるため、ビルドexecutable
するには .lib および .h ファイルが必要ですlibrary
。を実行するexecutable
には、.dll (および場合によってはデバッグ シンボル ファイル) が必要ですlibrary
。
全体をビルドするときは、かなり単純で、リポジトリから最新のソースを取得してビルドしlibrary
ますexecutable
。
ただし、複数の開発者がおり、各開発者は通常、一度に 1 つのプロジェクトに取り組んでいます。私たちの CMake スクリプトを使用すると、ビルドするプロジェクトを選択できるため、 builds のみのセットアップと、buildsJohn
のみのセットアップがある場合があります。これをあきらめるという選択肢はありません。executable
Bob
library
したがって、ソースにBob
変更を加えてlibrary
コミットする場合はJohn
、コンパイル済みの .lib および .dll ファイルを取得する必要があります (彼はコンパイルしていないためlibrary
)。
現在、バイナリは svn にあります。各コンパイル中に、CMake はコンパイル前のステップとして にコピーsrc/bin
しbuild/bin
、次に、選択されたプロジェクトがコンパイルされ ( の適切なバイナリを置き換えますbuild/bin
)、最後に CMake が にコピーbuild/bin
しsrc/bin
ます。
これはBob
、変更を行うときに、ソース ファイルだけでなくコンパイル済みのバイナリもコミットしJohn
、作業コピーを更新すると適切なバイナリを取得し、手動でファイルを置き換える必要がないことを意味します。
これはしばらくの間機能していましたが、いくつかの理由で本当に好きではありません。このようなものを設定するハックっぽい方法はありませんか? (実際には 4 人の開発者がいて、約 12 のプロジェクトがあり、何にも依存しないライブラリ、他のライブラリに依存するライブラリ、他のライブラリに依存する実行可能ファイルなどがあります。)
編集:これは私が考えているプロセスです:
Artifactory や Nexus などのアーティファクト追跡システムを使用して、ビルド後にバイナリを保存し、それらのバイナリの生成に使用されるヘッダー ファイルを保存します。
CMake では、各プロジェクトはコンパイル済みまたはプリコンパイル済みとしてマークされます。コンパイルされたプロジェクトは、通常のリポジトリから生成されます。プリコンパイルされたプロジェクトのバイナリとヘッダーが古い場合は Nexus からダウンロードされ、CMake のリンクとインクルードが適切に行われます。Dave Bacher の回答へのコメントで説明した競合状態を防ぐために、ヘッダーもアーティファクトと共に保持されます。
私が気に入らない唯一のことは、アーティファクトが古くなっているかどうかを確認してダウンロードするためにCMake-fooを実行する必要があることですが、どうやら私が試していることから、実際には代替手段はないと思います設定するのは非常に非標準です。