web-dev-qa-db-ja.com

自動バージョンへのGradleスクリプトとAndroidにコミットハッシュを含める

コミットごとにアプリケーションを自動バージョン管理するgradleスクリプトを記述する必要があります。また、テスター用のアプリケーションの参照としてコミットハッシュを含める必要があります。

自動バージョン管理が通常どのように機能するのか混乱しています。誰かが自動バージョン管理プロセスを説明できますか?

43
Shatazone

同様の問題が発生しましたが、gitNameを含めるようにversionNameを変更したくありませんでした。これを1.2.2のようなものとして維持したかったのですが、UIにgitハッシュを表示する可能性がまだあります。

他の回答 のコードを変更し、buildConfigFieldタスクを使用して、Javaコードで参照できるBuildConfig.GitHash値を生成します。

これをモジュールのbuild.gradleファイルのAndroidセクションの上に追加します。

def getGitHash = { ->
    def stdout = new ByteArrayOutputStream()
    exec {
        commandLine 'git', 'rev-parse', '--short', 'HEAD'
        standardOutput = stdout
    }
    return stdout.toString().trim()
}

次に、build.gradleのdefaultConfigセクションのAndroidセクション、つまりversionNameの下に次の行を追加します。

buildConfigField "String", "GitHash", "\"${getGitHash()}\""

これにより、自動生成されたBuildConfig.Javaファイルに次の行が生成されます。

// Fields from default config.
public static final String GitHash = "e61af97";

これで、Java code with BuildConfig.GitHash

112
Paul

理想的なソリューションの1つは、プロジェクトのgitステータスからバージョンを取得することです。このように、バージョン管理は、変数を増やすことや、gradleまたはconfigファイルのテキストを変更することを覚えていることに依存しません。もう1つの利点は、特定のコードステータスに対するバージョン名とコードのトレーサビリティです。

http://ryanharter.com/blog/2013/07/30/automatic-versioning-with-git-and-gradle/ で説明的な例を見つけることができます

アイデアは、getVersionName関数でgit情報を取得し、gradleスクリプトでその関数を使用することです。

/*
 * Gets the version name from the latest Git tag
 */
def getVersionName = { ->
    def stdout = new ByteArrayOutputStream()
    exec {
        commandLine 'git', 'describe', '--tags'
        standardOutput = stdout
    }
    return stdout.toString().trim()
}

もちろん、コマンドラインgitを使用可能にする必要があります(コマンドgit describe --tagsが実行されて情報が生成されます)。

別のアプローチ(gitからバージョン情報を取得することにも基づいています)は、そのロジックをgradleプラグインに外部化することです--- https://github.com/moallemi/gradle-advanced-build-version =- https://github.com/infusionsoft/gradle-build-version-plugin - https://github.com/nemerosa/versioning

使用するバージョンは、適用するバージョン管理ポリシーの種類によって異なります。

11
Adrián Moreno

これを行うために、Gradleプラグインを作成しました。プロジェクトと完全な手順は https://github.com/lessthanoptimal/gversion-plugin にあります

それを使用するには、以下をbuild.gradleファイルに追加します

_plugins {
  id "com.peterabeles.gversion" version "1.2.4"
}

gversion {
  srcDir = "src/main/Java/"
  classPackage = "com.your.package"
  className = "MyVersion"                   // optional. If not specified GVersion is used
  dateFormat   = "yyyy-MM-dd'T'HH:mm:ss'Z'" // optional. This is the default
  timeZone     = "UTC"                      // optional. UTC is default
}
_

ここで、ファイルを作成するには、gradleタスク「createVersionFile」を実行するだけです。次の行をgradleプロジェクトに追加することを検討してください。project.compileJava.dependsOn(createVersionFile)これにより、Gradleがプロジェクトをビルドするたびにファイルが生成されます。 Androidの手順については、上記のWebサイトを参照してください。

ファイルは次のようになります

_/**
 * Automatically generated file containing build version information.
 */
public class MyVersion {
    public static final String MAVEN_GROUP = "com.your";
    public static final String MAVEN_NAME = "project_name";
    public static final String VERSION = "1.0-SNAPSHOT";
    public static final int GIT_REVISION = 56;
    public static final String GIT_SHA = "a0e41dd1a068d184009227083fa6ae276ef1846a";
    public static final String BUILD_DATE = "2018-04-11T12:19:03Z";
    public static final long BUILD_UNIX_TIME = 1523449143116L;
}
_

バージョンファイルは.gitignoreに追加することもできます。これは、自動生成されるため、gitでは必要ないためです。

4
lessthanoptimal

grgit-Groovy/Gradle Git も検討する価値があります。これは、GradleスクリプトでGitのコミットハッシュを含む情報の抽出を簡素化するのに役立ちます。

2
javabrett