2.3. Red Hat Developer Hub にサードパーティーのプラグインをインストールする
RHDH アプリケーションを再構築せずに、Red Hat Developer Hub にサードパーティーのプラグインをインストールできます。
dynamic-plugin-config.yaml ファイルの場所は、デプロイメント方法により異なります。詳細は、Red Hat Developer Hub Operator を使用した動的プラグインのインストール および Helm チャートを使用した動的プラグインのインストール を参照してください。
プラグインは、dynamic-plugin-config.yaml ファイル内の plugins 配列で定義されます。各プラグインは、次のプロパティーを持つオブジェクトとして表されます。
-
package: プラグインのパッケージ定義。OCI イメージ、TGZ ファイル、JavaScript パッケージ、またはディレクトリーパスになります。 -
disabled: プラグインが有効か無効かを示すブール値。 -
integrity: パッケージの整合性ハッシュ。TGZ ファイルと JavaScript パッケージに必要です。 -
pluginConfig: プラグインの設定。バックエンドプラグインの場合、これはオプションですが、フロントエンドプラグインの場合は必須です。pluginConfigはapp-config.yamlファイルのフラグメントであり、追加されたプロパティーは RHDHapp-config.yamlファイルとマージされます。
別のディレクトリーから動的プラグインをロードすることもできますが、これは開発またはテスト目的であり、RHDH コンテナーイメージに含まれるプラグインを除き、実稼働環境では推奨されません。詳細は、3章RHDH コンテナーイメージに追加されたプラグインの有効化 を参照してください。
2.3.1. OCI イメージとしてパッケージ化されたプラグインをロードする リンクのコピーリンクがクリップボードにコピーされました!
前提条件
サードパーティーのプラグインは、OCI イメージ内の動的プラグインとしてパッケージ化されます。
サードパーティープラグインのパッケージ化の詳細は、「サードパーティーのプラグインを動的プラグインとしてパッケージ化して公開する」 を参照してください。
手順
dynamic-plugins.yamlファイルで、次の形式でoci://接頭辞を持つプラグインを定義します。oci://<image-name>:<tag>!<plugin-name>dynamic-plugins.yamlファイルの設定例plugins: - disabled: false package: oci://quay.io/example/image:v0.0.1!backstage-plugin-myplugin-
REGISTRY_AUTH_FILE環境変数をレジストリー設定ファイルのパスに設定して、プライベートレジストリーの認証を設定します。たとえば、~/.config/containers/auth.jsonまたは~/.docker/config.jsonです。 整合性チェックを実行するには、次のように
dynamic-plugins.yamlファイル内のタグの代わりにイメージダイジェストを使用します。dynamic-plugins.yamlファイルの設定例plugins: - disabled: false package: oci://quay.io/example/image@sha256:28036abec4dffc714394e4ee433f16a59493db8017795049c831be41c02eb5dc!backstage-plugin-myplugin- 変更を適用するには、RHDH アプリケーションを再起動します。
2.3.2. TGZ ファイルとしてパッケージ化されたプラグインをロードする リンクのコピーリンクがクリップボードにコピーされました!
前提条件
サードパーティーのプラグインは、TGZ ファイル内の動的プラグインとしてパッケージ化されています。
サードパーティープラグインのパッケージ化の詳細は、「サードパーティーのプラグインを動的プラグインとしてパッケージ化して公開する」 を参照してください。
手順
次の例を使用して、
dynamic-plugins.yamlファイルにアーカイブ URL とその整合性ハッシュを指定します。dynamic-plugins.yamlファイルの設定例plugins: - disabled: false package: https://example.com/backstage-plugin-myplugin-1.0.0.tgz integrity: sha512-9WlbgEdadJNeQxdn1973r5E4kNFvnT9GjLD627GWgrhCaxjCmxqdNW08cj+Bf47mwAtZMt1Ttyo+ZhDRDj9PoA==- 変更を適用するには、RHDH アプリケーションを再起動します。
2.3.3. JavaScript パッケージとしてパッケージ化されたプラグインを読み込む リンクのコピーリンクがクリップボードにコピーされました!
前提条件
サードパーティーのプラグインは、JavaScript パッケージ内の動的プラグインとしてパッケージ化されます。
サードパーティープラグインのパッケージ化の詳細は、「サードパーティーのプラグインを動的プラグインとしてパッケージ化して公開する」 を参照してください。
手順
次のコマンドを実行して、NPM レジストリーから整合性ハッシュを取得します。
npm view --registry <registry-url> <npm package>@<version> dist.integrity次のように、
dynamic-plugins.yamlファイルでパッケージ名、バージョン、およびその整合性ハッシュを指定します。dynamic-plugins.yamlファイルの設定例plugins: - disabled: false package: @example/backstage-plugin-myplugin@1.0.0 integrity: sha512-9WlbgEdadJNeQxdn1973r5E4kNFvnT9GjLD627GWgrhCaxjCmxqdNW08cj+Bf47mwAtZMt1Ttyo+ZhDRDj9PoA==カスタム NPM レジストリーを使用している場合は、レジストリー URL と認証の詳細を含む
.npmrcファイルを作成します。.npmrcファイルの例コードregistry=<registry-url> //<registry-url>:_authToken=<auth-token>OpenShift Container Platform または Kubernetes を使用する場合は以下のようになります。
Helm チャートを使用してシークレットを作成して
.npmrcファイルを追加します。以下に例を示します。シークレット設定の例
apiVersion: v1 kind: Secret metadata: name: <release_name>-dynamic-plugins-npmrc1 type: Opaque stringData: .npmrc: | registry=<registry-url> //<registry-url>:_authToken=<auth-token>- 1
<release_name>は Helm リリース名に置き換えます。この名前は、Kubernetes クラスター内の各チャートインストールの一意の識別子です。
RHDH Helm チャートの場合は、自動マウントのために次の形式を使用してシークレットに名前を付けます。
<release_name>-dynamic-plugins-npmrc
- 変更を適用するには、RHDH アプリケーションを再起動します。
2.3.4. Red Hat Developer Hub にサードパーティーのプラグインをインストールする例 リンクのコピーリンクがクリップボードにコピーされました!
このセクションでは、Todo プラグイン を Developer Hub に統合するプロセスを説明します。
サードパーティーのプラグインのソースコードを取得する: プラグインのリポジトリーのクローンを複製し、Todo プラグイン ディレクトリーに移動します。
サードパーティーのプラグインのソースコードを入手する
$ git clone https://github.com/backstage/community-plugins $ cd community-plugins/workspaces/todo $ yarn installバックエンドおよびフロントエンドプラグインをエクスポートする: 次のコマンドを実行して、バックエンドプラグインをビルドし、動的読み込み用のパッケージ依存関係を調整し、自己完結型の設定スキーマを生成します。
バックエンドプラグインをエクスポートする
$ cd todo-backend $ npx @janus-idp/cli@latest package export-dynamic-pluginバックエンドプラグインコマンドのエクスポートの出力
Building main package executing yarn build ✔ Packing main package to dist-dynamic/package.json Customizing main package in dist-dynamic/package.json for dynamic loading moving @backstage/backend-common to peerDependencies moving @backstage/backend-openapi-utils to peerDependencies moving @backstage/backend-plugin-api to peerDependencies moving @backstage/catalog-client to peerDependencies moving @backstage/catalog-model to peerDependencies moving @backstage/config to peerDependencies moving @backstage/errors to peerDependencies moving @backstage/integration to peerDependencies moving @backstage/plugin-catalog-node to peerDependencies Installing private dependencies of the main package executing yarn install --no-immutable ✔ Validating private dependencies Validating plugin entry points Saving self-contained config schema in /Users/user/Code/community-plugins/workspaces/todo/plugins/todo-backend/dist-dynamic/dist/configSchema.json次のコマンドを実行して、デフォルトの動的 UI 設定を設定し、フロントエンドプラグインアセットを作成し、フロントエンドプラグインの設定スキーマを生成できます。
フロントエンドプラグインをエクスポートする
$ cd ../todo $ npx @janus-idp/cli@latest package export-dynamic-pluginフロントエンドプラグインコマンドのエクスポートの出力
No scalprum config. Using default dynamic UI configuration: { "name": "backstage-community.plugin-todo", "exposedModules": { "PluginRoot": "./src/index.ts" } } If you wish to change the defaults, add "scalprum" configuration to plugin "package.json" file, or use the '--scalprum-config' option to specify an external config. Packing main package to dist-dynamic/package.json Customizing main package in dist-dynamic/package.json for dynamic loading Generating dynamic frontend plugin assets in /Users/user/Code/community-plugins/workspaces/todo/plugins/todo/dist-dynamic/dist-scalprum 263.46 kB dist-scalprum/static/1417.d5271413.chunk.js ... ... ... 250 B dist-scalprum/static/react-syntax-highlighter_languages_highlight_plaintext.0b7d6592.chunk.js Saving self-contained config schema in /Users/user/Code/community-plugins/workspaces/todo/plugins/todo/dist-dynamic/dist-scalprum/configSchema.jsonサードパーティーのプラグインをパッケージ化して公開する: 次のコマンドを実行してワークスペースディレクトリーに移動し、動的プラグインをパッケージ化して OCI イメージを構築します。
OCI イメージをビルドする
$ cd ../.. $ npx @janus-idp/cli@latest package package-dynamic-plugins --tag quay.io/user/backstage-community-plugin-todo:v0.1.1OCI イメージビルドコマンドの出力
executing podman --version ✔ Using existing 'dist-dynamic' directory at plugins/todo Using existing 'dist-dynamic' directory at plugins/todo-backend Copying 'plugins/todo/dist-dynamic' to '/var/folders/5c/67drc33d0018j6qgtzqpcsbw0000gn/T/package-dynamic-pluginsmcP4mU/backstage-community-plugin-todo No plugin configuration found at undefined create this file as needed if this plugin requires configuration Copying 'plugins/todo-backend/dist-dynamic' to '/var/folders/5c/67drc33d0018j6qgtzqpcsbw0000gn/T/package-dynamic-pluginsmcP4mU/backstage-community-plugin-todo-backend-dynamic No plugin configuration found at undefined create this file as needed if this plugin requires configuration Writing plugin registry metadata to '/var/folders/5c/67drc33d0018j6qgtzqpcsbw0000gn/T/package-dynamic-pluginsmcP4mU/index.json' Creating image using podman executing echo "from scratch COPY . . " | podman build --annotation com.redhat.rhdh.plugins='[{"backstage-community-plugin-todo":{"name":"@backstage-community/plugin-todo","version":"0.2.40","description":"A Backstage plugin that lets you browse TODO comments in your source code","backstage":{"role":"frontend-plugin","pluginId":"todo","pluginPackages":["@backstage-community/plugin-todo","@backstage-community/plugin-todo-backend"]},"homepage":"https://backstage.io","repository":{"type":"git","url":"https://github.com/backstage/community-plugins","directory":"workspaces/todo/plugins/todo"},"license":"Apache-2.0"}},{"backstage-community-plugin-todo-backend-dynamic":{"name":"@backstage-community/plugin-todo-backend","version":"0.3.19","description":"A Backstage backend plugin that lets you browse TODO comments in your source code","backstage":{"role":"backend-plugin","pluginId":"todo","pluginPackages":["@backstage-community/plugin-todo","@backstage-community/plugin-todo-backend"]},"homepage":"https://backstage.io","repository":{"type":"git","url":"https://github.com/backstage/community-plugins","directory":"workspaces/todo/plugins/todo-backend"},"license":"Apache-2.0"}}]' -t 'quay.io/user/backstage-community-plugin-todo:v0.1.1' -f - . ✔ Successfully built image quay.io/user/backstage-community-plugin-todo:v0.1.1 with following plugins: backstage-community-plugin-todo backstage-community-plugin-todo-backend-dynamic Here is an example dynamic-plugins.yaml for these plugins: plugins: - package: oci://quay.io/user/backstage-community-plugin-todo:v0.1.1!backstage-community-plugin-todo disabled: false - package: oci://quay.io/user/backstage-community-plugin-todo:v0.1.1!backstage-community-plugin-todo-backend-dynamic disabled: falseOCI イメージをコンテナーレジストリーにプッシュする:
$ podman push quay.io/user/backstage-community-plugin-todo:v0.1.1OCI イメージコマンドのプッシュの出力
Getting image source signatures Copying blob sha256:86a372c456ae6a7a305cd464d194aaf03660932efd53691998ab3403f87cacb5 Copying config sha256:3b7f074856ecfbba95a77fa87cfad341e8a30c7069447de8144aea0edfcb603e Writing manifest to image destinationサードパーティーのプラグインをインストールして設定する:
dynamic-plugins.yamlファイルに次のプラグイン定義を追加します。dynamic-plugins.yamlファイル内のプラグイン定義packages: - package: oci://quay.io/user/backstage-community-plugin-todo:v0.1.1!backstage-community-plugin-todo pluginConfig: dynamicPlugins: frontend: backstage-community.plugin-todo: mountPoints: - mountPoint: entity.page.todo/cards importName: EntityTodoContent entityTabs: - path: /todo title: Todo mountPoint: entity.page.todo - package: oci://quay.io/user/backstage-community-plugin-todo:v0.1.1!backstage-community-plugin-todo-backend-dynamic disabled: false