Hatena::ブログ(Diary)

leftovers... このページをアンテナに追加 RSSフィード

2010-08-15

Grailsプラグイン + Mavenをローカルリポジトリでの注意点とかメモ

結論が出てるのか出てないのか、自分でもわからなくなってきたぞ!

って事で自分なりの結論を先に書く。

あとはグダグダなメモなのでツッコミは無しで・・・。

結論+わかった事

  1. ローカルリポジトリにあるプラグイン依存関係があるプラグインは、設定しなくてもコンパイルが通ってしまうが、mavenLocal()は必要。
  2. ローカルリポジトリに置いておく依存参照されるプラグインgroupIdは'org.grails.plugins'に設定しないとダメみたい!
  3. このあたりの検証は疲れる。



もう一回いっておく。ダグダなメモなのでツッコミは無しで・・・。

験用アプリプラグインを作成

mainapp - プラグインを使用するGrailsアプリ

myplugin-one - 適当なプラグイン

myplugin-two - 適当なプラグイン

myplugin-depends - プラグイン1,2が参照するプラグイン

つまり以下の関係になる。

mainapp
    |-myplugin-one --dependsOn-- myplugin-depends
    |-myplugin-two --dependsOn-- myplugin-depends

myplugin-dependsを作成。maven-publisherプラグインインストール

grails install-plugin maven-publisher

グループ定義を追加。

class MypluginDependsGrailsPlugin {
    def group = 'jp.xmldo.grails'
..省略..
}

myplugin-dependsをmaven-installしてローカルリポジトリに追加。

grails maven-install

適当なドメインクラスMessageをmyplugin-dependsに生成。

grails create-domain-class Message

そのドメインクラス継承するドメインクラスを、myplugin-one、myplugin-twoに作成して、それぞれmyplugin-one、myplugin-twoプラグインにdependsOn、loadAfterを定義する。

    def dependsOn = ['myplugin-depends':'0.1']
    def loadAfter = ['myplugin-depends']

myplugin-onegrails compileする。もちろん、この時点では、ドメインクラスMessageが無いのでコンパイルエラー

BuildConfig.groovy依存定義をする。

    plugins {
        runtime 'jp.xmldo.grails:myplugin-depends:0.1'
    }

この時点では、mavenLocal()は参照させていない。

もう一度コンパイル

依存プラグインインストールされて、コンパイルOK。

しかし、grails cleanして、もう一度コンパイル。するとエラー

よく見ると、myplugin-dependsにドメインクラスを追加した後にバージョンを上げていなかったから、内容が更新されていない。

つまり、当たり前の動作で、

  • maven-installを行う。
  • ドメインクラス追加。
  • バージョンを上げずにmaven-installを行う。
  • 他から見ると最新になっていない。

なので、バージョンを調整して再度実行。

grails clean
grails compile

問題無くコンパイルOK

この時点では、mavenLocal()は参照させていない。

コンパイルもできたので、myplugin-onemaven-installする。

そして、mainappで読みこんでみる。

    plugins {
        runtime 'jp.xmldo.grails:myplugin-one:0.1'
    }
  • mavenLocal()設定無し。=> もちろん失敗。
  • mavenLocal()を設定する。 => myplugin-dependsが見つからないよ!と言われる。
          ::::::::::::::::::::::::::::::::::::::::::::::

          ::          UNRESOLVED DEPENDENCIES         ::

          ::::::::::::::::::::::::::::::::::::::::::::::

          :: org.grails.plugins#myplugin-depends;0.2: not found

          ::::::::::::::::::::::::::::::::::::::::::::::

ここで言いたいのは、さっきmyplugin-onemaven-installしたときは問題無くコンパイルインストールが行われたじゃないか!で、何で見つからないとか言うのだよ!

気を取り直して、myplugin-oneに戻る。

myplugin-oneのBuildConfig.groovyにmavenLocal()を設定する。そしてmyplugin-oneバージョンも更新

まだ、UNRESOLVED DEPENDENCIES、org.grails.plugins#myplugin-depends;0.2: not found

そもそも、groupIdはorg.grails.pluginsでなくて、jp.xmldo.grailsだよ!

なので最終的に。myplugin-dependsのgroupIdをorg.grails.pluginsに変更してやる!

  • myplugin-dependsのgroupIdをorg.grails.pluginsに変更
  • myplugin-dependsをmaven-installする。=> これで 'org.grails.plugins:myplugin-depends:0.2'という別物が完成。
  • myplugin-oneの参照している箇所も変更。バージョンも更新。'jp.xmldo.grails:myplugin-one:0.3'に更新
  • mainappのBuildConfig.groovy内も変更。

いざ!コンパイル実行!

コンパイル成功!

2010-08-12

Maven-Gaelyk Archetype v0.4.3 リリース! GaelykをMavenでサクッとね。

久しぶりにGaelykでもと思ったら。

maven-gaelykも公開されてました。

中身は、

maven-gaelyk公式サイト: http://code.google.com/p/maven-gaelyk/

Gaelyk公式サイト: http://gaelyk.appspot.com/

使い方。

mvn archetype:generate -DarchetypeRepository=http://maven-gaelyk.googlecode.com/svn/repository/ \
 -DarchetypeGroupId=com.codeconsole \
 -DarchetypeArtifactId=gaelyk-archetype -DarchetypeVersion=0.4.3 \
 -DartifactId=gaelykapp -DgroupId=com.appspot.gaelyk \
 -DgaeApplicationName=gaelykapp
cd gaelkyapp
mvn gae:run

起動したら http://localhost:8080/

mvn gae:deploy

簡単ですね。

Spring-Securityテンプレート版ってのもあります。

gaelyk-security-archetype

 -DarchetypeArtifactId=gaelyk-security-archetype -DarchetypeVersion=0.4.0
mvn archetype:generate -DarchetypeRepository=http://maven-gaelyk.googlecode.com/svn/repository/ \
 -DarchetypeGroupId=com.codeconsole \
 -DarchetypeArtifactId=gaelyk-security-archetype -DarchetypeVersion=0.4.0 \
 -DartifactId=gaelykappss -DgroupId=com.appspot.gaelyk \
 -DgaeApplicationName=gaelykappss

少し古いので、一部自分で直す。

pom.xmlを開いて、3.0.3.CI-SNAPSHOTの箇所を3.0.3.RELEASEに変更。

ついでに、他も変更。まあ、いつか更新されるとおもいますが・・・。

<gaelyk.version>0.4.3</gaelyk.version>
<groovy.version>1.7.4</groovy.version> 
<gae.version>1.3.5</gae.version>
<springsecurity.version>3.0.3.RELEASE</springsecurity.version>
<gaeplugin.version>0.6.0</gaeplugin.version>
mvn gae:run

起動したら http://localhost:8080/admin をみる。

認証定義等は、applicationContext-security.xml に書いてあるので参考にする。

<authentication-manager alias="authenticationManager">
  <!-- SHA-256 values can be produced 
     using 'echo -n your_desired_password | sha256sum' (using normal *nix environments) -->
  <authentication-provider>
    <password-encoder hash="sha-256"/>
    <user-service> 
      <user name="admin@gaelykapp.com" password="8c6976e......" authorities="ROLE_ADMIN"/>
      <!-- password is admin -->
      <user name="user@gaelykapp.com" password="04f8996da763b7a9....." authorities="ROLE_USER"/>
      <!-- password is user -->
    </user-service>
  </authentication-provider>
</authentication-manager>

URLの制御は、こんな感じ。

<intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')"/>
<intercept-url pattern="/**" access="permitAll" />

普通にSpring-Securityですね。

2010-08-10

GrailsとMavenで。

Grailsgrails-maven-archetypeは意外と前からあり、現在の物も、OCTO(http://forge.octo.com/)のArnaud Heritier氏が2007年頃に実装した物がベースになっています。その後、更新が止まり放置され気味?になりましたが、最近?!メンテナンスされるようになり、以外とリリースに合わせて更新されてたりします。

ちなみに、Arnaudさんとは、2007年にロンドンで開催された GeX2007 でお会いしました。片言の日本語で挨拶をしてくれたナイスガイ。

当時のArnaud Heritier氏のブログ http://blog.octo.com/integrez-vos-developpements-d-applications-grails-avec-maven/

・・・うーん3年前か・・・・。

・・・懐かしさにひたってる場合では無くて。

GrailsMavenでやってみる

公式なドキュメントMaven Integrationを参考に。

http://grails.org/doc/latest/guide/4.%20The%20Command%20Line.html#4.5%20Ant%20and%20Maven

まあ、簡単に説明。

mvn archetype:generate -DarchetypeGroupId=org.grails \
    -DarchetypeArtifactId=grails-maven-archetype \
    -DarchetypeVersion=1.3.4 \
    -DgroupId=jp.grails -DartifactId=tekitouna-app
mvn initialize
mvn grails:help
mvn grails:run-app

既存のプロジェクトMaven対応(pom.xml追加)

mvn org.grails:grails-maven-plugin:1.3.3:create-pom -DgroupId=jp.grails

公式ドキュメントに色々かいてあるよ

Grailsコマンドとかに設定してあるメモリーの設定はmvnでは引き継がれないからね。

export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=192m"

コンパイラは、1.5にセットされてるよ。1.6にするなら、変えてね。

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <source>1.6</source>
    <target>1.6</target>
  </configuration>
</plugin>

Grails Maven Publisher プラグインで、Grails プラグインをローカルインストールするよん

GrailsプラグインMaven管理。簡単にローカルのみでね。

何故?

まあ、他にも、いろいろありまして。この決断。

資料。

http://www.slideshare.net/tyama/jggug-2010-330-grails-13

※過去の自分のスライド。 => 23p

http://grails.org/doc/latest/guide/3.%20Configuration.html#3.7.7%20Plugin%20JAR%20Dependencies

http://d.hatena.ne.jp/mottsnite/20100311/1268261367


では、やってみる。

対象のGrailsプラグインプロジェクトmaven-publisherプラグインインストール

% grails install-plugin maven-publisher

プラグインディスクリプタファイル(XxxGrailsPlugin.groovy)に、group設定

※いまだドキュメントには・・・。

class ResourcesGrailsPlugin {
    def group = 'jp.xmldo.grails'
    def version = "0.3.3-SNAPSHOT"
//..略..
}

GrailsプラグインローカルMavenリポジトリインストール

% grails maven-install 

そして、実際にプラグインを使用したいプロジェクト依存関係を追記。

上記の例だと、'jp.xmldo.grails:resources:0.3.3-SNAPSHOT' となる。

grails.project.dependency.resolution = {
    inherits("global") {
    }
    log "warn" // log level of Ivy resolver, either 'error', 'warn', 'info', 'debug' or 'verbose'
    repositories {
        grailsPlugins()
        grailsHome()
        grailsCentral()
        mavenLocal()   //←これ重要
        mavenCentral()
    }
    dependencies {
    }
    plugins {
        //こんな感じで書く。
        runtime 'jp.xmldo.grails:resources:0.3.3-SNAPSHOT'
    }
}

まとめ。

  • 超簡単にできる。

たったの数ステップ。(1)プラグイン入れる (2)groupを追記(※別に無くても良い) (3)コマンド一発。

2010-03-07

Cloudtoolsを使ってEC2インスタンスを起動してwarをデプロイする.Maven編

Cloudtoolsを使ってEC2インスタンスを起動してwarをデプロイする。

今回は、CloudtoolsのMavenプラグインでWebアプリケーションをEC2にデプロイする方法です。

Cloudtoolsとは、前のポストでも説明していますが。

CloudToolsプラグインでAmazon EC2 - leftovers...

Chris Richardson氏(POJOs in Actionの著者さん)が開発した、

EC2にJEEアプリケーションを簡単にデプロイするためのGroovyベースのフレームワークEC2Deploy使用したツール群です。現在MavenプラグインGrailsプラグインがあります。AMIはCloudtools専用?のものが用意されています。

http://code.google.com/p/cloudtools

http://www.cloudfoundry.com/cloudtools.html



準備するもの

では開始!

デプロイしたいwarをS3にアップロード

S3にフォルダというかバケットを作成してその中にアップロード


aws.propertiesの設定

imageId.m1.small、imageId.m1.large、imageId.m1.xlargeは以下と同じように設定。

accountId、accessKey、secretKey、keyName、keyPairFile、sshDirを設定

imageId.m1.small=ami-6f2cc906
imageId.m1.large=ami-0129cc68
imageId.m1.xlarge=ami-0129cc68
accountId=0000-0000-0000な感じのAWSのID
accessKey=あなたのアクセスキー
secretKey=あなたのシークレットキー
keyName=キー名称キーペアの名前
keyPairFile=/Path/to/your/mykeypair.pem キーペアファイルへのパス
sshDir=/usr/bin sshのあるディレクト

pom.xmlの設定

<project>  <modelVersion>4.0.0</modelVersion>
  <groupId>ec2deploy</groupId>
  <artifactId>standalone-deployment</artifactId>
  <version>1.0</version>

  <repositories>
    <repository>
      <id>pia-repository</id>
      <url>http://www.pojosinaction.com/repository</url>;
    </repository>
  </repositories>

  <pluginRepositories>
    <pluginRepository>
      <id>pia-repository</id>
      <url>http://www.pojosinaction.com/repository</url>;
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </pluginRepository>
  </pluginRepositories>

  <properties>
    <aws.properties>ここにaws.propertiesのパスを入れる</aws.properties>
    <s3.war>s3://保存先バケット名/myapp.war</s3.war>
  </properties>

  <build>
    <plugins>
      <plugin>
        <groupId>net.chrisrichardson</groupId>
        <artifactId>cloudtools-maven-plugin</artifactId>
        <configuration>
          <awsPropertiesFile>${aws.properties}</awsPropertiesFile>
          <schemaName>myschema</schemaName>
          <schemaUsers>
            <param>user1:user1</param>
          </schemaUsers>
          <warDirectory>${s3.war}</warDirectory>
          <!-- warの名前 -->
          <warName>myapp</warName>
          <numberOfMySqlSlaves>0</numberOfMySqlSlaves>
          <numberOfTomcats>1</numberOfTomcats>
          <topology>SingleInstanceTopology</topology>
          <catalinaOptsBuilder>
            <![CDATA[
              {builder, databasePrivateDnsName, slaves ->
                  builder.arg("-server")
                  builder.arg("-Xmx1000m")
                  builder.arg("-Xms1000m")
                  builder.prop("jdbc.db.server", databasePrivateDnsName)
              }
            ]]>
          </catalinaOptsBuilder>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

ここまで設定がおわったら後は、コマンド実行

mvn cloudtools:deploy

インスタンスが起動します。もちろん時間かかります。そして課金が始まります。

起動が終了したら。ブラウザで動作確認。サーバアドレスはcloudtools:describeで情報をみるかAWSの管理コンソールで確認しましょう!

mvn cloudtools:describe

インスタンス停止方法

mvn cloudtools:stop

Maven Goalは、

http://code.google.com/p/cloudtools/wiki/UsingTheCloudToolsMavenPlugin

  • cloudtools:deploy - デプロイ
  • cloudtools:stop - 停止
  • cloudtools:redeploy - 再デプロイ
  • cloudtools:jmeter - jmeterロードテスト
  • cloudtools:dbsave - cloudtools.s3.pathに定義したS3のパスにDBスナップショットを保存
  • cloudtools:dbrestore - cloudtools.s3.pathに定義したS3のパスからDBスナップショットをDBに例ストア
  • cloudtools:clone - cloudtools.new.cluster.nameに定義した内容でクラスタをコピー
  • cloudtools:describe - 情報を見る
  • cloudtools:list - 使用可能なクラスタリスト表示



EBS(Elastic Block Store)対応

http://code.google.com/p/cloudtools/wiki/UsingEBS

cloudtools:deployで新規デプロイの際に以下のオプション新規EBSも一緒に作成。

以下の例では、デバイス(cloudtools.ebs.device)が/dev/sdj で、サイズ(cloudtools.ebs.volume.size)10GB。

-Dcloudtools.ebs.device=/dev/sdj -Dcloudtools.ebs.volume.size=10

起動中EC2インスタンスのMySQLデータを新規のEBSを作成して移動する事もできます。

以下の例だと2GBのEBSを新規に作成。

mvn cloudtools:enableebs -Dcloudtools.ebs.device=/dev/sdh -Dcloudtools.ebs.volume.size=2

トポロジー

pom.xmlの途中に設定できます。現在は2個だけっぽい。

<topology>SingleInstanceTopology</topology>

SingleInstanceTopology

シングルインスタンス上に、Apache,Tomcat,MySQLマスターを起動。0個以上のMySQLスレーブも同じインスタンスに起動可能。シングルTomcatインスタンス限定の一番安価な方法。

MultipleInstancesTopology

Apache,Tomcat,MySQLマスターMySQLスレーブをそれぞれのEC2インスタンスで起動。複数のEC2インスタンスを起動するので柔軟だがそれなりにコストがかかる。





簡単にサーバ構築とデプロイができ、そして課金されてしまう!おそろしい世の中です。