GitPod と Eclipse/Che の使い分けポイント

# TL;DR

* 開発をコンテナ 1 個で軽量に行いたいなら GitPod
* バックエンド DB など複数コンテナが要るなら Eclipse/Che。[^1]

[^1]: 実は Eclipse/Che は「Theia 以外もエディタにできる」という超ヤンチャな技があるのですが。本稿では、Che でも大人しく標準エディタである Theia を使う、という前提を置いてます。


# 両者の違い

以下、結論だけ書かれても納得行かない方々のために。

## 違わないところ

両方とも、Eclipse/Theia を IDE というかエディタ UI として持ち、ワークスペースがコンテナ仮想化された環境で動きます。GitHub との親和性は GitPod のほうが上ですが、Che も VSCode 用のプラグインを流用することで、プルリクなどを IDE 内で管理できます。

ながらく「GitPod は OSS じゃないから」っていうネガティブポイントがあったのですが、[既に OSS 化された](https://www.gitpod.io/blog/opensource/)ので、その点でも差がなくなってしまいました。

どちらでもいいよね、という感じがしなくもないかもしれませんが。思想的な違いはあります。それが大きく反映されているのは、コンテナの数です。


## 起動設定ファイルで見る違い

GitPod の起動設定ファイルを見てみましょう。通常 `.gitpod.yml` で定義されます。


```yaml
# The Docker image to run your workspace in. Defaults to gitpod/workspace-full
image: <your-workspace-image>
# Command to start on workspace startup (optional)
tasks:
  - init: yarn install
    command: yarn build
# Ports to expose on workspace startup (optional)
ports:
  - port: 8000
    onOpen: open-preview
```

[公式ページ](https://www.gitpod.io/docs/config-gitpod-file/) にあるサンプルを引っ張ってきました。

ここから読み取れることは、ワークスペース用のイメージは 1 個で、タスクの設定と開放するポートを指定できる、です。シンプル。

さて、Eclipse/Che の起動設定ファイルを見てみましょう。通常 `devfile.yaml` で定義されます。

[GitHub で公開されているもの](https://github.com/eclipse/che-devfile-registry/blob/e0447ee65ecd04884093fb62661436132662e078/devfiles/nodejs-mongo/devfile.yaml)を引っ張ってきました。GitPod と同じく Node で `yarn` を使用する想定の内容です。長いので、ざっと眺める程度で次の文章まで飛ばしてください。

```yaml
---
apiVersion: 1.0.0
metadata:
  generateName: nodejs-mongo-
projects:
  -
    name: nodejs-mongodb-sample
    source:
      type: git
      location: "https://github.com/che-samples/nodejs-mongodb-sample"
components:
  -
    type: chePlugin
    id: che-incubator/typescript/latest
    memoryLimit: 512Mi
  - 
    type: chePlugin
    id: ms-vscode/node-debug2/latest
  -
    type: dockerimage
    alias: nodejs
    image: quay.io/eclipse/che-nodejs10-ubi:nightly
    env:
      # The values below are used to set up the environment for running the application
      - name: SECRET
        value: 220fd770-c028-480d-8f95-f84353c7d55a 
      - name: NODE_ENV
        value: production
    memoryLimit: 512Mi
    endpoints:
      - name: 'nodejs'
        port: 8080
    mountSources: true
  -
    type: dockerimage
    alias: mongo
    image: docker.io/centos/mongodb-36-centos7
    memoryLimit: 512Mi
    env:
      - name: MONGODB_USER
        value: user
      - name: MONGODB_PASSWORD
        value: password
      - name: MONGODB_DATABASE
        value: guestbook
      - name: MONGODB_ADMIN_PASSWORD
        value: password
    volumes:
      - name: mongo-storage
        containerPath: /var/lib/mongodb/data 
    endpoints:
      - name: mongodb
        port: 27017
        attributes:
          discoverable: 'true'
          public: 'false'
commands:
  -
    name: run the application
    actions:
    - type: exec
      component: nodejs
      command: npm install && node --inspect=9229 app.js
      workdir: ${CHE_PROJECTS_ROOT}/nodejs-mongodb-sample
  -
    name: Debug remote node application
    actions:
    - type: vscode-launch
      referenceContent: |
        {
        "version": "0.2.0",
        "configurations": [
          {
            "type": "node",
            "name": "Debug (Attach) - Remote",
            "request": "attach",
            "port": 9229
          }]
        }
```


GitPod に比べて、下記の点で大きな違いがあることに気づくでしょう。

* 使うプラグインが指定されています。(上記では  `che-incubator/typescript/latest` と `ms-vscode/node-debug2/latest` )
* 2 つの docker イメージが (`nodejs` と `mongo`) が指定されています。
* マウントボリュームが指定されています。
* どの git リポジトリからソースコードを引っ張ってくるのかが明示されています。

多くの要素は配列なので、もっと多くのプラグインや docker イメージをサポートできそうと読めます[^yes]。

[^yes]: 実際できます。

## 優劣はない。使い分けが必要。

単一の Git リポジトリで済み、外部のデータベース等を使わないケースでは、GitPod が向きます。
しかし、上記のような、イミュータブルな外部データベース(上記の例では MongoDB)を絡めた開発を行いたい場合には、 Eclipse/Che が向きます。

複数人開発などで、プラグインも含めた開発環境の完全統一が求められる場合には、Eclipse/Che が向きます。
反対に個人開発で、開発環境の再現性はさほど興味がない場合には GitPod が向きます。

これは、Docker における、docker コマンドのみの身軽さを採るか、docker-compose を使った環境再現性を採るかに、似ている選択かもしれません。

# まとめ

両者とも、GitHub Coespaces への強力な OSS オルタナティブです。(GitHub Codespaces もまた便利ですが :sunglasses:)

うまく使い分けて、開発環境構築の手間を低減して行きましょう。