そごうソフトウェア研究所

SOA、開発プロセス、ITアーキテクチャなどについて書いています。Twitterやってます@rsogo

JenkinsからWildFlyへのリモートデプロイ(pom.xmlの更新)

前回は、Jenkinsサーバーが乗っているDockerコンテナから、WildFlyが動作しているアプリケーションサーバー用Dockerコンテナへのコンテナ間接続をやりました。 begirama.hatenablog.com

JenkinsからWildFlyへのリモートデプロイはWildFly Maven Pluginというのがあって、MavenからWildFlyへのデプロイ、アンデプロイ、インスタンスの起動停止が行えるようです。

WildFly Maven Plugin - Plugin Documentation

deployに関する詳細なリファレンスは下記。 WildFly Maven Plugin - wildfly:deploy

公式サイトではないですが、リモートサーバーへデプロイする際のpom.xmlの例はこちら。 Configuring Maven WildFly plugin

実際のpom.xmlのデプロイ部分はこんな感じ。

<plugin>
  <groupId>org.wildfly.plugins</groupId>
  <artifactId>wildfly-maven-plugin</artifactId>
  <version>1.1.0.Alpha1</version>
  <executions>
    <execution>
        <id>deploy</id>
        <phase>install</phase>
        <goals>
            <goal>deploy</goal>
        </goals>
        <configuration>
            <hostname>apppot_runtime1.7</hostname>
            <port>9990</port>
            <name>apppot-1.7-ci-jenkins.war</name>
            <username>{username}</username>
            <password>{password}</password>
            <filename>apppot-1.7-ci-jenkins.war</filename>
        </configuration>
    </execution>
  </executions>
</plugin>

deployタスクのconfigurationとして、次を指定しています。

  • hostname: Docker Linkした結果、hostsに定義されたホスト名を指定します。apppot_runtime1.7
  • port: WildFlyの管理ポートを指定。アプリケーションサーバーコンテナで、管理ポートをexposeしています
  • name: デプロイする名前。warの拡張子を付けてないとだめ。付けてない場合、デプロイタスク自体は成功するけど、WildFly側でいろいろ認識されていなくて動かなかった。特にエラーもでないから調査に時間かかった。
  • username: WildFlyにログインするためのアカウント
  • password: WildFlyにログインするためのパスワード
  • filename: デプロイするwarファイルを指定しています

すごくはまったのは、[ERROR] JBREM000200: Remote connection failed: javax.security.sasl.SaslException: Authentication failed: the server presented no authentication mechanismsのエラー。 いろなサイトを参考にして、nameだけ指定して、usernameは使っていませんでした。この時に、上のエラーが発生していました。逆にusernameのみを指定しても同じエラーが発生しました。結局、usernameとnameの両方を指定することで、解消しました。参考にしたサイトの人たちはなんで成功していたんだろう・・・。 認証で、こけると何でもこのエラーになるみたいです。

2015/08/21追記

WildFlyの古いバージョンだと、ネイティブ用のポートを使ってデプロイしていて、それだとusernameが不要のようです。 最新のWildFlyだと管理ポートのプロトコルはHTTPで、その場合、usernameが必要なようです。 それで古い記事を参考にしていると駄目だったんだな。