Mercurial のバージョン管理下に Java アプリケーションがあります。私たちはアプリケーションにバージョニング スキーマを実装する作業を行っていますが、TortoiseHG がこれをどのように支援できるか疑問に思っています。コミットが行われたときにビルド バージョンをインクリメントするようなことは可能ですか、それともこれは開発者次第である必要がありますか? 現在の計画には、UAT にプッシュするときに、バージョン番号ごとにブックマークを作成することが含まれています。
2 に答える
原則として、これはTortoiseHgの外部で行う必要があります。Mercurial(したがってTortoiseHg)の仕事は、[コミット]をクリックしたときとまったく同じように作業コピーの状態を保持することです。
ただし、少し助けが得られるかもしれません。TortoiseHgは、pre-commitフックを使用してこの「外部」アクションをトリガーできます。これは実行前hg commit
に実行されるスクリプトであり、そのスクリプトはファイルを変更する機会があります。
このようなスキームを実装しようとするときは、Mercurialが分散型バージョン管理システムであることに注意してください(これは驚くべきことではありません...)。そのため、中央サーバーと通信せずにローカルでコミットを行います。したがって、バージョン番号が他の誰かによって使用されていないことを保証することは不可能です。唯一の回避策は、バージョンの「番号」としてチェンジセットハッシュを使用することですが、そうすると、番号をうまく増やすことができなくなります。集中型ビルドサーバーを使用している場合は、バージョン番号をインクリメントして、単純な集中型の世界観に戻すことができます。
最後に、Mercurialには、集中型ビルドマシンに非常に役立つlatesttagdistance
テンプレートキーワードがあることを述べておきます。これは、最新のタグまでの距離を計算し、この距離は、ビルドマシンでは一般に単調に増加します。次のように使用します
hg parents --template "{latesttag}+{latesttagdistance}-{node|short}"
詳細については、Mercurialsetup.py
ファイルを参照してください。
ビルドシステムに現在のバージョン識別子を配布アーカイブやファイル名に挿入させるのが最善です。
最初の質問は、このバージョン識別子をどのように取得するかです。基本的に3つの方法があります。
- ビルドサーバーにコマンドを発行させ
hg id
て、ビルドエラーを見つけます。 - Mercurialリポジトリ構成で構成されたフックによって設定された
version
ファイルを用意する。changegroup
version
キーワード拡張子を使用してデータが入力されるファイルを作成する。(お勧めしません!)
最初のアプローチは、Mercurialから直接情報を取得します。これは、開発者向けのセットアップをほとんどまたはまったく必要としません。欠点は、ビルドシステムと特定のバージョン管理システムの存在を緊密に結合することです。
2番目のアプローチは、リポジトリシステムから独立したままであり、たとえばソースアーカイブからビルドする場合、またはバージョンラベルを手動で指定する場合は、引き続き使用できます。欠点は、フックを設定する必要があることですが、ビルドマシンは通常、特別に構成された中央サーバーであるため、これは大きな問題にはなりません。
完全にするために3番目のアプローチについて説明しますが、そのメカニズムを本当に避けたいということは広く認められていると思います。
version
1と2のハイブリッドアプローチを選択するのがおそらく最善です。これは、最初にアプローチ2を試行し、ファイルが見つからない場合はアプローチ1にフォールバックします。ソースのエクスポートをより適切にサポートhg archive
するために、ファイルをチェックすることもでき.hg_archival.txt
ます。
2番目の質問は、ビルド番号にどのような値を使用するかです。
- バージョン識別子(から
hg id -i
)。 - ローカルリビジョン番号(から
hg id -n
)。 latesttag
とを使用する識別子latesttagdistance
。Martinの回答を参照してください。
最初の利点は、それがかなり単純であり、構築された正確なバージョンを一意に識別することです。ただし、人間が読める形式ではなく、ハッシュから相対的な年齢を導き出すことはできません。
2つ目は増分番号ですが、この番号はビルドマシンのリポジトリにのみ適用されるため、開発者にこの番号をループしてチェンジセットハッシュIDを取得する手段を提供する必要があります。そうしないと、かなり役に立たなくなります。
私が個人的に特に気に入っている3番目のアプローチは、タグと距離を非常に人間が読める方法で使用して時間情報を提供し、さらに正確なリビジョンのノードIDを指定します。でもかなり長いです。