第5章 開発者環境のカスタマイズ
Red Hat CodeReady Workspaces は、拡張可能かつカスタマイズ可能な開発者のワークスペースプラットフォームです。
Red Hat CodeReady Workspaces は、以下の 3 つの方法で拡張できます。
- 代替 IDE は、Red Hat CodeReady Workspaces に特化したツールを提供します。たとえば、データ分析用の Jupyter ノートブックなどです。代替 IDE は Eclipse Theia またはその他の IDE(Web またはデスクトップベース) をベースに使用できます。Red Hat CodeReady Workspaces のデフォルト IDE は Che-Theia です。
- Che-Theia プラグインは各種機能を Che-Theia IDE に追加します。これらは、Visual Studio Code と互換性のあるプラグイン API に依存します。プラグインは IDE 自体から分離されます。それらはファイルとしてパッケージ化されるか、またはコンテナーとしてパッケージ化でき、独自の依存関係を提供できます。
- Stacks は、異なる開発者の担当者に対応する、専用のツールセットを含む事前に設定された CodeReady Workspaces ワークスペースです。たとえば、該当する目的に必要なツールのみを含むテスター用のワークベンチを事前に設定できます。
図5.1 CodeReady Workspaces の拡張性
ユーザーは、デフォルトで CodeReady Workspaces が提供する self-hosted
モードで CodeReady Workspaces を拡張できます。
5.1. Che-Theia プラグインについて リンクのコピーリンクがクリップボードにコピーされました!
Che-Theia プラグインは、IDE から分離した開発環境の拡張です。プラグインは、ファイルまたはコンテナーとしてパッケージ化され、独自の依存関係を提供できます。
プラグインを使用して Che-Theia を拡張すると、以下の機能を有効にすることができます。
- 言語サポート: Language Server Protocol に依存してサポートされる言語を拡張します。
- デバッガー: Debug Adapter Protocol を使用してデバッグ機能を拡張します。
- 開発ツール: 優先するリンターを、テストおよびパフォーマンスツールとして統合します。
- メニュー、パネルおよびコマンド: 独自のアイテムを IDEコンポーネントに追加します。
- テーマ: カスタムテーマの構築、UI の拡張、またはアイコンテーマのカスタマイズを行います。
- スニペット、コードのフォーマット、および構文のハイライト: サポートされるプログラミング言語での使いやすさを強化します。
- キーバインディング: 新規のキーボードマッピングと一般的なキーバインディングを追加して、より自然な環境にします。
5.1.1. Che-Theia プラグインの機能と利点 リンクのコピーリンクがクリップボードにコピーされました!
機能 | 説明 | 利点 |
---|---|---|
高速ロード | プラグインはランタイム時に読み込まれ、すでにコンパイルされた状態になります。IDE はプラグインコードを読み込みます。 | コンパイル時間は使用しないでください。インストール後の手順は使用しないでください。 |
セキュアなロード | プラグインは IDE とは別に読み込まれます。IDE は常に使用可能な状態のままになります。 | バグがある場合、プラグインは IDE 全体を中断しません。ネットワークの問題を処理します。 |
ツールの依存関係 | プラグインの依存関係は、独自のコンテナーのプラグインと共にパッケージ化されます。 | ツールのインストールは不要です。コンテナーで実行される依存関係。 |
コードの分離 | プラグインが、ファイルを開いたり、入力したりするなどの IDE の主な機能をブロックしないことを保証します。 | プラグインは個別のスレッドで実行されます。依存関係の不一致を回避します。 |
VS Code 拡張機能の互換性 | 既存の VS Code 拡張機能で IDE の機能を拡張します。 | 複数のプラットフォームをターゲットにします。必要なインストールでの Visual Studio Code 拡張機能を簡単に検出できます。 |
5.1.2. Che-Theia プラグインの概念の詳細 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat CodeReady Workspaces はワークスペースのデフォルト Web IDE (Che-Theia) を提供します。Eclipse Theia をベースにしています。これは、Red Hat CodeReady Workspaces ワークスペースの性質に基づいて追加された機能があるため、単純な Eclipse Theia とは若干異なります。CodeReady Workspaces のこのバージョンの Eclipse Theia は Che-Theia と呼ばれています。
Che-Theia プラグイン を構築することで、Red Hat CodeReady Workspaces で提供される IDE を拡張できます。Che-Theia プラグインは、その他の Eclipse Theia ベースの IDE と互換性があります。
5.1.2.1. クライアントサイドおよびサーバーサイドの Che-Theia プラグイン リンクのコピーリンクがクリップボードにコピーされました!
Che-Theia エディタープラグインを使用すると、開発ワークフローをサポートするために言語、デバッガー、およびツールをインストールに追加できます。エディターの読み込みが完了するとプラグインが実行されます。Che-Theia プラグインが失敗すると、メインの Che-Theia エディターは機能し続けます。
Che-Theia プラグインはクライアントサイドまたはサーバーサイドのいずれかで実行されます。これは、クライアントおよびサーバーサイドのプラグインの概念のスキームです。
図5.2 クライアントおよびサーバー側の Che-Theia プラグイン
同じ Che-Theia プラグイン API がクライアントサイド (Web ワーカー) またはサーバーサイド (Node.js) で実行されるプラグインに公開されます。
5.1.2.2. Che-Theia プラグイン API リンクのコピーリンクがクリップボードにコピーされました!
Red Hat CodeReady Workspaces でツールの分離と容易な拡張性を提供するために、Che-Theia IDE にはプラグイン API のセットがあります。API は Visual Studio Code 拡張 API と互換性があります。通常、Che-Theia は、VS Code 拡張機能を独自のプラグインとして実行することができます。
CodeReady Workspaces ワークスペースのコンポーネント (コンテナー、設定、factory) に依存するか、またはこれと対話するプラグインを開発する場合は、Che-Theia に組み込まれた CodeReady Workspaces API を使用します。
5.1.2.3. Che-Theia プラグイン機能 リンクのコピーリンクがクリップボードにコピーされました!
Che-Theia プラグインには以下の機能があります。
プラグイン | 説明 | リポジトリー |
---|---|---|
CodeReady Workspaces の拡張タスク | CodeReady Workspaces コマンドを処理し、ワークスペースの特定のコンテナーでそれらを起動する機能を提供します。 | |
CodeReady Workspaces 拡張ターミナル | ワークスペースのコンテナーのいずれかにターミナルを提供できるようにします。 | |
CodeReady Workspaces Factory | Red Hat CodeReady Workspaces Factory を処理します。 | |
CodeReady Workspaces コンテナー | ワークスペースで実行されているすべてのコンテナーを表示し、それらとの対話を可能にするコンテナービューを提供します。 | |
ダッシュボード | IDE と Dashboard を統合し、ナビゲーションを容易にします。 | |
CodeReady Workspaces API | IDE API を拡張し、CodeReady Workspaces 固有のコンポーネント (ワークスペース、設定) との対話を可能にします。 |
5.1.2.4. VS Code 拡張機能および Eclipse Theia プラグイン リンクのコピーリンクがクリップボードにコピーされました!
Che-Theia プラグインは、VS Code 拡張機能または Eclipse Theia プラグインをベースとすることができます。
- Visual Studio Code 拡張機能
- VS Code 拡張機能を独自の依存関係セットを含む Che-Theia プラグインとして再パッケージ化するには、依存関係をコンテナーにパッケージ化します。これにより、エクステンションの使用時に Red Hat CodeReady Workspaces ユーザーが拡張機能の使用時に依存関係をインストールする必要がなくなります。「VS Code 拡張機能のワークスペースへの追加」を参照してください。
- Eclipse Theia プラグイン
- Eclipse Theia プラグインを実装し、Red Hat CodeReady Workspaces にパッケージ化することで、Che-Theia プラグインを構築できます。
5.1.3. Che-Theia プラグインのメタデータ リンクのコピーリンクがクリップボードにコピーされました!
Che-Theia プラグインメタデータは、プラグインレジストリーの個々のプラグインについての情報です。
それぞれの特定のプラグインの Che-Theia プラグインメタデータは、meta.yaml
ファイルに定義されます。これらのファイルは devfile で参照し、ワークスペースに Che-Theia プラグインを含めることができます。
以下は、プラグインメタ YAML ファイルで利用可能なすべてのフィールドの概要です。本書では、プラグインのメタ YAML 構造のバージョン 3 について示します。
| バージョン 2 以降(バージョン 1 は後方互換性のためにサポートされます) |
|
利用可能: カテゴリは |
| プラグインの目的についての簡単な説明 |
| ユーザーダッシュボードに表示される名前 |
| オプション: プラグインを他を優先するために非推奨にするためのセクション * autoMigrate - ブール値
* migrateTo - 新しい |
| YAML には不要です。これが含まれない場合には、プラグインレジストリー dockerimage ビルドがこれを生成します。 |
| YAML には不要です。これが含まれない場合には、プラグインレジストリー dockerimage ビルドがこれを生成します。 |
| SVG または PNG アイコンの URL |
| 名前 (スペースは使用できません) は [-a-z0-9] と一致する必要があります。 |
| パブリッシャーの名前は [-a-z0-9] に一致する必要があります |
| プラグインリポジトリーの URL(例: GitHub) |
| プラグインのタイトル (long) |
|
|
| バージョン情報 (例: 7.5.1、[-.a-z0-9] |
| 仕様 (以下を参照) |
| オプション: プラグインエンドポイント |
| オプション: プラグインのサイドカーコンテナー。Che プラグインおよび VS Code 拡張機能は 1 つのコンテナーのみをサポートします。 |
| オプション: プラグイン用のサイドカーの init コンテナー |
| オプション: ワークスペースの環境変数 |
| オプション: .vsix や .theia ファイルなど、プラグインのアーティファクトに対して VS Code および Che-Theia プラグインで必要な属性。 |
| サイドカーコンテナー名 |
| 絶対または相対コンテナーイメージ URL |
|
OpenShift メモリー制限の文字列 (例: |
|
OpenShift メモリー要求文字列(例: |
|
OpenShift CPU 制限の文字列(例: |
|
OpenShift CPU 要求の文字列 (例: |
| サイドカーに設定される環境変数の一覧 |
| コンテナー内の root プロセスコマンドの文字列配列の定義 |
| コンテナー内の root プロセスコマンドの文字列配列の引数 |
| プラグインで必要なボリューム |
| プラグインによって公開されるポート (コンテナー上) |
| プラグインコンテナーで利用可能な開発コマンド |
|
ソースコード |
| オプション: サイドカープラグイン用の init コンテナー |
|
コンテナーライフサイクルフック。 |
| 環境変数名 |
| 環境変数の値 |
| コンテナー内のボリュームへのパス |
| ボリューム名 |
| true の場合、ボリュームは一時的になります。そうでない場合、ボリュームは永続化されます。 |
| 公開されるポート |
| コマンド名 |
| コマンドの作業ディレクトリー |
| 開発コマンドを定義する文字列配列 |
| 名前 (スペースは使用できません) は [-a-z0-9] と一致する必要があります。 |
|
|
| ターゲットポート |
| エンドポイント属性 |
|
プロトコル (例: |
|
|
|
|
|
|
|
|
|
|
|
コンテナーの起動直後に実行される
*
* |
|
コンテナーが終了する前に実行される
*
* |
Che-Theia プラグインの meta.yaml
の例: CodeReady Workspaces machine-exec サービス
VisualStudio コード拡張機能の meta.yaml
の例: AsciiDoc サポート拡張機能
5.1.4. Che-Theia プラグインのライフサイクル リンクのコピーリンクがクリップボードにコピーされました!
ユーザーが Che ワークスペースを起動するたびに、Che-Theia プラグインライフサイクルプロセスが開始します。このプロセスの手順は以下のとおりです。
- CodeReady Workspaces サーバーは、プラグインがワークスペース定義から起動するかどうかを確認します。
- CodeReady Workspaces サーバーはプラグインメタデータを取得し、各プラグインタイプを認識し、それらをメモリーに保存します。
- CodeReady Workspaces サーバーは、プラグインタイプに応じてブローカーを選択します。
- ブローカーはプラグインのインストールおよびデプロイメントを処理します。プラグインのインストールプロセスは、特定のブローカーごとに異なります。
プラグインはさまざまなタイプで使用できます。ブローカーは、すべてのインストール要件を満たすことで、プラグインのデプロイメントを正常に実行します。
図5.3 Che-Theia プラグインのライフサイクル
CodeReady Workspaces ワークスペースを起動する前に、CodeReady Workspaces サーバーがワークスペースコンテナーを起動します。
-
Che-Theia プラグインブローカーは、特定のプラグインが
.theia
ファイルから必要とするサイドカーコンテナーについての情報を抽出します。 - ブローカーは、適切なコンテナー情報を CodeReady Workspaces サーバーに送信します。
- ブローカーは Che-Theia プラグインをボリュームにコピーし、これを Che-Theia エディターコンテナーで利用できるようにします。
- 次に、CodeReady Workspaces サーバーはワークスペースのすべてのコンテナーを起動します。
- Che-Theia はそのコンテナーで起動し、プラグインをロードするための適切なフォルダーをチェックします。
Che-Theia プラグインのライフサイクルにおけるユーザーエクスペリエンス
ユーザーが Che-Theia のブラウザータブを開くと、Che-Theia は、以下で新しいプラグインセッションを開始します。
- Web Worker (フロントエンド)
- Node.js (バックエンド)
-
Che-Theia は、トリガーされたそれぞれのプラグインの
start()
関数を呼び出して、すべての Che-Theia プラグインに対して新規セッションの開始を通知します。 - Che-Theia プラグインセッションが実行され、Che-Theia バックエンドおよびフロントエンドと対話します。
-
ユーザーが Che-Theia ブラウザータブを閉じるか、またはセッションがタイムアウトの制限で終了すると、Che-Theia はすべてのプラグインに対して、トリガーされたそれぞれのプラグインの
stop()
関数で通知します。
5.1.5. 埋め込み、およびリモートの Che-Theia プラグイン リンクのコピーリンクがクリップボードにコピーされました!
Red Hat CodeReady Workspaces の開発者ワークスペースは、プロジェクトで作業するために必要なすべての依存関係を提供します。アプリケーションには、使用されるすべてのツールおよびプラグインに必要な依存関係が含まれます。
必要な依存関係に基づいて、Che-Theia プラグインは以下のように実行できます。
- 埋め込み (ローカル)
- リモート
5.1.5.1. 埋め込み (ローカル) プラグイン リンクのコピーリンクがクリップボードにコピーされました!
埋め込みプラグインは、Che-Theia IDE に挿入される特定の依存関係のないプラグインです。これらのプラグインは IDE コンテナーで実行される Node.js ランタイムを使用します。
例:
- コードリンティング
- コマンドの新規セット
- 新規 UI コンポーネント
Che-Theia プラグインまたは VS Code 拡張を含めるには、meta.yaml
ファイルでプラグインの .theia
アーカイブバイナリーへの URL を定義します。「VS Code 拡張機能のワークスペースへの追加」を参照してください。
ワークスペースを起動すると、CodeReady Workspaces はプラグインバイナリーをダウンロードして展開し、それらを Che-Theia エディターコンテナーに追加します。Che-Theia エディターは、起動時にプラグインを初期化します。
5.1.5.2. リモートプラグイン リンクのコピーリンクがクリップボードにコピーされました!
プラグインは依存関係に依存するか、またはバックエンドがあります。これは独自のサイドカーコンテナーで実行され、すべての依存関係はコンテナーにパッケージ化されます。
リモート Che-Theia プラグインは、以下の 2 つの部分で構成されます。
-
Che-Theia プラグインまたは VS Code 拡張機能バイナリー。
meta.yaml
ファイルの定義は埋め込みプラグインの場合と同じです。 -
コンテナーイメージの定義(例:
eclipse/che-theia-dev:nightly
)。このイメージから、CodeReady Workspaces はワークスペース内に別のコンテナーを作成します。
例:
- Java Language Server
- Python Language Server
ワークスペースを起動すると、CodeReady Workspaces はプラグインイメージからコンテナーを作成し、プラグインバイナリーをダウンロードして展開し、それらを作成されたコンテナーに追加します。Che-Theia エディターは起動時にリモートプラグインに接続します。
5.1.5.3. 比較マトリックス リンクのコピーリンクがクリップボードにコピーされました!
- 埋め込みプラグインは、コンテナー内で追加の依存関係を必要としない Che-Theia プラグインまたは VS Code 拡張機能です。
- リモートプラグインは、必要なすべての依存関係を持つプラグインが含まれるコンテナーです。
プラグインごとに RAM を設定 | 環境の依存関係 | 分離されたコンテナーの作成 | |
---|---|---|---|
リモート | TRUE | プラグインは、リモートコンテナーで定義された依存関係を使用します。 | TRUE |
組み込み | FALSE (ユーザーはエディターコンテナー全体に対して RAM を設定できますが、プラグインごとに設定できません) | プラグインはエディターコンテナーから依存関係を使用します。コンテナーにこれらの依存関係が含まれない場合は、プラグインは失敗するか、または予想通りに機能しません。 | FALSE |
ユースケースおよびプラグインが提供する機能に応じて、上記の実行モードのいずれかを選択します。
5.1.6. リモートプラグインエンドポイント リンクのコピーリンクがクリップボードにコピーされました!
Red Hat CodeReady Workspaces には、別のコンテナーで VS Code 拡張機能および Che-Theia プラグインを起動するためのリモートプラグインのエンドポイントサービスがあります。Red Hat CodeReady Workspaces は、リモートプラグインのエンドポイントのバイナリーを各リモートプラグインコンテナーに挿入します。このサービスは、プラグインの meta.yaml
ファイルで定義されるリモート拡張機能とプラグインを起動し、それらを Che-Theia エディターコンテナーに接続します。
リモートプラグインのエンドポイントは、リモートプラグインコンテナーと Che-Theia エディターコンテナーとの間でプラグインの API プロキシーを作成します。リモートプラグインのエンドポイントは、一部のプラグインの API の部分のインターセプターにもなります。これは、エディターコンテナーではなくリモートサイドカーコンテナー内で起動します。例: ターミナル API、デバッグ API
リモートプラグインのエンドポイントの実行可能コマンドは、リモートプラグインコンテナーの環境変数 PLUGIN_REMOTE_ENDPOINT_EXECUTABLE
に保存されます。
Red Hat CodeReady Workspaces は、サイドカーイメージを使用してリモートプラグインのエンドポイントを起動する 2 つの方法を提供します。
-
Dockerfile を使用した
launch
リモートプラグインのエンドポイントの定義。この方法を使用するには、元のイメージにパッチを適用して再度ビルドします。 -
プラグイン
meta.yaml
ファイルで、launch
リモートプラグインのエンドポイントを定義します。元のイメージへのパッチの適用を回避するには、この方法を使用します。
5.1.6.1. Dockerfile を使用した launch リモートプラグインのエンドポイントの定義 リンクのコピーリンクがクリップボードにコピーされました!
リモートプラグインエンドポイントを起動するには、Dockerfile で PLUGIN_REMOTE_ENDPOINT_EXECUTABLE
環境変数を設定します。
手順
Dockerfile で
CMD
コマンドを使用して、リモートプラグインのエンドポイントを起動します。Dockerfile の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Dockerfile で
ENTRYPOINT
コマンドを使用して、リモートプラグインのエンドポイントを起動します。Dockerfile の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.1.6.1.1. ラッパースクリプトの使用 リンクのコピーリンクがクリップボードにコピーされました!
一部のイメージは、ラッパースクリプトを使用してコンテナー内のパーミッションを設定します。Dockertfile ENTRYPOINT
コマンドは、Dockerfile の CMD
コマンドで定義される主なプロセスを実行するこのスクリプトを定義します。
CodeReady Workspaces はラッパースクリプトと共にイメージを使用し、高度なセキュリティーで保護される複数の異なるインフラストラクチャーに対するパーミッション設定を行います。OpenShift Container Platform はこのようなインフラストラクチャーの一例です。
ラッパースクリプトの例:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ラッパースクリプトを含む Dockerfile の例:
Dockerfile の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 説明:
-
コンテナーは、Dockerfile の
ENTRYPOINT
コマンドで定義される/entrypoint.sh
スクリプトを起動します。 -
このスクリプトはパーミッションを設定し、
exec $@
を使用してコマンドを実行します。 -
CMD
はENTRYPOINT
の引数で、exec $@
コマンドは${PLUGIN_REMOTE_ENDPOINT_EXECUTABLE}
を呼び出します。 - 次に、リモートプラグインのエンドポイントは、パーミッションの設定後にコンテナーで起動します。
-
コンテナーは、Dockerfile の
5.1.6.2. meta.yaml ファイルで、launch リモートプラグインのエンドポイントを定義します。 リンクのコピーリンクがクリップボードにコピーされました!
この方法を使用して、変更なしにリモートプラグインのエンドポイントを起動するためにイメージを再利用します。
手順
プラグインの meta.yaml
ファイルプロパティー command
および args
を変更します。
-
Command
- CodeReady Workspaces は、command
プロパティーを使用してDockerfile#ENTRYPOINT
の値を上書きします。 -
args
- CodeReady Workspaces はargs
プロパティーを使用してDockerfile#CMD
値を上書きします。 command
およびargs
プロパティーが変更された YAML ファイルの例:Copy to Clipboard Copied! Toggle word wrap Toggle overflow ラッパースクリプトのパターンでイメージを使用し、
entrypoint.sh
スクリプトの呼び出しを保持するには、command
ではなくargs
を変更します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Red Hat CodeReady Workspaces は、Dockerfile の
ENTRYPOINT
コマンドで定義されたentrypoint.sh
ラッパースクリプトを呼び出します。このスクリプトは、exec “$@”
コマンドを使用して[ ‘sh’, ‘-c”, ‘ ${PLUGIN_REMOTE_ENDPOINT_EXECUTABLE}’ ]
を実行します。
meta.yaml
ファイルの command
および args
プロパティーを変更することにより、ユーザーは以下を実行できます。
- コンテナー起動時のサービスの実行
- リモートプラグインのエンドポイントの開始
これらのアクションを同時に実行するには、以下を実行します。
- サービスを起動します。
- プロセスの割り当てを解除します。
- リモートプラグインエンドポイントを起動します。