WildFlyにアプリケーションをデプロイする

#はじめに

[前の記事](https://qiita.com/tama1/items/829be5aacd81637ae73a)で、WildFly に Webアプリケーションをデプロイする方法は以下の3つあると書きました。

**1. deploymentsフォルダ（ディレクトリ）に置いてデプロイする**
**2. 管理画面からデプロイする**
**3. 管理CLIでデプロイする**

今回は、この辺りをもう少し詳しく書こうかと思います。

#deploymentsディレクトリに置いてデプロイする

アプリケーション（warファイル）を`deployments`ディレクトリに置くと、一定間隔で `deployments` ディレクトリをスキャンする**デプロイメントスキャナ**がアプリケーションをデプロイします。スキャン対象のアプリケーションは**アーカイブ形式**と**展開形式**の2種類があります。

**1.アーカイブ形式**
 zipで固められたWEBアプリケーションです。いわゆるwarやearファイルです。
**2.展開形式**
 zipを展開したWEBアプリケーションです。展開したディレクトリを「xxx.war」のような名前にしたものです。

デプロイメントスキャナの設定は`standalone.xml`の下記にあります。

```xml
<subsystem xmlns="urn:jboss:domain:deployment-scanner:2.0">
    <deployment-scanner path="deployments" relative-to="jboss.server.base.dir" scan-interval="5000" runtime-failure-causes-rollback="${jboss.deployment.scanner.rollback.on.failure:false}"/>
</subsystem>
```

管理画面から設定できるデプロイメントスキャナの設定項目は以下です。

|項目名         |説明                         | デフォルト値          |
|:-------------|-----------------------------|:---------------------|
|Auto Deploy Exploded|展開形式のWEBアプリケーションに更新があった場合に再デプロイするかどうか|false|
|Auto Deploy Xml|XMLファイルに更新があった場合に再デプロイするかどうか|true|
|Auto Deploy Zipped|アーカイブ形式のWEBアプリケーションに更新があった場合に再デプロイするかどうか|true|
|Deployment Timeout|デプロイのタイムアウト、デプロイに600秒以上かかった場合はエラーになります。|600|
|Path|deploymentsディレクトリ名|deployments|
|Relative To|システムプロパティ{jboss.server.base.dir}のパス、デフォルトで「wildfly-15.0.0.Final/standalone」なので「Path」の設定と合わせて「wildfly-15.0.0.Final/standalone/deployments」になります。|jboss.server.base.dir|
|Runtime Failure Causes Rollback|ランタイムエラー発生時に全てのデプロメントをロールバックするかどうか、特定のアプリで必要？|${jboss.deployment.scanner.rollback.on.failure:false}|
|Scan Enabled|スキャンを有効にするかどうか|true|
|Scan Interval|スキャンの間隔|5000|

つまりデフォルトの状態では、以下のような状態になっています。
1. アーカイブ形式のWEBアプリケーションは更新されればデプロイされる。
2. 展開形式のWEBアプリケーションを更新する場合はマーカーファイル `xxx.war.dodeploy`を置く必要がある。

## マーカーファイル

マーカーファイルは、ユーザーが作成してデプロイメントスキャナに指示を与えるものと、デプロイメントスキャナが現在の状況を示すために作成するものがあります。アプリケーション(warファイル)と同じディレクトリ `wildfly-15.0.0.Final/standalone/deployments` に置きます。ユーザーが作成する場合、ファイルの中身は空でいいです。

**ユーザーが作成するマーカーファイル**

|名前|意味|
|-------------|-----------------------------|
|xxx.war.dodeploy|xxx.warをデプロイする|
|xxx.war.skipdeploy|xxx.warのデプロイをスキップする|
|xxx.war.undeploy|xxx.warをアンデプロイする※なぜか[マニュアル](http://docs.wildfly.org/15/Admin_Guide.html#marker-files)に書いてない|

**デプロイメントスキャナが作成するマーカーファイル**

|名前|意味|
|-------------|-----------------------------|
|xxx.war.isdeploying|xxx.warがデプロイ中である|
|xxx.war.deployed|xxx.warのデプロイが完了した|
|xxx.war.failed|xxx.warのデプロイに失敗した|
|xxx.war.isundeploying|xxx.warがアンデプロイ中である|
|xxx.war.undeployed|xxx.warのアンデプロイが完了した|

#管理画面からデプロイする

WildFlyの管理画面を使ってアプリケーションをデプロイします。管理画面は凝った作りになっており、これをメインに使うことが想定されているようです（たぶん）。管理画面からデプロイした場合はどのような動きになるでしょう

画面の指示にしたがって行えば簡単にできると思います。

1. `Deployments` メニューの左上にある`(+)`ボタンから`Upload Deployment`を選択します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/227018/23441daf-dde7-3aaa-8aed-8d2bfb295243.jpeg" width="50%"/>

2. 点線の枠内に war ファイルをドラッグ＆ドロップ、または`Choose a file or drag it here`リンクをクリックして war ファイルを選択してアップロードします。アップロード完了後`Next`で次に進みます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/227018/8aad68e0-2c9a-235f-5c7d-cfc366df08fc.jpeg" width="50%"/>

3. `Name`、`Runtime Name` を確認し、即時に有効にしたい場合は`Enabled`ボタンを`ON`にします。`Runtime Name`がコンテキストルートになります。確認したら`Finish`ボタンを押します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/227018/40662967-191f-1e34-5b9e-72595b7feb8e.jpeg" width="50%"/>
4. デプロイ完了
<img src="https://qiita-image-store.s3.amazonaws.com/0/227018/6edf1253-6d0a-a34e-75fa-abbdf061c50f.jpeg" width="50%"/>

`deployments`ディレクトリを覗いて見ましょう、あれ？何も無いです。
`standalone.xml` を開いてみると一番下に以下のようなタグが追加されています。

```xml
    <deployments>
        <deployment name="helloworld.war" runtime-name="helloworld.war">
            <content sha1="2be2e53cd283a40f626a947aa35bfbfb593893ec"/>
        </deployment>
    </deployments>
```

`wildfly-15.0.0.Final`ディレクトリ配下を探してみると、こんなファイルがみつかりました。

`wildfly-15.0.0.Final/standalone/data/content/2b/e2e53cd283a40f626a947aa35bfbfb593893ec/content`

拡張子を.zip に変更して、さっきアップロードしたwarと比較してみると、一致しました。こんなところにアップされていました。

次に進む前に管理画面からアプリケーションを削除します。

`wildfly-15.0.0.Final/standalone/data/content/2b/e2e53cd283a40f626a947aa35bfbfb593893ec/content` が無くなって`standalone.xml` に追加されたタグも消えました。

#管理CLIでデプロイする

`wildfly-15.0.0.Final/bin/`の下にある管理CLIである`jboss-cli.sh`を使用してアプリケーションをデプロイします。Windowsの場合は`jboss-cli.bat`を使います。

`jboss-cli.sh --connect`でWildFlyに接続し、`deploy [warの場所をフルパスで記述]`コマンドを実行します。

```sh
#wildfly-15.0.0.Final/bin/jboss-cli.sh --connect
[standalone@localhost:9990 /] deploy /yourpath/helloworld.war
```

これでデプロイが完了しました。

`standalone.xml`を開いてみると一番下に以下のようなタグが追加されています。

```xml
<deployments>
    <deployment name="helloworld.war" runtime-name="helloworld.war">
        <content sha1="2be2e53cd283a40f626a947aa35bfbfb593893ec"/>
    </deployment>
</deployments>
```

`content`ファイルも出来ています。

`wildfly-15.0.0.Final/standalone/data/content/2b/e2e53cd283a40f626a947aa35bfbfb593893ec/content`

管理画面からデプロイした場合と同じ動きをするようです。ですので、どちらか好きなほうを使えば良いと思います。

#結局どうやってデプロイするのがベスト？

ドキュメントには、プロダクトシステムでは、デプロイメントスキャナの替わりにマネージメントAPIを使用しましょう、と書かれています。

考え方として、開発中はデプロイメントスキャナによるデプロイを使用し、本番リリース後は管理画面または管理CLIを使用するような運用が想定されているようです。

[8.2.2. Deploying Using the Deployment Scanner](http://docs.wildfly.org/15/Admin_Guide.html#standalone-server-3)

>Users are encouraged to use the WildFly management APIs to upload and deploy deployment content instead of relying on the deployment scanner that periodically scans the directory, particularly if running production systems.