Quitada ブログ HAX

Hatena Blog でも Quitada ブログ

Pivotal GemFire の OSS 版、Geode のビルド

Pivotal GemFire がオープンソース化されて、Geode(ジオード?)として公開されました。Pivotal Network にてソースコード&ビルドスクリプト一式がダウンロードできるので、ひとまずビルドしてみました(2015/4/11 現在、v1.0.0)。ややはまりでした。本ブログエントリーで、注意点を共有したく思います。

まずは、ビルド環境に Java がインストールされていることが必要です。無難に、JDK7 あたりをインストールしておきましょう。

ビルドツールには、gradle が使われていて、READEME.md に沿って、以下のコマンドを実行します。

$ ./gradlew build installDist

で早速はまりましたー。gradle をダウンロードしようとして、私の環境(?)では、以下の例外がでていきなりビルドが始まらず…。

Downloading https://services.gradle.org/distributions/gradle-2.3-bin.zip

Exception in thread "main" javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException:
No subject alternative DNS name matching services.gradle.org found.
        at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
        at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1904)
        at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:279)
        at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:273)
        at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1446)
  :

例外メッセージから、対処方法をググるも、どれもこれも面倒くさそうで、それっぽいの試したけどダメで。セキュリティー系の例外なので、https じゃなくて、http でアクセスするようにすればいいんじゃね?と思って以下のように gradle-wrapper.properties を開いて、distributionUrl の行に記述されている、gradle のダウンロード URL を https から http に変更したらうまくいきました。

$ cd /path/to/geode-1.0.0.0-SNAPSHOT/gradle/wrapper
$ vi gradle-wrapper.properties

さて、コンパイル・ビルドの後の、JUnit テストをパスしないと、ビルドに失敗したことになるみたいです。どちらかというと、JUnit テストではまりました。

まず、当初は日本語 Windows 8.1 環境でビルドしてたら、テスト中に以下の例外が発生しました。

com.gemstone.gemfire.cache.CacheXmlException: msgID 3511: XMLの解析中の致命的なエラー,
caused by org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 31;
機能"http://apache.org/xml/features/disallow-doctype-decl"がtrueに設定されている場合、DOCTYPEは指定できません。

これは見るからに不可解なんですが、最近の GemFire はキャッシュ設定ファイル(cache.xml)が以前の古い DOCTYPE を指定する形式の場合、英語以外のロケールの環境では、この例外がでることがあるんですよね。バグですよね。なので、これがでる場合は、gradlew スクリプトを編集してビルドスクリプト実行時は英語ロケールになるようにしてやりましょう。

$ cd /path/to/geode-1.0.0.0-SNAPSHOT
$ vi gradlew

スクリプトの先頭の方に、以下を追加しておけば良いでしょう。

JAVA_OPTS="-Duser.language=en"

「当初 Windows で…」って話だったのに、なぜ設定例は Linux というか UNIX 系 OS のコマンドラインなのかというと、Windows だと以下の例外がでて何かのテストに失敗するのでそもそも使えないからです!

com.gemstone.gemfire.internal.JarClassLoaderJUnitTest > testDeclarableFunctionsWithParms FAILED
    java.io.IOException: プロセスはファイルにアクセスできません。別のプロセスがファイルの一部をロックしています。
        at java.io.FileOutputStream.writeBytes(Native Method)
        at java.io.FileOutputStream.write(FileOutputStream.java:325)
        at com.gemstone.gemfire.internal.JarClassLoaderJUnitTest.writeJarBytesToFile(JarClassLoaderJUnitTest.java:704)
        at com.gemstone.gemfire.internal.JarClassLoaderJUnitTest.testDeclarableFunctionsWithParms(JarClassLoaderJUnitTest.java:412)

com.gemstone.gemfire.internal.JarClassLoaderJUnitTest > testClassOnClasspath FAILED
    java.io.IOException: プロセスはファイルにアクセスできません。別のプロセスがファイルの一部をロックしています。
        at java.io.FileOutputStream.writeBytes(Native Method)
        at java.io.FileOutputStream.write(FileOutputStream.java:325)
        at com.gemstone.gemfire.internal.JarClassLoaderJUnitTest.writeJarBytesToFile(JarClassLoaderJUnitTest.java:704)
        at com.gemstone.gemfire.internal.JarClassLoaderJUnitTest.testClassOnClasspath(JarClassLoaderJUnitTest.java:108)

これはねぇ、テストの記述の仕方が悪いところに、Windows のクソなファイルシステム仕様(あるプロセスがあるファイルをつかんでいると、他のプロセスはそのファイルに対する操作ができない)が重なってる系のあれじゃん。イライラするー。ということで、Windows はあきらめて、ビルド環境を LinuxCentOS 6)に変更。

これだけ地雷踏んだのだから、CentOS ではすんなりいけるだろう!と思ったら、テスト中に「ホスト名から IP 解決できなくてテストに失敗したよ」みたいなのがぞろぞろでてきて、またしてもビルド失敗。

com.gemstone.gemfire.admin.DistributedSystemFactoryIntegrationJUnitTest > testConnect FAILED
    com.gemstone.gemfire.InternalGemFireError: Failed to get local host
        at com.gemstone.gemfire.internal.Assert.throwError(Assert.java:82)
        at com.gemstone.gemfire.internal.Assert.assertTrue(Assert.java:106)
        at com.gemstone.gemfire.admin.internal.InetAddressUtil.createLocalHost(InetAddressUtil.java:106)
  :

まーこれはあれだ。CentOS をインストールした後に、不用意にホスト名を変更して、そのホスト名に対する IP を /etc/hosts ファイルに書いてなかったらでしたー。ぐはぁ。環境はきちんと設定しましょう。

ということで、ここまでやって、なんとかビルドに成功しました。ビルドされたものは、以下のディレクトリに、tar 形式と zip 形式の 2 つのアーカイブ形式でできがります。

/path/to/geode-1.0.0.0-SNAPSHOT/gemfire-assembly/build/distributions

まーこれらのいずれかを、適当なディレクトリに展開して、Pivotal GemFire と同様の設定してやれば、動くでしょうということですね。

Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築

Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築