torutkのブログ

ソフトウェア・エンジニアのブログ

gitのリリースタグをアプリケーションのバージョン表記に使う

はじめに

JavaJavaFXで小さなスタンドアロン・アプリケーション(ユーティリティ)を作成、使用するマシンに配置し、使い勝手を見ながら改善しています。

使用しているJavaの種類は、JavaFXを内蔵しているAzul Systems社のOpenJDKであるZuluFX 11で、モジュール(Java Platform Module System)として作成し、jlinkコマンドで実行イメージを作成してJavaのランタイム込みで配布しています。

アプリケーションの利用者から今使っているバージョンを認識し、フィードバックを得るようにするため、バージョン番号表記をどのように組み込もうかと試行錯誤してみました。

世の中よく見かけるバージョン表記は、アプリケーションのメニューバーに「ヘルプ」を置き、メニュー項目に「このアプリケーションについて」等を入れ、それをクリックするとアプリケーションの名前、バージョン、その他情報をポップアップ表示するといったものです。

ですが、小さなプログラムでメニューバーを設けていない場合は別な手段が必要になります。
今回は、ウィンドウのタイトルバーにバージョンを表記することとしました。

f:id:torutk:20190624185938p:plain

バージョン管理ツールとバージョン

gitを使ってソースコードのバージョン管理をしています。リリースの際にはタグでリリースバージョンを設けます。

D:\work> git tag v1.3.2

このタグをバージョン表記に使用することとし、ソースコードリポジトリにはバージョン番号を記載したファイルは設けないようにします。

ビルド時に、次のコマンドでバージョンを取得します。

D:\work> git describe --tag abbrev=0
v1.3.2

abbrev=0を付与しない場合、タグをつけたコミットからタグをつけないコミットを行った際、次の様にタグをつけてからのコミット数とハッシュが追加されて表示されます。

D:\work> git describe --tag
v1.3.2-2-g595ad04
gitのタグの種類

gitには、軽量タグ、注釈タグ、署名タグとタグの種類がいくつか存在します。
軽量タグを付与した場合、git describeでは--tagオプションを指定する必要があります。

注釈タグは、タグを付与するときにコミットログを記述します。注釈タグを付与した場合、git describeでは--tagオプションがなくても最新のタグを取り出すことができます。

バージョン番号の埋め込み方法

JavaFXでは、ウィンドウのタイトルへ表示する文字は次のようにStageクラスのsetTitleメソッドを呼んで設定します。

    @Override
    public void start(Stage primaryStage) throws IOException {
        :(略)
        primaryStage.setTitle("STC-110 Remote Viewer");
        :(略)
    }

ビルド時にgitのタグからバージョン番号を取り出してウィンドウタイトルに表示させるため、ここではリソースバンドルにバージョンをビルド時に埋め込むようにします。

    @Override
    public void start(Stage primaryStage) throws IOException {
        var bundle = ResourceBundle.getBundle("antenna.direction.AntennaDirectionView");
        :(略)
        primaryStage.setTitle("STC-110 Remote Viewer " + bundle.getString("antenna.direction.version"));
        :
Windowsバッチファイルで置換する場合

リソースバンドルには、ビルド時に文字列置換できるように置換キーワードを記述した状態でコミットしておきます。

antenna.direction.version = #VERSION_TO_BE_REPLACED#

そして、ビルド時に置換キーワードをgitのタグ情報に置き換えます。

for /f %%i in ('git describe --tag --abbrev^=0') do set VERSION=%%i

ren %PROPERTY_DIR%\%PROPERTY_FILE% %PROPERTY_FILE%_
setlocal enabledelayedexpansion
for /f "delims=" %%I in (%PROPERTY_DIR%\%PROPERTY_FILE%_) do (
    set line=%%I
    echo !line:#VERSION_TO_BE_REPLACED#=%VERSION%!>>%PROPERTY_DIR%\%PROPERTY_FILE%
)
endlocal