Jetty上にAD連携したgitbucketを構築する

Jetty上にGitbucketを構築したくなったので、CentOS上に環境構築したメモを残しておきます。

## サーバーに関して

### 対象バージョン

以下のバージョンで環境構築を行ないます。

| システム   | バージョン         |
|----------|------------------|
| CentOS    | 6.4(final)       |
| Java      | 1.7.0_25         |
| Jetty     | 9.1.3.v20140225  |
| Gitbucket | 2.1              |

### サーバーのディレクトリ構造

それぞれアプリケーションを以下に配備します。

| パス | 概要 |
|-----|-------|
| /opt/gitbucket/current | 現在のバージョンのgitbucketを参照するためのシンボリックリンクです。 このディレクトリ上に旧バージョンのgitbucketも配備します。   |
| /opt/jetty/current     | 現在のバージョンのjettyを参照するためのシンボリックリンクです。このディレクトリ上に旧バージョンのjettyも配備します。 |
| /var/gitbucket/data    | GITBUCKET_HOMEをここに指定します。 |
| /etc/default/jetty     | jettyの初期設定ファイルを配備します。  |
| /etc/init.d/jetty      | jettyの起動スクリプトを配備します。    |

### ユーザー

構築はrootで行ないますが、起動はjettyユーザーで行ないます。

| ユーザー名 | 概要 |
|----------|--------|
| jetty      | jettyの起動ユーザーです |


## 構築手順



手順は以下の通りです。

1. Gitbucketのインストール
2. Jettyのインストール
3. Jetty上にgitbucketを配備する
4. 起動ユーザーをjettyで行なう
5. ActiveDirectory連携

### 前提条件
* Jettyユーザーが既に作成されている事
* Javaの最新バージョンが既にインストールされている事

### 1. Gitbucketのインストール
1. 配備用に`/opt/gitbucket`を作成します。
1. [公式サイト](https://github.com/takezoe/gitbucket)から`gitbucket`の[ver2.1](https://github.com/takezoe/gitbucket/releases/download/2.1/gitbucket.war)をダウンロードします。
1. 利用するバージョン向けにシンボリックリンクを張ります。

```bash
mkdir /opt/gitbucket
cd /opt/gitbucket
wget https://github.com/takezoe/gitbucket/releases/download/2.1/gitbucket.war
ln -s gitbucket-2.1.war current.war
```

### 2. Jettyのインストール

1. 配備用に`/opt/jetty`を作成します。.
2. [公式サイト]()から任意のバージョンをダウンロードして、展開します。
   今回は[バージョン9.1.3.v20140225](http://eclipse.org/downloads/download.php?file=/jetty/9.1.3.v20140225/dist/jetty-distribution-9.1.3.v20140225.tar.gz&r=1)をダウンロードします。
3. 現在のバージョン用にシンボリックリンクをはります。  

```bash
mkdir /opt/jetty
cd /opt/jetty
wget http://eclipse.org/downloads/download.php?file=/jetty/9.1.3.v20140225/dist/jetty-distribution-9.1.3.v20140225.tar.gz&r=1
tar zxf jetty-distribution-9.1.3.v20140225.tar.gz
rm jetty-distribution-9.1.3.v20140225.tar.gz
ln -s jetty-distribution-9.1.3.v20140225.tar.gz current
```
4. `/etc/default/jetty`を作成し、起動時に読み込む`JETTY_HOME`の設定を行ないます。
```bash
# vim /etc/default/jetty
JETTY_HOME=/opt/jetty/current
```
5. 起動設定ファイルを`/etc/init.d/jetty`にコピーします。
```
cp /opt/jett/current/bin/jetty /etc/init.d/jetty
```

### 3. Jetty上にgitbucketを配備する
Jetty上にgitbucketの配備を行ないます。
当初は`JETTY_HOME/webapps/`配下に`/opt/gitbucket/current.war`のシンボリックリンクを設定しようとしたのですが、
これを行なうとアプリケーション名が`http://localhost:8080/gitbucket-2.1`になってしまいました。

そこで、`JETTY_HOME/webapps/jetty.xml`を設定することで起動を行ないます。

```xml
<!-- vim /opt/jetty/current/webapps/gitbucket.xml -->
<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
  <Set name="contextPath">/gitbucket</Set>
  <Set name="war">/opt/gitbucket/current</Set>
</Configure>
```

この設定を行なう事で、`http://localhost:8080/gitbucket`のURLで起動が可能になります。

また、このままだと起動ユーザーのHOMEディレクトリ直下に`.gitbucket`というフォルダが設定されるため、`/etc/default/jetty`で`GITBUCKET_HOME`の設定を行ないます。

```shell
# vim /etc/default/jetty
export GITBUCKET_HOME=/var/gitbucket/data
```

#### オマケ: `http://localhost:8080/`で起動する

`http://localhost:8080/gitbucket`ではなく、`http://localhost:8080/`で起動したい場合、
`contextPath`の設定を弄ります。

```xml
<!-- vim /opt/jetty/current/webapps/gitbucket.xml -->
<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
  <!-- Set name="contextPath">/gitbucket</Set -->
  <Set name="contextPath">/</Set>
  <Set name="war">/opt/gitbucket/current</Set>
</Configure>
```

### 4. 起動ユーザーを`jetty`で行なう

1. `/etc/default/jetty`に`JETTY_USER`を追加する

    ```bash
    # vim /etc/default/jetty
    JETTY_USER=jetty
    ```

2. jettyユーザーで参照する領域の所有者をjettyにする。

    ```bash
    chown jetty:jetty -R /opt/jetty/
    chown jetty:jetty -R /opt/gitbucket/
    chown jetty:jetty -R /var/gitbucket/jetty
    ```

### 5. ActiveDirectoryに連携する
基本的には『[GitBucketのユーザ認証をActiveDirectoryと連携する](http://cs.hatenablog.jp/entry/2014/01/15/005950)』に記載されている通りです。

`root`でログイン後、`System Settings`へ遷移します。
`Authentication`セクションの`LDAP`を有効にし、以下のように設定します。
BindDNだけ上記サイトと異なります。

| フィールド               | 設定値             | 備考                    |
|------------------------|-------------------|--------------------------|
| LDAP Host              | hoge-piyo    | `SET LOGONSERVER`で確認 |
| LDAP Port              | 389                |                         |
| Bind DN                | xxxx@hoge.local    | xxxxは任意のユーザー名。末尾を`local`にすること  |
| Bind Password          | *******            | 任意のユーザーのパスワード | 
| Base DN                | dc=hoge,dc=local   |     |
| User name attribute    | sAMAccountName     |     |
| Full name attribute    | displayName        |     |
| Mail address attribute | mail               |     |

この後、ログアウトしてADのアカウントでログイン出来ればOKです。
なお、初めてログインしたユーザーアカウントはAdministrator権限を持っていないので、必要に応じてrootで再ログインを付与してください。

# おまけ:Dockerfile

~Dockerfile作る!~

=> という訳で作りました。

```docker
FROM centos:centos6

# 依存ライブラリインストール
RUN yum install -y which
RUN yum install -y java7
RUN yum install -y wget
RUN yum install -y tar

# jettyの起動用ユーザーを作成
RUN useradd -s /sbin/nologin jetty

# 配備ディレクトリ構築
RUN mkdir -p /opt/jetty /opt/gitbucket /var/gitbucket/data

# Jettyのインストール
ENV JETTY_VERSION 9.2.1.v20140609
WORKDIR /opt/jetty/
RUN wget http://download.eclipse.org/jetty/$JETTY_VERSION/dist/jetty-distribution-$JETTY_VERSION.tar.gz
RUN tar xfz jetty-distribution-$JETTY_VERSION.tar.gz
RUN ln -s jetty-distribution-$JETTY_VERSION current

# Gitbucketのダウンロード
WORKDIR /opt/gitbucket
RUN wget https://github.com/takezoe/gitbucket/releases/download/2.1/gitbucket.war
RUN ln -s gitbucket.war current

# Jettyの初期設定
WORKDIR /opt/jetty/current
RUN cp bin/jetty.sh /etc/init.d/jetty
RUN echo JETTY_HOME=/opt/jetty/current > /etc/default/jetty
RUN echo "export GITBUCKET_HOME=/var/gitbucket/data" >> /etc/default/jetty
RUN echo JETTY_USER=jetty >> /etc/default/jetty
RUN echo JETTY_SHELL=/bin/bash >> /etc/default/jetty

# Jetty上で動かすためのgitbucketの設定
RUN cp demo-base/webapps/test.xml webapps/gitbucket.xml
RUN sed -i -e "s|<Set name=\"contextPath\">/test</Set>|<Set name=\"contextPath\">/</Set>|g" webapps/gitbucket.xml
RUN sed -i -e "s|<Property name=\"jetty.webapps\" default=\".\"/>/test.war|/opt/gitbucket/current|g" webapps/gitbucket.xml
RUN sed -i -e "23,110d" webapps/gitbucket.xml

RUN chown jetty:jetty -R /opt/jetty/ /opt/gitbucket/ /var/gitbucket/data/

# Port Exporse
EXPOSE 8080

# Startup Jetty
CMD ["/etc/init.d/jetty", "start"]
# ENTRYPOINT /etc/init.d/jetty start && tail -f /opt/jetty/current/logs/*.stderrout.log

```

# 参考サイト

* [Jettyのインストール（EC2 ver9.1）](http://qiita.com/supertaihei02/items/a53ce41d82c4b5ab0efa)
* [GitBucketのユーザ認証をActiveDirectoryと連携する](http://cs.hatenablog.jp/entry/2014/01/15/005950)
* [SCM-Managerの認証をActiveDirectoryで行う](http://symfoware.blog68.fc2.com/blog-entry-987.html)
* [Configuring a Specific Web Application Deployment](http://www.eclipse.org/jetty/documentation/current/configuring-specific-webapp-deployment.html)

以上です。