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 插件,需要它。pluginConfigapp-config.yaml 文件的片段,任何添加的属性都与 RHDH app-config.yaml 文件合并。
注意

您也可以从另一个目录加载动态插件,但这主要用于开发或测试目的,但不建议在生产环境中使用,除了 RHDH 容器镜像中包含的插件外。如需更多信息,请参阅 第 3 章 启用在 RHDH 容器镜像中添加的插件

2.3.1. 加载打包为 OCI 镜像的插件

先决条件

流程

  1. 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
    Copy to Clipboard

  2. 通过将 REGISTRY_AUTH_FILE 环境变量设置为 registry 配置文件的路径,为私有 registry 配置身份验证。例如: ~/.config/containers/auth.json~/.docker/config.json
  3. 要执行完整性检查,请使用镜像摘要来代替 dynamic-plugins.yaml 文件中的标签,如下所示:

    dynamic-plugins.yaml 文件中的配置示例

    plugins:
      - disabled: false
        package: oci://quay.io/example/image@sha256:28036abec4dffc714394e4ee433f16a59493db8017795049c831be41c02eb5dc!backstage-plugin-myplugin
    Copy to Clipboard

  4. 要应用更改,请重启 RHDH 应用程序。

2.3.2. 加载打包为 TGZ 文件的插件

先决条件

流程

  1. 使用以下示例在 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==
    Copy to Clipboard

  2. 要应用更改,请重启 RHDH 应用程序。

2.3.3. 加载打包为 JavaScript 软件包的插件

先决条件

流程

  1. 运行以下命令以从 NPM registry 获取完整性哈希:

    npm view --registry <registry-url> <npm package>@<version> dist.integrity
    Copy to Clipboard
  2. dynamic-plugins.yaml 文件中指定软件包名称、版本及其完整性哈希,如下所示:

    dynamic-plugins.yaml 文件中的配置示例

    plugins:
      - disabled: false
        package: @example/backstage-plugin-myplugin@1.0.0
        integrity: sha512-9WlbgEdadJNeQxdn1973r5E4kNFvnT9GjLD627GWgrhCaxjCmxqdNW08cj+Bf47mwAtZMt1Ttyo+ZhDRDj9PoA==
    Copy to Clipboard

  3. 如果您使用自定义 NPM registry,请使用 registry URL 和身份验证详情创建一个 .npmrc 文件:

    .npmrc 文件示例

    registry=<registry-url>
    //<registry-url>:_authToken=<auth-token>
    Copy to Clipboard

  4. 使用 OpenShift Container Platform 或 Kubernetes 时:

    • 使用 Helm Chart 通过创建 secret 添加 .npmrc 文件。例如:

      secret 配置示例

      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

      1
      <release_name > 替换为您的 Helm 发行版本名称。此名称是 Kubernetes 集群中每个 chart 安装的唯一标识符。
    • 对于 RHDH Helm Chart,使用以下格式命名 secret 进行自动挂载:

      <release_name>-dynamic-plugins-npmrc

  5. 要应用更改,请重启 RHDH 应用程序。

2.3.4. 在 Red Hat Developer Hub 中安装第三方插件的示例

本节介绍将 Todo 插件 集成到 Developer Hub 中的过程。

  1. 获取第三方插件源代码 :克隆 plugins 存储库并导航到 Todo 插件 目录:

    获取第三方插件源代码

    $ git clone https://github.com/backstage/community-plugins
    $ cd community-plugins/workspaces/todo
    $ yarn install
    Copy to Clipboard

  2. 导出后端和前端插件 : 运行以下命令构建后端插件,调整动态加载的软件包依赖项,并生成自包含的配置模式:

    导出后端插件

    $ cd todo-backend
    $ npx @janus-idp/cli@latest package export-dynamic-plugin
    Copy to Clipboard

    导出后端插件命令的输出

    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

    您可以运行以下命令来设置默认动态 UI 配置,创建前端插件资产,并为前端插件生成配置模式:

    导出前端插件

    $ cd ../todo
    $ npx @janus-idp/cli@latest package export-dynamic-plugin
    Copy to Clipboard

    导出前端插件命令的输出

    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

  3. 软件包并发布第三方插件 : 运行以下命令进入工作区目录,并打包动态插件以构建 OCI 镜像:

    构建 OCI 镜像

    $ cd ../..
    $ npx @janus-idp/cli@latest package package-dynamic-plugins --tag quay.io/user/backstage-community-plugin-todo:v0.1.1
    Copy to Clipboard

    构建 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
    Copy to Clipboard

    将 OCI 镜像推送到容器 registry:

    $ podman push quay.io/user/backstage-community-plugin-todo:v0.1.1
    Copy to Clipboard

    推送 OCI image 命令的输出

    Getting image source signatures
    Copying blob sha256:86a372c456ae6a7a305cd464d194aaf03660932efd53691998ab3403f87cacb5
    Copying config sha256:3b7f074856ecfbba95a77fa87cfad341e8a30c7069447de8144aea0edfcb603e
    Writing manifest to image destination
    Copy to Clipboard

  4. 安装和配置第三方插件:在 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
    Copy to Clipboard

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat