メインコンテンツまでスキップ

Stash プラグインの開発環境を構築するには

Sato Taichi

以下の手順は、2015/05 現在の手順です。以下の環境を前提に記述しています。

  • java 1.8.0_45
  • windows7
  • Atlassian Plugin SDK 5.0.13
  • Stash 3.8.0

標準的なインストール手順#

eclipse 以外の部分に関してはとりあえず公式の手順通りにインストールする。

マニュアルに無い落とし穴#

settings.xml に関するアレコレ#

%HOME_PATH%というかユーザのホームディレクトリに settings.xml を置いてるなら、Atlassian Plugin SDK に付属してきたものに置き換える事。

maven 標準のものとは随分内容が違うので、これを自分が普段使ってるままにやると大体ハマる。

Atlassian Plugin は、何か色んなタイミングで Google Analytics に利用統計的なものを投げようとするんだけど、エラーになって死ぬ。

ガンガンスタックトレースが出て、ただでさえ意味不明なことが多い maven の謎が更に深まるので、この機能が動作しないようにフラグを false にする。

大体こういう感じの記述になる。エラーメッセージとして何か出てるんだけどどう設定すればいいか分かりづらいので書いておく。

<settings>  ~ 途中省略 ~  <profiles>    <profile>  ~ 途中省略 ~      <properties>        <allow.google.tracking>false</allow.google.tracking>      </properties>    </profile>  </profiles></settings>

Oracle の JDBC ドライバを maven リポジトリに入れる#

Oracle 使うかどうかは関係なく入れないとエラーになる。既に報告はしてあって将来的にはオプショナルな依存性になるので、いつかはこの手順がいらなくなるはずだ。

まずは、Oracle Database 11g Release 2 JDBC Drivers から、ojdbc6.jar をダウンロードしてくる。OTN にログインしろとか色々面倒なことがあるけども、そこは頑張って頂きたい。

インストールするコマンドは以下の通り

> atlas-mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.2.0 -Dpackaging=jar -Dfile=ojdbc6.jar

同じように、Java Transaction API (JTA) から、jta-1_0_1B-classes.zipをダウンロードしてきて、拡張子を.jarに変えた上で以下のコマンドを実行する。

> atlas-mvn install:install-file -DgroupId=jta -DartifactId=jta -Dversion=1.0.1 -Dpackaging=jar -Dfile=jta-1_0_1B-classes.jar

ぶっちゃけて言えば、これらの jar ファイルは使わないので、中身が全く違うものをローカルの Maven リポジトリにインストールしておいてもいいんだが、それをやってしまうと後で酷いので正しい手順でやっておく。

Stash のコードをローカルリポジトリにインストールする#

Stash のライセンス買ってるなら、ソースコードをダウンロードできる。再配布は出来ないので、自分でダウンロードするしかない。

これを展開するとstash-parentってディレクトリがあるので、そこで

> atlas-mvn source:jar install -Dmaven.test.skip=true -DskipTests=true

を実行するとローカルにソースコードがデプロイされるので、IDE なんかで Maven プロジェクトをインポートした時にだいたいコードが見られるようになる。

Stash プラグインをテンプレから作った後の話#

まずは、

> atlas-create-stash-plugin

でウィザードにに従ってプロジェクトのひな形を作る。pom.xml の一番下の辺りがこういう風になっている。

<project>  ~ 途中省略 ~    <properties>        <stash.version>3.8.0</stash.version>        <stash.data.version>3.8.0</stash.data.version>        <amps.version>5.0.13</amps.version>        <plugin.testrunner.version>1.2.3</plugin.testrunner.version>    </properties></project>

こいつにファイルをコピーする時のエンコーディングの設定とコンパイラのバージョンを指定する設定を追加するとこうなる。

<project>  ~ 途中省略 ~    <properties>        <stash.version>3.8.0</stash.version>        <stash.data.version>3.8.0</stash.data.version>        <amps.version>5.0.13</amps.version>        <plugin.testrunner.version>1.2.3</plugin.testrunner.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>        <maven.compiler.source>1.8</maven.compiler.source>        <maven.compiler.target>1.8</maven.compiler.target>    </properties></project>

コンパイラのバージョンは以下の Issue が解決するまでは 1.8 にしてはいけない。

この時、ついでに maven-compiler-plugin の設定を消す。最初は以下のようになっている筈。

<project>  ~ 途中省略 ~    <build>        <plugins>            <plugin>                <artifactId>maven-compiler-plugin</artifactId>                <configuration>                    <source>1.6</source>                    <target>1.6</target>                </configuration>            </plugin>        </plugins>    </build>  ~ 途中省略 ~</project>

configuration タグだけを消してしまおう。以下のようになる。

<project>  ~ 途中省略 ~    <build>        <plugins>            <plugin>                <artifactId>maven-compiler-plugin</artifactId>            </plugin>        </plugins>    </build>  ~ 途中省略 ~</project>

Fastdev を動かす#

Stash のプラグインを開発するには、Atlassian Plugin の API を正しく理解しなければならないが、拡張ポイントに関するドキュメントがほとんどない。

ついでに、Stash にデフォルトで入ってるプラグインのソースコードは何故かアトラシアンの Maven リポジトリにデプロイされていないことがある。

という訳で、手探りでコードを書くしかないのだけども、Tomcat だの Spring だの Hazelcast だの起動時間に対する貢献が素晴らしいライブラリに依存しているので起動にやたら時間がかかる。酷いと数分かかったりする。

これでは、手探りで動かしながらコードを書くなんて不可能である。そこで、fastdev というスーパー便利ツールというかライブラリが提供されている。

こいつを動かすための設定を追加していく。どうやら Fastdev の Stash 対応は 2015/05 現在あまり上手く動かないようだが、気合いで動くところは動かす感じでやっていく。

AMPS を最新にする#

まず、AMPS のバージョンをアトラシアンの Maven リポジトリにある最新版っぽいものにする。以下の場所にデプロイされているので適宜確認されたし。

現時点では、5.1.2だ。

結果こうなる。

<project>  ~ 途中省略 ~    <properties>        <stash.version>3.8.0</stash.version>        <stash.data.version>3.8.0</stash.data.version>        <amps.version>5.1.2</amps.version>  ~ 途中省略 ~    </properties></project>

未解決のバグに対するワークアラウンド#

次に未解決のバグに対するワークアラウンドを設定していく。具体的には以下の二つだ。

ついでに、Fastdev のバージョンを最新にしておく。現時点では2.5だ。以下の場所にデプロイされているので適宜確認されたし。

<project>  ~ 途中省略 ~    <build>        <plugins>            <plugin>                <groupId>com.atlassian.maven.plugins</groupId>                <artifactId>maven-stash-plugin</artifactId>                <version>${amps.version}</version>                <extensions>true</extensions>                <configuration>  ~ 途中省略 ~                    <systemPropertyVariables>                    <!-- https://ecosystem.atlassian.net/browse/AMPS-1228 -->                        <johnson.spring.lifecycle.synchronousStartup>true</johnson.spring.lifecycle.synchronousStartup>                    </systemPropertyVariables>                    <!-- https://ecosystem.atlassian.net/browse/AMPS-1151 -->                    <useFastdevCli>false</useFastdevCli>                    <fastdevVersion>2.5</fastdevVersion>                </configuration>            </plugin>        </plugins>    </build>  ~ 途中省略 ~</project>

これでリロードできるようになるんだが、コツがいる。 ファイルを変更してすぐのリロードでは

org.apache.maven.plugins:maven-compiler-plugin:jar:5.0.13 is missing

とかエラーメッセージがでる。maven-compiler-plugin の正しいバージョンは 3.3 だし、5.0.13 は Atlassian Plugin SDK のバージョンである以下のコードが悪いと思われる。

しかし、ローカル環境で上手くテストができていないが一応 PR はしてみた。

ここで諦めずにファイルをちょっと変更した上で、右上にあるScan and Reloadボタンを押すとめでたくリビルドが走ってプラグインがリロードされる。一体どういうことなのか…。