おうちで使ってるビルドシステムをGradleに移行
そのとき、Gradleの勉強がてらユーザーガイドを翻訳してました。せっかくだから公開
http://www.monochromeroad.com/artifacts/gradle/userguide/userguide.html
リポジトリ
http://github.com/literalice/gradle-ja/wiki
Mavenもそんなに深く使い込んでたわけじゃないけど、Gradleはいろいろ分かりやすい感じ
というか、MavenとAntはそんなにかぶってた印象無いけど、GradleとGantは丸かぶりでは?
いままでAntで書いてたところも大体Gradleのほうがやりやすいと思います
2010年10月31日日曜日
2010年7月30日金曜日
Grailsを1.3.3に上げたら、ユニットテストがNullPointerExceptionで壊滅
Grailsのバージョンはもちろん1.3.3
タイトル通り、Grailsを1.3.3に上げたら、ユニットテストがNullPointerExceptionで壊滅しました
原因はGRAILS-6482で1.3.4で直るらしいですが、とりあえず回避方法としては次のコードをユニットテストにいれるといいらしいです。
ユニットテストが多くなってくるとめんどいので、_Events.groovyに次のコードを入れました。
これでいいかどうかは不明ですがとりあえずNullポは消えたので。
タイトル通り、Grailsを1.3.3に上げたら、ユニットテストがNullPointerExceptionで壊滅しました
原因はGRAILS-6482で1.3.4で直るらしいですが、とりあえず回避方法としては次のコードをユニットテストにいれるといいらしいです。
protected void setUp() {
super.setUp()
PluginManagerHolder.pluginManager = [hasGrailsPlugin: { String name -> true }] as GrailsPluginManager
}
protected void tearDown() {
super.tearDown()
PluginManagerHolder.pluginManager = null
}
ユニットテストが多くなってくるとめんどいので、_Events.groovyに次のコードを入れました。
import org.codehaus.groovy.grails.plugins.GrailsPluginManager
import org.codehaus.groovy.grails.plugins.PluginManagerHolder
eventTestPhaseStart = { phase ->
if (phase == 'unit') {
PluginManagerHolder.pluginManager = [hasGrailsPlugin: { String name -> true }] as GrailsPluginManager
}
}
eventTestPhaseEnd = { phase ->
if (phase == 'unit') {
PluginManagerHolder.pluginManager = null
}
}
これでいいかどうかは不明ですがとりあえずNullポは消えたので。
2010年7月9日金曜日
hudson+antでgrailsアプリをビルドする その1
Grailsアプリケーションをhudson上でビルドするにはいくつか方法があります。
hudsonにGrailsプラグインがあるので、それを使用してビルドすることもできます。シェルでgrailsコマンドを呼び出すこともできます。
しかし、後々ビルド手順が複雑になったりしたときなどを考えると、やはりantのbuild.xmlにビルド手順をまとめて、hudson上からはbuild.xmlのデフォルトターゲットを呼び出すだけ、くらいにしておいたほうがいいかと。
いや、gantでもpomでもいいんですけどね。
まず、build.xmlを作成するところまで書いてみます。ポイントは、
では↓
1:build.xmlを生成
というか、grailsが作ってくれます。
(ちなみにこれらのファイルはgrails upgradeでなぜか更新されないので、grailsを更新したらこれらのファイルを削除してもういちどintegrate-withコマンドを実行)
antコマンドを試してみましょう。基本的にgrailsコマンドに対応したantターゲットができています。
必要な環境変数を設定して、実行
普通にやるとメモリ不足で落ちることが多いので、ヒープサイズも指定しておきます。
これですね。
http://jira.codehaus.org/browse/GRAILS-6410
1.3.4で直るらしい。でもまあたぶん、リポジトリ追加してやればいいんじゃないかな…
2:依存先リポジトリの追加
先ほど生成したivysettings.xmlに、antビルドが使用しているリポジトリがリストされているので、ここにさっき足りない言われたライブラリのリポジトリを追加します。
結論から言うと、antのバージョンが1.8系だとダメみたい。
antのバージョンを1.7.1にしてもう一回!
3:依存先リポジトリの追加
さて、私としては、ビルド手順は極力build.xmlに集めたいです。
なので、test、warなどのコマンドをターゲットを順に呼び出すターゲットを作成します。
私はbuild.xmlに直接追加しましたが、別のビルドファイルを作成して、そのファイルからbuild.xmlを呼び出すようにしてもいいかもしれません。
あと、non-interactiveをコマンド引数に指定しないと、hudsonに持って行ったときにループっぽくなってビルドが進まなくなります。
まず、antのgrailsマクロにビルド環境の引数を追加します。
つぎにデフォルトターゲットに指定するビルド用ターゲット
これでbuild.xmlができました。あとはhudson上に持って行ってビルドするだけです。
ただし、このままだとgrailsがビルドやテストに使用するディレクトリ(普通は%HOME%/.grails以下)をhudsonジョブ間で共有します。
並行ビルドなど考えると、各ジョブ間の作業ディレクトリはなるべく分割しておきたいところです。
このへんは次回。
hudsonにGrailsプラグインがあるので、それを使用してビルドすることもできます。シェルでgrailsコマンドを呼び出すこともできます。
しかし、後々ビルド手順が複雑になったりしたときなどを考えると、やはりantのbuild.xmlにビルド手順をまとめて、hudson上からはbuild.xmlのデフォルトターゲットを呼び出すだけ、くらいにしておいたほうがいいかと。
いや、gantでもpomでもいいんですけどね。
まず、build.xmlを作成するところまで書いてみます。ポイントは、
- Antはバージョン1.7.xを使う
- Antビルド時にUNRESOLVED DEPENDENCIESとか言われたらivy設定にリポジトリを追加
- Antビルド時にSSLHandshakeExceptionとか言われたら証明書をインポートしてみる
では↓
1:build.xmlを生成
というか、grailsが作ってくれます。
cd [grails-project]これで、Grailsプロジェクトの中にbuild.xml、ivy.xml、ivysettings.xmlができているはず。
grails integrate-with --ant
(ちなみにこれらのファイルはgrails upgradeでなぜか更新されないので、grailsを更新したらこれらのファイルを削除してもういちどintegrate-withコマンドを実行)
antコマンドを試してみましょう。基本的にgrailsコマンドに対応したantターゲットができています。
必要な環境変数を設定して、実行
普通にやるとメモリ不足で落ちることが多いので、ヒープサイズも指定しておきます。
set GRAILS_HOME=C:\grails\grails-1.3.2…失敗。あれ?
set ANT_OPTS=-Xmx1024m -XX:MaxPermSize=512m
ant compile
download-ivy:
...(略)...
[ivy:retrieve] ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:retrieve] :: UNRESOLVED DEPENDENCIES ::
[ivy:retrieve] ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:retrieve] :: org.jboss.netty#netty;3.1.5.GA: not found
[ivy:retrieve] ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:retrieve]
[ivy:retrieve]
[ivy:retrieve] :: USE VERBOSE OR DEBUG MESSAGE LEVEL FOR MORE DETAILS
BUILD FAILED
D:\project\literalice\sandbox\grails-ant-build\build.xml:60: impossible to resolve dependencies:
resolve failed - see output for details
これですね。
http://jira.codehaus.org/browse/GRAILS-6410
1.3.4で直るらしい。でもまあたぶん、リポジトリ追加してやればいいんじゃないかな…
2:依存先リポジトリの追加
先ほど生成したivysettings.xmlに、antビルドが使用しているリポジトリがリストされているので、ここにさっき足りない言われたライブラリのリポジトリを追加します。
で、もういちど
ant compileうは失敗しかもイミフ
...(略)...
compile:
[grailsTask] Resolving dependencies...
[grailsTask] Dependencies resolved in 738ms.
BUILD FAILED
D:\project\literalice\sandbox\grails-ant-build\build.xml:104: The following error occurred while executing this line:
D:\project\literalice\sandbox\grails-ant-build\build.xml:48: Unable to start Grails: java.lang.reflect.InvocationTargetException
結論から言うと、antのバージョンが1.8系だとダメみたい。
antのバージョンを1.7.1にしてもう一回!
ant compileOK。
...(略)...
[grailsTask] [groovyc] Compiling 7 source files to D:\project\literalice\sandbox\grails-ant-build\target\classes
[grailsTask]
BUILD SUCCESSFUL
Total time: 5 seconds
3:依存先リポジトリの追加
さて、私としては、ビルド手順は極力build.xmlに集めたいです。
なので、test、warなどのコマンドをターゲットを順に呼び出すターゲットを作成します。
私はbuild.xmlに直接追加しましたが、別のビルドファイルを作成して、そのファイルからbuild.xmlを呼び出すようにしてもいいかもしれません。
これでもいいですが、私の場合war作成時のビルド環境(dev,prod,test,etc...)を明示したかったので、以下のように修正しました。
あと、non-interactiveをコマンド引数に指定しないと、hudsonに持って行ったときにループっぽくなってビルドが進まなくなります。
まず、antのgrailsマクロにビルド環境の引数を追加します。
つぎにデフォルトターゲットに指定するビルド用ターゲット
これでbuild.xmlができました。あとはhudson上に持って行ってビルドするだけです。
ただし、このままだとgrailsがビルドやテストに使用するディレクトリ(普通は%HOME%/.grails以下)をhudsonジョブ間で共有します。
並行ビルドなど考えると、各ジョブ間の作業ディレクトリはなるべく分割しておきたいところです。
このへんは次回。
2010年7月6日火曜日
GrailsアプリケーションのAntビルドでSSLHandshakeException
grails1.2系で、初めてプロジェクトをビルドするときにantでビルドすると、こんなエラーが起こることがあります。
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException
これが発生するのは、プロジェクトはあるけど、まだ作業ディレクトリ(.grails)がない状態。つまり、
Tomcatのプラグインを、httpsのプラグインサイト上から落そうとして証明書エラー…javaが知らない認証局を使ってるらしい。
プラグインサイトが使用している中間認証局の証明書をkeytoolでインポートすれば、とりあえずビルドはできます。
証明書インポートについては、HttpClientでSSL通信が詳しいです。
なお、Grails1.3以降だとtomcatプラグインはネットワークからではなくGRAILS_HOMEから持ってくるようで、このエラーは発生しませんでした。
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException
これが発生するのは、プロジェクトはあるけど、まだ作業ディレクトリ(.grails)がない状態。つまり、
- Grailsプロジェクトを新マシンにチェックアウトしてantでビルド
- 作業ディレクトリを~/.grailsから別の場所に変更してantでビルド
Tomcatのプラグインを、httpsのプラグインサイト上から落そうとして証明書エラー…javaが知らない認証局を使ってるらしい。
プラグインサイトが使用している中間認証局の証明書をkeytoolでインポートすれば、とりあえずビルドはできます。
証明書: https://www.startssl.com/certs/sub.class2.server.ca.crt
keytool -import -keystore %JAVA_HOME%/jre/lib/security/cacerts -file sub.class2.server.ca.crt -alias sub.class2.start.com
パスワードは変更していなければ「changeit」keytool -import -keystore %JAVA_HOME%/jre/lib/security/cacerts -file sub.class2.server.ca.crt -alias sub.class2.start.com
証明書インポートについては、HttpClientでSSL通信が詳しいです。
なお、Grails1.3以降だとtomcatプラグインはネットワークからではなくGRAILS_HOMEから持ってくるようで、このエラーは発生しませんでした。
2010年5月13日木曜日
GrailsのIntegrationTestで、ファイルのアップロードをテストする
grailsのバージョンは1.2.1
spockのバージョンは0.4-SNAPSHOT
とりあえず。
spockのバージョンは0.4-SNAPSHOT
import org.springframework.mock.web.MockMultipartHttpServletRequest
import org.springframework.mock.web.MockMultipartFile
import grails.plugin.spock.IntegrationSpec
class FileUploadControllerSpec extends IntegrationSpec {
def controller
def setup() {
controller = new FileUploadController()
controller.request.metaClass.mixin MockMultipartHttpServletRequest
}
def "アップロードされたファイルを保存する"() {
when:
MockMultipartFile file = new MockMultipartFile("html.attr.name", "originalFileName", "text/plain", "ファイルの内容".bytes)
controller.request.addFile(file)
and:
controller.save()
then:
controller.responce.redirectedUrl == "/fileUpload/show/1"
}
}
とりあえず。
2010年2月16日火曜日
IntegrationTestのときにタイムスタンプの自動設定を切りたい
Grailsのバージョンは1.2.1
lastUpdatedでソートしてるときとか、タイムスタンプの自動設定を切りたいんです。
[DomainClass]が何かのドメインだとして、
DomainClass.mapping.autoTimestamp(false)
まあGroovy的には当然かもですが。
lastUpdatedでソートしてるときとか、タイムスタンプの自動設定を切りたいんです。
[DomainClass]が何かのドメインだとして、
DomainClass.mapping.autoTimestamp(false)
まあGroovy的には当然かもですが。
2010年1月10日日曜日
Grailsの統合テスト内で、タグライブラリを呼び出す
Grailsのバージョンは1.2.0
備忘録的なメモ
タグライブラリやコントローラーのIntegration-Test書いてると、テストの中で標準(g)のタグライブラリ呼び出したくなることありませんか?あんまないか。
上のはSpockの仕様ですけど、普通のGroovyPagesTestCase使ったテストケースでもいけるんじゃないかと。まあ、applyTemplate使ってもいいすけど。
コントローラ内だったら、なんにもしなくても message(code:"ほげほげ") でタグライブラリ呼び出せるんだけど…
もっといい方法ありましたら教えてくださいです。
備忘録的なメモ
タグライブラリやコントローラーのIntegration-Test書いてると、テストの中で標準(g)のタグライブラリ呼び出したくなることありませんか?あんまないか。
import org.codehaus.groovy.grails.commons.ApplicationHolder
import org.codehaus.groovy.grails.web.taglib.NamespacedTagDispatcher
class CustomTagLibSpecification extends GroovyPagesSpecification {
NamespacedTagDispatcher g = ApplicationHolder.application.mainContext.getBean('gspTagLibraryLookup').lookupNamespaceDispatcher('g')
def "仕様かきかき"() {
message = g.message(code:"message.properties.message.code")
...
}
}
上のはSpockの仕様ですけど、普通のGroovyPagesTestCase使ったテストケースでもいけるんじゃないかと。まあ、applyTemplate使ってもいいすけど。
コントローラ内だったら、なんにもしなくても message(code:"ほげほげ") でタグライブラリ呼び出せるんだけど…
もっといい方法ありましたら教えてくださいです。
登録:
投稿 (Atom)