build.numberがセマンティックバージョニングの「乱用」なのはなぜですか?


35

提案されたビルドシステム(Gradle / Artifactory / Jenkins / Chef)をシニアアーキテクトの1人に説明していましたが、彼は私同意しませんでしたが、実際に計量するのに十分な経験はありませんでした。

このプロジェクトは、他のチームが再利用するアーティファクトとしてJavaライブラリ(JAR)を構築します。バージョン管理には、次のセマンティックアプローチを使用します。

<major>.<minor>.<patch>

どこにpatchバグ/緊急フィックスを示し、minor下位互換性リリースを示しており、majorいずれかのAPIの大規模なリファクタリングおよび/または互換性のない変更を示します。

ここでの配信に関しては、私が望むものです。開発者がコードをコミットします。これにより、QA / TEST環境へのビルドがトリガーされます。一部のテストは実行されます(一部は自動化され、一部は手動)。すべてのテストに合格すると、プロダクションビルドがJARを社内リポジトリに公開します。この時点までに、JARは適切にバージョン管理される必要があり、build.numberCIツールによって自動的に生成および提供されるものを使用して、パッチ番号として機能させることを考えていました。

したがって、バージョン管理は実際には次のようになります。

<major>.<minor>.<build.number>

ここでも、build.numberCIツールによって提供される場所。

アーキテクトはこれを却下し、CIビルド番号の使用はセマンティックバージョニングの「乱用」であると述べました。

私の質問は次のとおりです。これは正しいですか?もしそうでなければ、なぜですか?

回答:


45

マイナーバージョンとメジャーバージョンが増えると、ビルド番号は0にリセットされず、仕様のセクション7と8に違反します。

新しい下位互換性のある機能がパブリックAPIに導入された場合、マイナーバージョンY(xYz | x> 0)を増やす必要があります。パブリックAPI機能が非推奨としてマークされている場合は、インクリメントする必要があります。プライベートコード内に実質的な新しい機能または改善が導入された場合、増分される場合があります。パッチレベルの変更が含まれる場合があります。マイナーバージョンがインクリメントされると、パッチバージョンは0にリセットされなければなりません。

下位互換性のない変更がパブリックAPIに導入された場合、メジャーバージョンX(Xyz | X> 0)を増やす必要があります。マイナーおよびパッチレベルの変更が含まれる場合があります。メジャーバージョンがインクリメントされると、パッチとマイナーバージョンを0にリセットする必要があります。

したがって、バージョン番号(メジャー、マイナー、パッチ)を手動で提供する必要があります。これらは、変更ログや他のドキュメントを見る必要なく、ユーザーに1か所での変更を知らせるために使用されます。

ビルド番号を含めたい場合は、次の後に追加できます+(セクション10):

ビルドメタデータは、パッチまたはプレリリースバージョンの直後にプラス記号とドットで区切られた一連の識別子を追加することで示すことができます。識別子は、ASCII英数字とハイフン[0-9A-Za-z-]のみで構成する必要があります。識別子は空であってはなりません。バージョンの優先順位を決定するときは、ビルドメタデータを無視する必要があります。したがって、ビルドメタデータのみが異なる2つのバージョンの優先順位は同じです。例:1.0.0-alpha + 001、1.0.0 + 20130313144700、1.0.0-beta + exp.sha.5114f85。


クイックフォローアップ@Residuum(および答えはBTW +1):バージョン番号は常に手動で導出する必要がありますか?そうでない場合、CI /ビルド番号の代わりにどのツールを使用できますか?
herpylderp

1
@herpylderpではありません。TomPreston-Wernerの「仕様」は単なる彼の意見であり、他の企業の負荷は異なる(一般に互いに非常に似ています)標準を持っています。それらのほとんどでは、自動生成された番号はバージョンの一部です。CIビルド番号を使用するのは賢明なことです。
gbjbaanb

ツールでビルド番号の算術を実行できる場合、CIツールを引き続き使用できます。メジャーまたはマイナーバージョンアップグレードとしてリリースするビルドが何であれ、そのビルド番号を、現在のCIビルド番号から差し引くバージョン文字列の式にプラグインします。出来上がり、ビルド番号を実際にリセットせずに、新しいバージョンのビルド番号をゼロにリセットしただけです。
キース

2
私に関しては、DLLには[major]。[minor]。[revision]。[SVN-Version]を使用し、インストーラーには[major]。[minor]。[SVN-Version]を使用します。CIビルド番号は内部でのみ使用され、失敗したビルドがCI環境の変更(キー証明書のインストール、GACへの共通ライブラリの追加など)後にまったく同じコードベースに対して再実行された可能性がある場所を示します。
キース

1
@gbjbaanb et al .:私が参加した「セマンティックバージョニング」に関するすべての議論で、semver.orgの定義が主題でした。Webで「セマンティックバージョニング」を検索すると、少なくとも最初のページにsemver.orgの定義に関する賛否両論が表示されます。独自のバージョン管理スキームを自由に使用できますが、この用語は明確に定義されているため、セマンティックバージョン管理とは呼ばないでください。
レジデュー14

2

理由の1つは、パッチに複数のビルドが必要な場合があるため、バージョン5.7があり、5.7.1にパッチを適用したいが、最初の2つのバグ修正がCIシステムに送信されたときにビルドに失敗した場合、 5.7.3で最初のパッチをリリースする前に!

答えは、単純に4桁を使用することです(Microsoftシステムが持つ傾向があるため)。4番目はビルド番号であり、「情報のみ」に使用されます。一般に、リポジトリのバージョン番号をそこに入れます(SVNまたはTFSなどを使用する場合)。これは、バイナリのビルドに使用された正確なコミットを確認できるため、非常に便利です。そのようなものがない場合、CIビルド番号は合理的な近似値です(CIシステムがビルド番号を覚えてレポ履歴に結び付けることを望みますが、CIに依存しているわけではありません)システムはそれらを記憶しています-古いビルドを削除することはできません)。

1つ注意すべき点は、バージョン管理用のMicrosoftスキーマでは、ビルド番号に3番目の位置が使用されていることです。Chromeは1つの数字のみを使用します。Ubuntuは日付を使用します。使用する「標準」はありません。ただし、すべての数値をインクリメントする必要があります。


5
普遍的に使用または施行されている標準はありませんが、質問は仕様を持つセマンティックバージョニングに関するものであるように見えます。
ドーバル

たとえば、MicrosoftのNuGetのバージョン管理では、壊れた方法(ビルド番号にプレリリーススタイルを使用)でsemverが使用され、Rubyではmajor.minor.teeny.patchが使用されます。とにかく、ビルド番号はsemverの一部である可能性があるため、アーキテクトはtoshを話していました(確かに、3番目の位置ではなく、+ buildである必要があります)。
gbjbaanb

2
私が知る限り、SemVer 2.0の仕様は2013年のもので、1.0の仕様は2012年のものです。仕様が発表される前に、NuGetとRubyが独自の作業を行っていた可能性があります。SemVerの仕様が斬新なわけではありません。それは単に人々がすでにやっていることを形式化するだけなので、私たち全員が最終的に十数種類のバリエーションの代わりにそれを行う一つの方法に同意することができます。
ドーバル

「バージョン5.7があり、5.7.1にパッチを適用したいが、最初の2つのバグ修正がCIシステムに送信されたときにビルドに失敗した場合、最初のパッチをリリースする前に5.7.3になります!」わかりましたが、だから何?数字をスキップしてはいけないと言っていることをsemverで思い出せません。
アンディ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.