パンデミックなのでnginx+WebDAVでグループ用Mavenリポジトリを作ってみた

## パンデミックなのでnginx+WebDAVでグループ用Mavenリポジトリを作ってみた

なかなか先が見えないコロナ禍の中、いかがお過ごしでしょうか？
チームで開発するにもリモートワークが主体となった昨今ですが、Mavenのリポジトリをnginx+WebDAVで作ってみました。

#### nginxでWebDAVが使用可能かの確認
すでにインストールしているnginxにWebDAVを設定する作業からはじめましたので、WebDAVが使用可能かの確認コマンドを打ちました。

```terminal
$ nginx -V
nginx version: nginx/1.14.2
built with OpenSSL 1.1.1d  10 Sep 2019
TLS SNI support enabled
configure arguments:
...(中略)
-with-http_dav_module
dav-ext
...(中略)
```
--with-http_dav_module がはいっていればOKです。
WindowsのExplorerからのアクセスの場合、WebDAV拡張機能が必要となりますが、今回は範囲外です。

#### nginxにWebDAVの設定
ではnginxでWebDAVへのアクセスを可能にしていきます。
グループでのアクセスが目的ですので、基本認証でアクセス可能なメンバーを制限します。

htpasswdコマンドで.htpasswdファイルを作成します。
htpasswdコマンドをインストールします。すでにインストールされている場合は以下のコマンドは必要ありません。

```terminal
$ apt install apache2-utils
```
インストール出来たら.htpasswdファイルを作ります。

```terminal
$ htpasswd -c /etc/nginx/.htpasswd mavenユーザ名
New password: 
Re-type new password: 
Adding password for user mavenユーザ名
```
続いてnginxの設定ファイルを編集します。
以下のような設定をnginxの設定ファイルに書き込んでください。
仮想ホストを使っている場合は /etc/nginx/sites-available 内のファイルではないかと思います。

```Nginx
server {
  # httpsを使用します。
  listen 443 ssl;
  (中略)...
  server_name ホスト名;
  (中略)...

  location /maven/ {

    # WebDAVディレクトリ /var/www/maven https://ホスト名/maven/ でアクセスします。
    root /var/www;

    # デプロイ時の一時ディレクトリ
    client_body_temp_path /tmp/maven;
    # フルパスで作成
    create_full_put_path on;

    # ブラウザではファイル一覧を表示
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;

    # ここはユーザのアクセス権だけ設定します。
    dav_access user:rw;
    dav_methods PUT DELETE MKCOL COPY MOVE;

    # 先程作成した.htpasswdファイルによる基本認証でプロテクト
    auth_basic "Maven Repository";
    auth_basic_user_file "/etc/nginx/.htpasswd";
  }
}
```

続いてディレクトリを作成し、nginxのユーザ(www-data)の所有にします。

```terminal
$ mkdir /tmp/maven
$ mkdir /var/www/maven
$ chown www-data. /tmp/maven
$ chown www-data. /var/www/maven
```

nginxを再起動します。

```terminal
$ systemctl restart nginx
```

これでWebDAVがアクセスできるはずです。

```
https://ホスト名/maven
```
をWebブラウザでアクセスし、空っぽのディレクトリが表示されましたでしょうか？

#### jarファイルをアップロード
続いてjarファイルをWebDAVにアップロードします。

まずはWebDAVに設定したユーザ名とパスワードをmavenの設定ファイルに記述します。
macOSの場合は ~/.m2/settings.xml ファイル、
Windowsの場合は C:\Users\Windowsユーザ名\\.m2\settings.xml ファイルに記述します。

```xml:settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  ...(中略)
  <servers>
    <server>
      <id>リポジトリID</id>
      <username>mavenユーザ名</username>
      <password>htpasswdで入力したパスワード</password>
    </server>
  </servers>
  ...(中略)
</settings>
```

アップロードするjarファイルのpom.xmlにいくつかの設定を追加します。

```xml:pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>グループID</groupId>
  <artifactId>アーティファクトID</artifactId>
  <packaging>jar</packaging>
  <version>jarのバージョン</version>
  ...(中略)
  <repositories>
    <!-- リポジトリの定義 -->
    <repository>
      <id>リポジトリID</id>
      <name>Maven Repository</name>
      <url>https://ホスト名/maven/repo</url>
    </repository>
  </repositories>
  ...(中略)
  <build>
    ...(中略)
    <extensions>
      <!-- WebDAVをpom.xmlで使用するための定義 -->
    　　<extension>
      　　<groupId>org.apache.maven.wagon</groupId>
      　　<artifactId>wagon-webdav-jackrabbit</artifactId>
      　　<version>3.0.0</version>
    　　</extension>
    </extensions>
  </build>
</project>
```

続いて以下のコマンドを打ちます。

```terminal
$ mvn deploy:deploy-file -DgroupId=グループID \
  -DartifactId=アーティファクトID \
  -Dversion=jarのバージョン \
  -Dpackaging=jar \
  -Dfile=jarファイルへのパス \
  -DrepositoryId=リポジトリID \
  -Durl=https://ホスト名/maven/repo
```
URLは最後に/repoをつけてください。
jarファイルへのパスは実行するディレクトリからの相対パスで大丈夫です。
グループID、アーティファクトID、jarのバージョンはこのjarファイルを作成したpom.xmlの記述に従ってください。
リポジトリIDはsettings.xmlと後ほど説明しますpom.xmlで参照されるものです。

#### pom.xmlに依存関係を追加
pom.xmlに依存関係を追加します。

```xml:pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...(中略)
  <repositories>
    <!-- リポジトリの定義 -->
    <repository>
      <id>リポジトリID</id>
      <name>Maven Repository</name>
      <url>https://ホスト名/maven/repo</url>
    </repository>
  </repositories>
  ...(中略)
  <dependencies>
    <!-- 依存関係の定義 -->
    <dependency>
      <groupId>グループID</groupId>
      <artifactId>アーティファクトID</artifactId>
      <version>jarのバージョン</version>
    </dependency>
  </dependencies>
  ...(中略)
</project>
```
これでnginx+WebDAVに構築したグループ用mavenリポジトリからjarファイルをダウンロードして、ビルドができるようになります。

パンデミックで大変なご時世ではありますが、皆様ご自愛くださいませ。