Gradle から Git を利用してみる

前回GitHubMaven リポジトリにする方法を書きましたが、 成果物を GitHub へ公開するには コマンドでの操作が必要なため結構面倒です。
しかも、毎回同じコマンドを実行し、『○○ 0.1.0 リリース』 みたいなありきたりなコミットコメントを 書かなくてはならない...
こういう退屈な反復作業を行うために Gradle のようなビルドツールはあるんだろ!!
ということで Gradle の uploadArchives タスクで直接 成果物を GitHub へ公開してみましょう。

今回は Gradle から git を使うために Javaでおなじみ?の JGit を使います。
JGit は EGit とともに現在もかなり活発に開発が進められており、注目のライブラリの一つです。
現在の最新版は 0.11.3 ですが Maven リポジトリには 0.10.1 までしか公開されていないようなので 0.10.1 を使います。
0.11.x では clone 等いくつか利用可能なコマンドも増えているようなので もっと面白いことができそうですが...
公開されるのを待ちましょう...

使い方はとっても簡単です。

1. dependencies の設定

ビルドスクリプトで利用するので buildscript { ... } の中で設定します。
buildscript {
    repositories {
        mavenCentral()
        mavenRepo urls: 'http://download.eclipse.org/jgit/maven'
    }
    dependencies {
        classpath 'org.eclipse.jgit:org.eclipse.jgit:0.10.1'
    }
}

2. GitHub へ公開

前回 作成した build.gradle の uploadArchives タスクに 以下のような感じで GitHub へ公開するための処理を追加します。
もちろん << はお忘れなく...
apply plugin: 'maven'

// maven ローカルリポジトリのパス
mavenRepository = '/path/to/maven'

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: uri(mavenRepository))
        }
    }
}

uploadArchives << {

    // リポジトリの設定
    def repos = new RepositoryBuilder()
                    .setGitDir(new File(mavenRepository, ".git"))
                    .setWorkTree(new File(mavenRepository))
                    .readEnvironment()
                    .build()

    def git = new Git(repos)

    // git add .
    git.add().addFilepattern(".").call()
    
    // git commit -m "gradle-native2ascii-plugin 0.1.0 release"
    git.commit().setMessage("${archivesBaseName} ${version} release").call()

    // git push origin gh-pages:gh-pages
    git.push().setRemote("origin").setRefSpecs(new RefSpec("gh-pages:gh-pages")).call()

    repos.close()
}
あとは
$ gradle uploadArchives
と実行するだけで 成果物を GitHub に公開することができます。
前回行った『3. GitHub に push して最新版を公開する』 のような面倒な作業は もう必要ありません。
もちろん、本格的に利用するにはエラー処理等もちゃんと実装しないといけないので こんなに単純ではないでしょうが、個人でちょっと使う分には十分でしょう。
と言うことで これらの処理がちゃんと使えるようにプラグイン化してみようかと計画中。(計画倒れするかも...)

ところで 前回の記事を書いた後に知ったのですが、git は 別のリポジトリをサブモジュールや入れ子として組み込むことができるようです。
そんな便利な機能があるのであれば 使わない手はありません。
例えば 今回の例も

gradle-native2asii-plugin  <-- gradle-native2ascii-plugin リポジトリ の clone
  +-- src
  +-- build
  +-- build.gradle
  +-- maven                <-- maven リポジトリ の clone
のような構成でローカルに clone すると非常に便利です。
mavenRepository 変数も gradle-native2ascii-plugin からの相対パスで書けるので...
もちろん、maven リポジトリは複数のリポジトリに組み込むこともできます。

実際の手順はこんな感じ...

$ git clone git@github.com:bluepapa32/gradle-native2ascii-plugin.git
$ cd gradle-native2ascii-plugin
$ git clone git@github.com:bluepapa32/maven.git
もしくは
$ git submodule add git@github.com:bluepapa32/maven.git
としてサブモジュールとしても良いですが 今回は単なる入れ子として gradle-native2ascii-plugin に組み込みました。
サブモジュールにすると ちょっとだけ操作が面倒なので...