2.3. 在 Red Hat Developer Hub 中安装第三方插件
您可以在 Red Hat Developer Hub 中安装第三方插件,而无需重建 RHDH 应用程序。
dynamic-plugin-config.yaml
文件的位置取决于部署方法。如需了解更多详细信息,请参阅使用 Red Hat Developer Hub Operator 安装动态插件 和 使用 Helm Chart 安装动态插件。
插件在 dynamic-plugin-config.yaml
文件中的 plugins
数组中定义。每个插件以具有以下属性的对象表示:
-
软件包
:插件的软件包定义,可以是 OCI 镜像、TGZ 文件、JavaScript 软件包或目录路径。 -
disabled
:指示插件是启用或禁用的布尔值。 -
完整性
:软件包的完整性哈希值,TGZ 文件和 JavaScript 软件包是必需的。 -
pluginConfig
:插件的配置。对于后端插件,这是可选的;对于 frontend 插件,需要它。pluginConfig
是app-config.yaml
文件的片段,任何添加的属性都与 RHDHapp-config.yaml
文件合并。
您也可以从另一个目录加载动态插件,但这主要用于开发或测试目的,但不建议在生产环境中使用,除了 RHDH 容器镜像中包含的插件外。如需更多信息,请参阅 第 3 章 启用在 RHDH 容器镜像中添加的插件。
2.3.1. 加载打包为 OCI 镜像的插件
先决条件
第三方插件打包在 OCI 镜像中作为动态插件。
有关打包第三方插件的更多信息,请参阅 第 2.2 节 “将第三方插件打包并发布为动态插件”。
流程
要从经过身份验证的 registry 检索插件,请完成以下步骤:
登录到容器镜像 registry。
podman login <registry>
podman login <registry>
Copy to Clipboard Copied! 验证登录后创建的
auth.json
文件的内容。cat ${XDG_RUNTIME_DIR:-~/.config}/containers/auth.json
cat ${XDG_RUNTIME_DIR:-~/.config}/containers/auth.json
Copy to Clipboard Copied! 使用以下示例创建 secret 文件:
oc create secret generic _<secret_name>_ --from-file=auth.json=${XDG_RUNTIME_DIR:-~/.config}/containers/auth.json
oc create secret generic _<secret_name>_ --from-file=auth.json=${XDG_RUNTIME_DIR:-~/.config}/containers/auth.json
1 Copy to Clipboard Copied! -
对于基于 Operator 的部署,将 < secret_name> 替换为
dynamic-plugins-registry-auth
。 -
对于基于 Helm 的部署,将 < secret_name > 替换为 &
lt;Helm_release_name>_-dynamic-plugins-registry-auth
。
-
对于基于 Operator 的部署,将 < secret_name> 替换为
在
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
plugins: - disabled: false package: oci://quay.io/example/image:v0.0.1!backstage-plugin-myplugin
Copy to Clipboard Copied! 要执行完整性检查,请使用镜像摘要来代替
dynamic-plugins.yaml
文件中的标签,如下例所示:dynamic-plugins.yaml
文件中的配置示例plugins: - disabled: false package: oci://quay.io/example/image@sha256:28036abec4dffc714394e4ee433f16a59493db8017795049c831be41c02eb5dc!backstage-plugin-myplugin
plugins: - disabled: false package: oci://quay.io/example/image@sha256:28036abec4dffc714394e4ee433f16a59493db8017795049c831be41c02eb5dc!backstage-plugin-myplugin
Copy to Clipboard Copied! - 要应用更改,请重启 RHDH 应用程序。
2.3.2. 加载打包为 TGZ 文件的插件
先决条件
第三方插件作为 TGZ 文件中的动态插件打包。
有关打包第三方插件的更多信息,请参阅 第 2.2 节 “将第三方插件打包并发布为动态插件”。
流程
使用以下示例在
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==
plugins: - disabled: false package: https://example.com/backstage-plugin-myplugin-1.0.0.tgz integrity: sha512-9WlbgEdadJNeQxdn1973r5E4kNFvnT9GjLD627GWgrhCaxjCmxqdNW08cj+Bf47mwAtZMt1Ttyo+ZhDRDj9PoA==
Copy to Clipboard Copied! - 要应用更改,请重启 RHDH 应用程序。
2.3.3. 加载打包为 JavaScript 软件包的插件
先决条件
第三方插件作为 JavaScript 软件包中的动态插件打包。
有关打包第三方插件的更多信息,请参阅 第 2.2 节 “将第三方插件打包并发布为动态插件”。
流程
运行以下命令以从 NPM registry 获取完整性哈希:
npm view --registry <registry-url> <npm package>@<version> dist.integrity
npm view --registry <registry-url> <npm package>@<version> dist.integrity
Copy to Clipboard Copied! 在
dynamic-plugins.yaml
文件中指定软件包名称、版本及其完整性哈希,如下所示:dynamic-plugins.yaml
文件中的配置示例plugins: - disabled: false package: @example/backstage-plugin-myplugin@1.0.0 integrity: sha512-9WlbgEdadJNeQxdn1973r5E4kNFvnT9GjLD627GWgrhCaxjCmxqdNW08cj+Bf47mwAtZMt1Ttyo+ZhDRDj9PoA==
plugins: - disabled: false package: @example/backstage-plugin-myplugin@1.0.0 integrity: sha512-9WlbgEdadJNeQxdn1973r5E4kNFvnT9GjLD627GWgrhCaxjCmxqdNW08cj+Bf47mwAtZMt1Ttyo+ZhDRDj9PoA==
Copy to Clipboard Copied! 如果您使用自定义 NPM registry,请使用 registry URL 和身份验证详情创建一个
.npmrc
文件:.npmrc
文件示例registry=<registry-url> //<registry-url>:_authToken=<auth-token>
registry=<registry-url> //<registry-url>:_authToken=<auth-token>
Copy to Clipboard Copied! 使用 OpenShift Container Platform 或 Kubernetes 时:
使用 Helm Chart 通过创建 secret 添加
.npmrc
文件。例如:secret 配置示例
apiVersion: v1 kind: Secret metadata: name: <release_name>-dynamic-plugins-npmrc type: Opaque stringData: .npmrc: | registry=<registry-url> //<registry-url>:_authToken=<auth-token>
apiVersion: v1 kind: Secret metadata: name: <release_name>-dynamic-plugins-npmrc
1 type: Opaque stringData: .npmrc: | registry=<registry-url> //<registry-url>:_authToken=<auth-token>
Copy to Clipboard Copied! 对于 RHDH Helm Chart,使用以下格式命名 secret 进行自动挂载:
<release_name>-dynamic-plugins-npmrc
- 要应用更改,请重启 RHDH 应用程序。
2.3.4. 在 Red Hat Developer Hub 中安装第三方插件的示例
本节介绍将 Todo 插件 集成到 Developer Hub 中的过程。
获取第三方插件源代码 :克隆 plugins 存储库并导航到 Todo 插件 目录:
获取第三方插件源代码
git clone https://github.com/backstage/community-plugins cd community-plugins/workspaces/todo yarn install
$ git clone https://github.com/backstage/community-plugins $ cd community-plugins/workspaces/todo $ yarn install
Copy to Clipboard Copied! 导出后端和前端插件 : 运行以下命令构建后端插件,调整动态加载的软件包依赖项,并生成自包含的配置模式:
导出后端插件
cd todo-backend npx @janus-idp/cli@latest package export-dynamic-plugin
$ cd todo-backend $ npx @janus-idp/cli@latest package export-dynamic-plugin
Copy to Clipboard Copied! 导出后端插件命令的输出
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
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
Copy to Clipboard Copied! 您可以运行以下命令来设置默认动态 UI 配置,创建前端插件资产,并为前端插件生成配置模式:
导出前端插件
cd ../todo npx @janus-idp/cli@latest package export-dynamic-plugin
$ cd ../todo $ npx @janus-idp/cli@latest package export-dynamic-plugin
Copy to Clipboard Copied! 导出前端插件命令的输出
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
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
Copy to Clipboard Copied! 软件包并发布第三方插件 : 运行以下命令进入工作区目录,并打包动态插件以构建 OCI 镜像:
构建 OCI 镜像
cd ../.. npx @janus-idp/cli@latest package package-dynamic-plugins --tag quay.io/user/backstage-community-plugin-todo:v0.1.1
$ cd ../.. $ npx @janus-idp/cli@latest package package-dynamic-plugins --tag quay.io/user/backstage-community-plugin-todo:v0.1.1
Copy to Clipboard Copied! 构建 OCI 镜像命令的输出
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: false
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: false
Copy to Clipboard Copied! 将 OCI 镜像推送到容器 registry:
podman push quay.io/user/backstage-community-plugin-todo:v0.1.1
$ podman push quay.io/user/backstage-community-plugin-todo:v0.1.1
Copy to Clipboard Copied! 推送 OCI image 命令的输出
Getting image source signatures Copying blob sha256:86a372c456ae6a7a305cd464d194aaf03660932efd53691998ab3403f87cacb5 Copying config sha256:3b7f074856ecfbba95a77fa87cfad341e8a30c7069447de8144aea0edfcb603e Writing manifest to image destination
Getting image source signatures Copying blob sha256:86a372c456ae6a7a305cd464d194aaf03660932efd53691998ab3403f87cacb5 Copying config sha256:3b7f074856ecfbba95a77fa87cfad341e8a30c7069447de8144aea0edfcb603e Writing manifest to image destination
Copy to Clipboard Copied! 安装和配置第三方插件:在
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
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
Copy to Clipboard Copied!