VCSにソフトウェアバージョン番号を保存することをお勧めしますか?


22

などの製品バージョンは、v1.0.0.100ソフトウェアの固有の製品リリースを表すだけでなく、その製品の機能セットと修正プログラムの段階を識別するのに役立ちます。現在、製品の最終パッケージ/ビルド/バイナリバージョンを維持するための2つの方法があります。

  1. バージョン管理。ファイルはどこかにバージョン番号を保存します。Continuous Integration(CI)ビルドサーバーには、このチェックインバージョン番号を使用して必要なソフトウェアのすべての領域(バイナリ、インストーラーパッケージ、ヘルプページ、ドキュメントなど)に適用するソフトウェアをビルドするスクリプトがあります。

  2. 環境および/またはビルドパラメータ。これらはバージョン管理外で維持されます(つまり、スナップショット/タグ/ブランチに関連付けられていません)。ビルドスクリプトは、同じ方法で番号を配布および使用しますが、値の取得方法が異なります(ソースツリーに対する相対位置をスクリプトに知らせるのではなく、ビルドスクリプトに提供されます)。

最初のアプローチの問題は、メインラインのブランチ間でマージが複雑になる可能性があることです。同じソフトウェアの2つの並行リリースを引き続き維持する場合、最後のマージ以降に両方のバージョンが変更されている場合、2つのメインライン間のマージ時に競合を解決します。

2番目のアプローチの問題は、調整です。1年前のリリースに戻ると、タグ情報のみに依存してリリース番号を識別します。

どちらの場合も、CIビルドの前に知られていないバージョン番号の特定の側面があるかもしれません。たとえば、CIビルドは、実際には自動化されたビルド番号である4番目のコンポーネント(たとえば、ブランチ上の140番目のビルド)にプログラムで配置できます。VCSのリビジョン番号でもあります。

ソフトウェアのバージョン番号を把握する最善の方法は何ですか?VCSで「既知の」部品を常に維持する必要がありますか?もしそうなら、メインラインのブランチ間の競合は問題ですか?

現在、CIビルドプラン(Atlassian Bamboo)で指定および維持されているパラメーターを介してバージョン番号を維持しています。masterブランチにマージする前に、CIビルドの開始前にバージョン番号が適切に設定されていることを注意する必要があります。Gitflowのワークフローに関しては、ソース管理でバージョン番号が追跡されていればrelease、リリースの準備でブランチを作成するときに、バージョン番号が適切に設定されることを保証できると思います。QAは、このブランチで最終的な統合/スモーク/回帰テストを実行し、サインオフ時に、masterリリースへのコミットメントを示すマージが行われます。


3
version.txt1つのバージョンに単一行が含まれるファイルの2つのバージョン間でマージの競合が発生1.0.7し、他のバージョンでは1.2.0本当に解決が難しいですか?これが、バラバラになった2つのブランチをマージする唯一の競合である場合、私は非常に幸運だと思います。どのくらいの頻度で発生しますか?それが発生した場合、マージされたバージョンにどのバージョン番号が必要かを考えることを余儀なくされるのは良いことではありませんか?(「バージョン」という言葉のあいまいな使用については
ごめんなさい

1
@ 5gon12ederマージ自体の難しさや感情は無関係です。これは、ソリューション全体のネガティブな側面にすぎません。
void.pointer

回答:


28

個人的には、オプション3を選択します。VCS メタデータ、特にタグにバージョン情報を保持します。

Gitを使用するとgit describe、タグに基づいてコミットを一意に記述することができるコマンドがあるため、非常に簡単に実行できます。仕組みは次のとおりです。

  • 現在のコミットにタグが付けられている場合は、タグの名前を出力します。
  • それ以外の場合、タグが見つかるまで履歴を逆方向にたどり、次の形式で説明を出力します<tag>-<number of commits since the tag>-g<abbreviated commit hash>
  • workingtreeにコミットされていない変更がある場合は、追加します-dirty

したがって、リリースビルドを実行していて、コミットにタグを付けている1.2.3場合、出力されます1.2.3。現在1.2.4で作業していて、1.2.3以降4つのコミットを行い、コミットされていない変更がツリーにある場合、出力されます1.2.3-4-gdeadbee-dirty

これは一意で単調であることが保証され、人間が読むことができるため、バージョン文字列として直接使用できます。確認する必要があるのは、タグの適切な命名規則だけです。


このアイデアは本当に気に入っていますが、JIRA + Bambooで管理するのは難しいようです。Bambooはタグではなくブランチでのみ機能するため、ビルドを生成する前にタグをプッシュする必要があります。これはエラーを起こしやすいです。
-void.pointer

1
git describe--all –注釈付きタグのみを使用する代わりに、refs/名前空間にある参照を使用します。このオプションにより、既知のブランチ、リモートトラッキングブランチ、または軽量タグのマッチングが可能になります。」ただし、これがBambooでどのように機能するかはわかりません。(もちろん、通常モードでタグを使用する場合と同様に、ブランチの名前を慎重に指定する必要があります。)
ヨルグW Mittag

1
Gitから完全に自動リリースを行う人々を知っています。バージョン文字列はによって構築されgit describe、ChangeLogはgit shortlog(まあ、実際にはの出力を解析するスクリプトからgit log --pretty=tformat:<some custom format string>)生成され、リリースノートはタグの説明から生成され、git notes重要なマイルストーンコミットに添付されます。
ヨルグWミッターグ

私のポイントは、タグがリリースに作成さ、ベース番号で適切にバージョン管理された後にコミットされるようにする必要があるということです。これはリリースまたはリリース時にタグ付けする原則に反します。Bambooは、コミットに基づいてビルドを自動的に取得しますmaster(からdevelop、gitflowを使用していることを思い出してください)。誰かがmasterタグなしでマージをプッシュするとどうなりますか?適切なバージョンを使用しません(実際には最後のリリースのバージョンを使用します)
-void.pointer

このようなスキームを使用すると、タグ付け解除されます。ああ、私はあなたが得ているものを見ると思う。したがって、現在、CIサーバーはリリースドライバーであり、この変更により、SCMはリリースドライバーになりますが、そのままにしておきますか?
ヨルグWミッターグ

8

はい。ほとんどのバージョン番号をvcsに保持することをお勧めします。major.minor.patch.buildがあるセマンティックバージョニングsemver.orgを検討する場合、最初の3つはvcsに存在する必要があります。最後の1つは、バイナリが作成される特定のコミットをバックトラックするために使用されるビルドサーバーからの増分番号です。

.NETでこれを容易にするために、gitにコミットされる小さなcmd line exeを作成しました。ビルド前イベントで、ビルド中にteamcityがタグ付けしたビルド番号を取得します。このcmdラインツールは、ビルド番号を含む1つの定数を持つクラスを自動生成します。残りのバージョン番号:major.minor.patchは、別のファイルの通常の定数です。これら2つの共有ファイルは、ソリューションのすべてのアセンブリにリンク(alt + shift-drag)として含まれています。

このアプローチは十分に強力なので、teamcityでコードをビルドしてテストできます。azureにプッシュして、kuduで再度ビルドしますが、teamcityビルド番号はdllのバージョンです。

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