4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ビルド時にgitのCommit Hashを定数として自動生成する

Last updated at Posted at 2020-03-19

はじめに

バージョニングはアプリをデプロイする上で大事な要素です。
大抵の開発プラットフォームにはバージョン番号が設定できます。それを設定画面やトップ画面等で表示しているアプリもよく見かけます。
ですが「このアプリはいつ時点のコミットでビルドしたものなのか?」を確認したい場合、数字ではひと目でわかりません。
というわけで、ビルド前に自動で現在のコミットのハッシュ値を定数のクラスとして生成するEditor拡張を作成しました。

準備

Editorフォルダに格納する

CommitHashGenerator.cs

この.csEditorフォルダに格納します。
このとき、自動生成される.csのパスを変更したい場合は以下の箇所を書き換えます。

CommitHashGenerator_Line_28
// replace if necessary
private const string FilePath = "Assets/Scripts/Generated";

生成する

Commit.cs
public static class Commit
{
    public const string Hash = "390181b";
}

このような.csが自動生成されます。

手動生成

スクリーンショット 2020-03-20 1.40.16.png `Create -> CommitHash`で手動で生成することができます。 importした直後はこれで.csを生成してください。

自動生成

IPreprocessBuildWithReport.OnPreprocessBuild
ビルドの開始前に呼ばれる上のコールバックのタイミングで.csを自動生成します。

.gitignore.gitkeep

Commit.csは別のコミットでビルドするたびに再生成されるため、.gitignoreに登録することをおすすめします。
しかしそのままだと空フォルダにUnity.metaを生成するので、.gitkeepを使ってフォルダの構成を維持しておくと便利です。

CI対応

JenkinsCircleCIなど、様々なCI/CDツールがあります。
やり方はプロジェクトによって異なると思うので、以下のpublic staticなAPIを公開してあります。

CommitHashGenerator_publicApi
/// <summary>
/// 引数のstringをHashに設定したCommit.csを生成します.
/// </summary>
public static void GenerateScript(string hash)

/// <summary>
/// 現在のcommitのhash値を取得します.
/// </summary>
public static Task<string> CheckCommitHashAsync()

BuildPipeline.BuildPlayerの実行前に上記のAPIを実行すれば生成されます。

使用例

スクリーンショット 2020-03-20 2.16.23.png デフォルトだと上記のパスに生成されます。 画面に表示してみました。
SampleCommitHash
using UnityEngine;
using UnityEngine.UI;

public class SampleCommitHash : MonoBehaviour
{
    [SerializeField]
    private Text _text;

    private void Start()
    {
        _text.text = Commit.Hash;
    }
}

まとめ

これ作ってなかった自分、アホですわ!
って言いたくなるくらい便利です。
アプリのバイナリのバージョン確認やログ収集など、どの時点かのビルドかがわかるようになるとここまで便利になるとは……。

*「リリースしたいんだけど、このバイナリいつビルドしたやつだろう……*ヨシ!」1

みたいなことがなくせます。やったね!

前回の記事でMessagePack-CSharpのもろもろを解析した結果思いつきました。
OSSをちゃんと読むの大事ですね。肝心のSerialize/Deserializeしてるあたりはぜんぜんわかんなかったです。わからん。
手元に開発環境がmacしかないので、winとかlinuxとかの人は動かしてみて、だめだったらなんか適当に直しといてください。

おしまい。

CommitHashGenerator.cs

参考

【Unity】ビルド時にGitコミットハッシュをバージョン情報に含めた件
Git で現在のコミットのハッシュを取得する方法
(小ネタ)改行文字を削除する
スクリプトからテンプレを自動作成【Unity】【エディタ拡張】
Unityプロジェクトへファイルを追加する際に上書き更新する
【Unity】エディタ拡張で使用できるコールバックを40個まとめて紹介
Unityのエディタ拡張で設定を保存
メニューを追加するための属性「MenuItem」は意外と多機能【Unity】【エディタ拡張】【属性】

  1. もちろんしたことないですけどねそんなこと!!!?!?!!!?!!!?!?!?!?!?!???!!!!

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?