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

Last updated on

以下の手順は、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ボタンを押すとめでたくリビルドが走ってプラグインがリロードされる。一体どういうことなのか…。