Eclipse che の workspace を自作する

Cloud9 みたいなWEBブラウザだけで完結する開発環境が自宅サーバーに欲しいなと思って Eclipse Che をインストールしたお話。

WEBアプリの開発中にそのアプリにブラウザでアクセスするプレビュー機能が使いたかったのだけれども、それを設定するための Workspace 設定がわからなかったのでちょっと苦労しましたという所が中心。

#記述時の環境
* Eclipse Che - 4.4.2
* docker engine - 1.11
* host - Debian 8.5 


# Che の準備

このへんは他のインストール記事が参考になるのでさらりと流し。

1. Docker Engine が動作している Linux サーバーを一台用意
2. 以下の docker-compose.yml ファイルを用意
3. docker-compose up -d で起動
4. できあがり

```yaml:docker-compose.yml
che:
   image: codenvy/che:4.4.2
   command: --remote:192.168.0.* --skip:client run
   net: "host"
   ports:
     - "8080:8080"
   environment:
     CHE_LOCAL_CONF_DIR: /container
     DOCKER_MACHINE_HOST: 127.0.0.1
   volumes:
     - /var/run/docker.sock:/var/run/docker.sock
     - /home/user/che/lib:/home/user/che/lib-copy
     - /home/user/che/workspaces:/home/user/che/workspaces
     - /home/user/che/storage:/home/user/che/storage
     - /home/user/che:/container
   container_name: che
```

コンテナに Docker API の socket を預けちゃったり、認証機構がなかったり色々問題はあるので、あくまでローカルネットワーク内で使う目的でね。

```--remote:``` で指定するIPアドレスは、クライアント(ブラウザ)からみた che サーバーのアドレスを入力する。例えば AWS EC2 などの様に VM が持っている内部IPアドレスとグローバルIPアドレスが違う場合はグローバルIPアドレスの方を指定すること。


# Workspace とは

Eclipse Che における Workspace とは1つの仮想マシンで、Docker コンテナの事です。
1つの Docker コンテナを預けられて、ユーザーはその中のプロジェクトファイルを編集したり、その中でビルドを行ったりします。

Workspace の中でCLIなシェル操作ができるので、サーバー開発にはとても便利です。

通常は Workspace 作成時に stock と呼ばれるテンプレート選択があり、これが Docker のイメージとなります。予め開発環境を用意してある stock を選択することで即座に開発を始めることができます。

WEBアプリ開発中、そのアプリにアクセスするためのポートフォワーディングは Docker コンテナのポートフォワーダー機構をそのまま使っているのですが、それ故に Docker コンテナの起動時つまり Workspace の作成時にポートフォワーディングを指定しなければいけません。

どのポートをフォワーディングしているかは stock 次第ですので、Workspace 使用中にポートを増やしたいと思っても対応することができません。

そもそもで Workspace へのフォワーディングはどう指定するのか、カスタム Workspace を作って調べることにしました。


# カスタム Workspace の作成

Workspace 作成時にカスタム stack の作成を選んでもエディットボックスが現れるだけで何をしていいか全く分からないと思います。ここには何を記述すれば良いのでしょうか。

![2016-07-17_092117.png](https://qiita-image-store.s3.amazonaws.com/0/50737/30b3a0e1-cdfe-184c-4d2d-90ec6dfc44e7.png)

実はこの 'Write your own stack' 内の書式は Dockerfile のものとなっています。
これから起動する Workspace を作る Dockerfile というわけです。

最低限必要なのは Docker イメージ名と、終了しないためのコマンド指定で以下の様になります。

```
FROM イメージ名
CMD tail -f /dev/null
```

予め環境を構築しておいた Docker イメージを DockerHUB 等に登録しておいてそれを使う形になるのですが、これだけだと Workspace 構築が完了しません。幾つか必要な条件があります。

その条件が今回のキモとなります。

## Workspace として利用する Docker コンテナの条件

コンテナを Workspace として使うには以下の用件を満たす必要があります。

* Eclipse Che がコンテナを操作するのに幾つかのサーバーをコンテナ内に仕込みます
  * その埋め込むサーバーを転送して配置するために unzip が必要です
  * tomcat で動作するので、java8 の JRE が必要です
  * JRE が動作するように JAVA_HOME を設定します
  * 埋め込みサーバーとの通信用に port 22 4401 4403 を EXPOSE します
* Eclipse Che のプロジェクトで使うので git と必要なら subversion も用意します
* プロジェクトは /projects 以下に配置されるので、WORKDIR を設定します
* そして、開発中のアプリのために必要な port (80 とか 8080 とか) を EXPOSE に追加します

これらを満たす ubuntu コンテナを作るには以下の様な Dockerfile を指定することになります。

```
FROM ubuntu
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update; \
    apt-get -y upgrade; \
    apt-get -y dist-upgrade; \
    apt-get -y install unzip sudo git subversion openjdk-8-jre; \
    apt-get clean
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64
WORKDIR /projects
EXPOSE 22 4401 4403 80 8080
CMD tail -f /dev/null
```

アプリ開発の preview で使われる port フォワードはここの EXPOSE で追加しますので、好きなだけ書き込みましょう。

同じ様に Debian の開発コンテナを作ろうとした場合、openjdk-8 が main にないので backports を利用する形になります。参考までに。

```
FROM debian
RUN echo 'deb http://ftp.jp.debian.org/debian/ jessie main' > /etc/apt/sources.list
RUN echo 'deb http://ftp.jp.debian.org/debian/ jessie-backports main' >> /etc/apt/sources.list
RUN echo 'deb http://security.debian.org/ wheezy/updates main' >> /etc/apt/sources.list
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update; \
    apt-get -y upgrade; \
    apt-get -y dist-upgrade; \
    apt-get -y install unzip sudo git subversion; \
    apt-get -y install openjdk-8-jre/jessie-backports; \
    apt-get clean
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64
WORKDIR /projects
EXPOSE 22 4401 4403 80 8080
CMD tail -f /dev/null
```

# 開発中のWEBアプリを preview する

このようにして用意した Workspace で WEBアプリの開発ができるようになりました。
さっそく、preview のやり方を試してみましょう。

![2016-07-17_104338.png](https://qiita-image-store.s3.amazonaws.com/0/50737/d3b9d15c-bb6a-3bc6-f5ba-99abe7b95f14.png)

project の run コマンドを設定すると、runボタンでプロジェクトを実行することができます。
この設定を行うのがお勧めです。

![2016-07-17_104853.png](https://qiita-image-store.s3.amazonaws.com/0/50737/fa3725a0-1d56-1d74-e133-0b3141e17546.png)

run config ダイアログには実行コマンドの指定とプレビュー時のURL指定があります。
両方とも環境マクロを指定すると便利です。

${server.port.8080} は Workspace 内アプリが 8080 port を使うとすると、それがプレビューとして公開されるアドレスとポートに変換されます。

![2016-07-17_104942.png](https://qiita-image-store.s3.amazonaws.com/0/50737/7b21a940-2861-003b-350f-66d02fe7f1fd.png)

run を押して実行した時のコンソールにはこのプレビュー接続先が リンクとして表示されますので、それをクリックすることで開発中のアプリを確認することができます。

このアプリプレビュー用の port は予め Workspace に設定されている必要がありますので、Workspace 作成時に指定しておきましょうというお話でした。