TL;DR
- 開発をコンテナ 1 個で軽量に行いたいなら GitPod
- バックエンド DB など複数コンテナが要るなら Eclipse/Che。1
両者の違い
以下、結論だけ書かれても納得行かない方々のために。
違わないところ
両方とも、Eclipse/Theia を IDE というかエディタ UI として持ち、ワークスペースがコンテナ仮想化された環境で動きます。GitHub との親和性は GitPod のほうが上ですが、Che も VSCode 用のプラグインを流用することで、プルリクなどを IDE 内で管理できます。
ながらく「GitPod は OSS じゃないから」っていうネガティブポイントがあったのですが、既に OSS 化されたので、その点でも差がなくなってしまいました。
どちらでもいいよね、という感じがしなくもないかもしれませんが。思想的な違いはあります。それが大きく反映されているのは、コンテナの数です。
起動設定ファイルで見る違い
GitPod の起動設定ファイルを見てみましょう。通常 .gitpod.yml で定義されます。
# 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
公式ページ にあるサンプルを引っ張ってきました。
ここから読み取れることは、ワークスペース用のイメージは 1 個で、タスクの設定と開放するポートを指定できる、です。シンプル。
さて、Eclipse/Che の起動設定ファイルを見てみましょう。通常 devfile.yaml で定義されます。
GitHub で公開されているものを引っ張ってきました。GitPod と同じく Node で yarn を使用する想定の内容です。長いので、ざっと眺める程度で次の文章まで飛ばしてください。
---
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 イメージをサポートできそうと読めます2。
優劣はない。使い分けが必要。
単一の Git リポジトリで済み、外部のデータベース等を使わないケースでは、GitPod が向きます。
しかし、上記のような、イミュータブルな外部データベース(上記の例では MongoDB)を絡めた開発を行いたい場合には、 Eclipse/Che が向きます。
複数人開発などで、プラグインも含めた開発環境の完全統一が求められる場合には、Eclipse/Che が向きます。
反対に個人開発で、開発環境の再現性はさほど興味がない場合には GitPod が向きます。
これは、Docker における、docker コマンドのみの身軽さを採るか、docker-compose を使った環境再現性を採るかに、似ている選択かもしれません。
まとめ
両者とも、GitHub Coespaces への強力な OSS オルタナティブです。(GitHub Codespaces もまた便利ですが
)
うまく使い分けて、開発環境構築の手間を低減して行きましょう。