在 Red Hat Developer Hub 中安装并查看插件


Red Hat Developer Hub 1.5

在 Red Hat Developer Hub 中安装插件

Red Hat Customer Content Services

摘要

管理用户可以安装和配置插件,使其他用户能够使用插件扩展 RHDH 功能。

第 1 章 在 Red Hat Developer Hub 中安装动态插件

动态插件支持基于 backend 插件管理器软件包,它是一个在 app-config.yaml 文件中扫描配置的根目录(dynamicPlugins.rootDirectory )的服务,并动态加载它们。

您可以使用预安装 Red Hat Developer Hub 的动态插件,或者从公共 NPM registry 安装外部动态插件。

您可以将动态插件的配置存储在 Backstage 自定义资源(CR)可引用的 ConfigMap 对象中。

注意

如果 pluginConfig 字段引用环境变量,则必须在 < my_product_secrets > secret 中定义变量。

流程

  1. 在 OpenShift Container Platform Web 控制台中选择 ConfigMaps 选项卡。
  2. Create ConfigMap
  3. Create ConfigMap 页面中,选择 Configure via 中的 YAML view 选项,并根据需要编辑该文件。

    使用 GitHub 动态插件的 ConfigMap 对象示例

    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: dynamic-plugins-rhdh
    data:
      dynamic-plugins.yaml: |
        includes:
          - dynamic-plugins.default.yaml
        plugins:
          - package: './dynamic-plugins/dist/backstage-plugin-catalog-backend-module-github-dynamic'
            disabled: false
            pluginConfig:
              catalog:
                providers:
                  github:
                    organization: "${GITHUB_ORG}"
                    schedule:
                      frequency: { minutes: 1 }
                      timeout: { minutes: 1 }
                      initialDelay: { seconds: 100 }
    Copy to Clipboard Toggle word wrap

  4. Create
  5. 进入 Topology 视图。
  6. 点您要使用的 Red Hat Developer Hub 实例的溢出菜单,然后选择 Edit Backstage 以加载 Red Hat Developer Hub 实例的 YAML 视图。

  7. dynamicPluginsConfigMapName 字段添加到 Backstage CR。例如:

    apiVersion: rhdh.redhat.com/v1alpha3
    kind: Backstage
    metadata:
      name: my-rhdh
    spec:
      application:
    # ...
        dynamicPluginsConfigMapName: dynamic-plugins-rhdh
    # ...
    Copy to Clipboard Toggle word wrap
  8. 点击 Save
  9. 返回到 Topology 视图并等待 Red Hat Developer Hub pod 启动。
  10. Open URL 图标以使用 Red Hat Developer Hub 平台以及新的配置更改。

验证

  • 通过在 Red Hat Developer Hub root URL 中附加 /api/dynamic-plugins-info/loaded-plugins 并检查插件列表来确保动态插件配置已被加载:

    插件列表示例

    [
      {
        "name": "backstage-plugin-catalog-backend-module-github-dynamic",
        "version": "0.5.2",
        "platform": "node",
        "role": "backend-plugin-module"
      },
      {
        "name": "backstage-plugin-techdocs",
        "version": "1.10.0",
        "role": "frontend-plugin",
        "platform": "web"
      },
      {
        "name": "backstage-plugin-techdocs-backend-dynamic",
        "version": "1.9.5",
        "platform": "node",
        "role": "backend-plugin"
      },
    ]
    Copy to Clipboard Toggle word wrap

1.2. 使用 Helm Chart 安装动态插件

您可以使用 Helm Chart 部署 Developer Hub 实例,它是一个灵活的安装方法。使用 Helm Chart,您可以侧将动态插件加载到 Developer Hub 实例中,而无需重新编译代码或重建容器。

要使用 Helm 在 Developer Hub 中安装动态插件,请在 Helm Chart 中添加以下 global.dynamic 参数:

  • 插件 :用于安装的动态插件列表。默认情况下,列表为空。您可以使用以下字段填充 plugins 列表:

    • 软件包 :您要安装的动态插件软件包的软件包规格。您可以使用软件包进行本地或外部动态插件安装。对于本地安装,请使用包含动态插件的本地文件夹的路径。对于外部安装,请使用公共 NPM 存储库中的软件包规格。
    • 完整性 (外部软件包必需):一个特定于软件包的 < alg>-<digest&gt; 形式的完整性校验和。支持的算法包括 sha256sha384sha512
    • pluginConfig :特定于插件的 app-config.yaml YAML 片段。如需更多信息,请参阅插件配置。
    • disabled :如果设为 true,则禁用动态插件。默认值: false
    • forceDownload :将值设置为 true 以强制重新安装插件,绕过缓存。默认值为 false
    • PullPolicy :与 forceDownload 参数类似,并与其他镜像容器平台一致。对于这个键,您可以使用以下值之一:

      • Always: 这个值比较远程 registry 中的镜像摘要,并下载工件(如果之前下载了插件)。
      • IfNotPresent: 如果工件还没有存在于 dynamic-plugins-root 文件夹中,如果没有检查镜像摘要,则下载工件。

        注意

        pullPolicy 设置也应用于 NPM 下载方法,但 Always 将下载远程工件,而无需摘要检查。现有的 forceDownload 选项仍可以正常工作,但 pullPolicy 选项具有优先权。在以后的 Developer Hub 发行版本中可能会弃用 forceDownload 选项。

  • 包括 :使用相同语法的 YAML 文件列表。
注意

includes 文件中的 plugins 列表与主 Helm 值中的 plugins 列表合并。如果这两个插件列表中都提到了插件软件包,则主 Helm 值中的 plugins 字段会覆盖 includes 文件中的 plugins 字段。默认配置包含 dynamic-plugins.default.yaml 文件,其中包含 Developer Hub 中预安装的所有动态插件,无论是默认启用还是禁用。

1.2.1. 动态插件安装的 Helm Chart 配置示例

以下示例演示了如何为特定类型的动态插件安装配置 Helm Chart。

当外部插件需要特定配置时,配置本地插件和外部插件

global:
  dynamic:
    plugins:
      - package: <alocal package-spec used by npm pack>
      - package: <external package-spec used by npm pack>
        integrity: sha512-<some hash>
        pluginConfig: ...
Copy to Clipboard Toggle word wrap

从包含的文件禁用插件

global:
  dynamic:
    includes:
      - dynamic-plugins.default.yaml
    plugins:
      - package: <some imported plugins listed in dynamic-plugins.default.yaml>
        disabled: true
Copy to Clipboard Toggle word wrap

从包含的文件启用插件

global:
  dynamic:
    includes:
      - dynamic-plugins.default.yaml
    plugins:
      - package: <some imported plugins listed in dynamic-plugins.custom.yaml>
        disabled: false
Copy to Clipboard Toggle word wrap

启用在所含文件中禁用的插件

global:
  dynamic:
    includes:
      - dynamic-plugins.default.yaml
    plugins:
      - package: <some imported plugins listed in dynamic-plugins.custom.yaml>
        disabled: false
Copy to Clipboard Toggle word wrap

1.3. 在 air-gapped 环境中安装动态插件

您可以通过设置自定义 NPM registry,在 air-gapped 环境中安装外部插件。

您可以使用 Helm Chart 为动态插件软件包配置 NPM registry URL 和身份验证信息。对于通过 npm pack 获取的动态插件软件包,您可以使用 .npmrc 文件。

使用 Helm Chart,通过创建 secret 将 .npmrc 文件添加到 NPM registry 中。例如:

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 Toggle word wrap
1
<release_name > 替换为您的 Helm 发行版本名称。此名称是 Kubernetes 集群中每个 chart 安装的唯一标识符。

第 2 章 Red Hat Developer Hub 中的第三方插件

您可以将第三方动态插件集成到 Red Hat Developer Hub 中,以增强其功能,而无需修改其源代码或重建它。要添加这些插件,请将它们导出为派生的软件包。

在导出插件软件包时,您必须确保依赖项被正确捆绑或标记为共享,具体取决于它们与 Developer Hub 环境的关系。

将第三方插件集成到 Developer Hub 中:

  1. 首先,获取插件的源代码。
  2. 将插件导出为动态插件软件包。请参阅 第 2.1 节 “在 Red Hat Developer Hub 中导出第三方插件”
  3. 软件包并发布动态插件。请参阅 第 2.2 节 “将第三方插件打包并发布为动态插件”
  4. 在 Developer Hub 环境中安装插件。请参阅 第 2.3 节 “在 Red Hat Developer Hub 中安装第三方插件”

2.1. 在 Red Hat Developer Hub 中导出第三方插件

要在 Red Hat Developer Hub 中使用插件,您可以将插件导出为派生的动态插件软件包。这些软件包包含插件代码和依赖项,可用于将动态插件集成到 Developer Hub 中。

先决条件

  • @janus-idp/cli 软件包已安装。使用最新版本(@latest 标签)与最新的功能和修复程序兼容。
  • Node.js 和 NPM 已安装并配置。
  • 第三方插件与您的 Red Hat Developer Hub 版本兼容。如需更多信息,请参阅 版本兼容性列表
  • 第三方插件在其根目录中必须具有有效的 package.json 文件,其中包含所有必需的元数据和依赖项。

    后端插件

    为确保与动态插件支持兼容并启用它们的用作动态插件,现有后端插件必须与新的 Backstage 后端系统兼容。此外,这些插件必须使用专用的 CLI 命令重建。

    新的 Backstage 后端系统入口点(使用 createBackendPlugin ()createBackendModule ()创建)必须导出为来自主软件包或 alpha 软件包的默认导出(如果插件实例支持仍使用 alpha API 提供)。这不会对插件实例的标准插件开发指南之上添加任何其他要求。

    动态导出机制标识私有依赖项,并在 package.json 文件中设置 bundleDependencies 字段。此导出机制可确保将动态插件软件包作为自包含的软件包发布,其私有依赖项捆绑在私有 node_modules 文件夹中。

    某些插件依赖项需要在派生的软件包中特定处理,例如:

    • 共享依赖关系 由 RHDH 应用程序提供,并列为 package.json 文件中的 对等依赖项,而不是捆绑在动态插件软件包中。例如,默认情况下,所有 @backstage 范围的软件包都将被共享。

      您可以使用 -shared-package 标志指定共享依赖项,这些依赖项应该由 Red Hat Developer Hub 应用程序提供,而不是捆绑在动态插件软件包中。

      要将 @backstage 软件包视为私有,请使用负前缀(!)。例如,当插件依赖于 @backstage 中的软件包时,该软件包不是由 Red Hat Developer Hub 应用程序提供。

    • 嵌入式依赖项 捆绑到动态插件软件包中,它们的依赖项与顶层相同。默认情况下,嵌入了带有 -node-common 后缀的软件包。

      您可以使用-- embed-package 标志指定其他嵌入的软件包。例如,来自同一工作区中的软件包不遵循默认命名约定。

      以下是使用共享和嵌入式软件包导出动态插件的示例:

      带有共享和嵌入式软件包的动态插件导出示例

      npx @janus-idp/cli@latest export-dynamic-plugin --shared-package '!/@backstage/plugin-notifications/' --embed-package @backstage/plugin-notifications-backend
      Copy to Clipboard Toggle word wrap

      在上例中:

    • @backstage/plugin-notifications 软件包被视为私有依赖项,并且捆绑在动态插件软件包中,尽管处于 @backstage 范围。
    • @backstage/plugin-notifications-backend 软件包标记为嵌入式依赖项,并捆绑到动态插件软件包中。
    前端插件

    前端插件可以使用 scalprum 进行配置,CLI 可以在导出过程中自动生成。运行以下命令时,生成的默认配置会被记录:

    记录默认配置的命令示例

    npx @janus-idp/cli@latest export-dynamic
    Copy to Clipboard Toggle word wrap

    以下是默认 scalprum 配置示例:

    默认 scalprum 配置

    "scalprum": {
      "name": "<package_name>",  // The Webpack container name matches the NPM package name, with "@" replaced by "." and "/" removed.
      "exposedModules": {
        "PluginRoot": "./src/index.ts"  // The default module name is "PluginRoot" and doesn't need explicit specification in the app-config.yaml file.
      }
    }
    Copy to Clipboard Toggle word wrap

    您可以在 package.json 文件中添加 scalprum 部分。例如:

    scalprum 自定义示例

    "scalprum": {
      "name": "custom-package-name",
      "exposedModules": {
        "FooModuleName": "./src/foo.ts",
        "BarModuleName": "./src/bar.ts"
        // Define multiple modules here, with each exposed as a separate entry point in the Webpack container.
      }
    }
    Copy to Clipboard Toggle word wrap

    动态插件可能需要调整 Developer Hub 需求,如用于挂载点或动态路由的静态 JSX。这些更改是可选的,但可能与静态插件不兼容。

    要包含静态 JSX,请定义一个额外的导出,并将其用作动态插件的 importName。例如:

    静态和动态插件导出示例

    // For a static plugin
    export const EntityTechdocsContent = () => {...}
    
    // For a dynamic plugin
    export const DynamicEntityTechdocsContent = {
      element: EntityTechdocsContent,
      staticJSXContent: (
        <TechDocsAddons>
          <ReportIssue />
        </TechDocsAddons>
      ),
    };
    Copy to Clipboard Toggle word wrap

流程

  • 使用 @janus-idp/cli 软件包中的 package export-dynamic-plugin 命令来导出插件:

    导出第三方插件的命令示例

    npx @janus-idp/cli@latest package export-dynamic-plugin
    Copy to Clipboard Toggle word wrap

    确保在插件的 JavaScript 软件包的根目录中执行上一命令(包含 package.json 文件)。

    生成的派生软件包将位于 dist-dynamic 子文件夹中。导出的软件包名称由原始插件名称组成,并附加了 -dynamic

    警告

    派生的动态插件 JavaScript 软件包不得发布到公共 NPM 注册表。有关更合适的打包选项,请参阅 第 2.2 节 “将第三方插件打包并发布为动态插件”。如果需要发布至 NPM 注册表,请使用私有 registry。

2.2. 将第三方插件打包并发布为动态插件

在导出第三方插件 后,您可以将派生的软件包打包成以下支持的格式之一:

  • 开放容器项目(OCI)镜像(推荐)
  • TGZ 文件
  • JavaScript 软件包

    重要

    导出的动态插件软件包必须仅发布到私有 NPM registry。

2.2.1. 使用动态软件包创建 OCI 镜像

先决条件

流程

  1. 导航到插件的根目录(而不是 dist-dynamic 目录)。
  2. 运行以下命令将插件打包到 OCI 镜像中:

    打包导出的第三方插件的命令示例

    npx @janus-idp/cli@latest package package-dynamic-plugins --tag quay.io/example/image:v0.0.1
    Copy to Clipboard Toggle word wrap

    在上一命令中,--tag 参数指定镜像名称和标签。

  3. 运行以下命令之一将镜像推送(push)到 registry:

    使用 podman 将镜像推送到 registry 的命令示例

    podman push quay.io/example/image:v0.0.1
    Copy to Clipboard Toggle word wrap

    使用 docker 将镜像推送到 registry 的命令示例

    docker push quay.io/example/image:v0.0.1
    Copy to Clipboard Toggle word wrap

    package-dynamic-plugins 命令的输出提供了插件的路径,可在 dynamic-plugin-config.yaml 文件中使用。

2.2.2. 使用动态软件包创建 TGZ 文件

先决条件

流程

  1. 进入 dist-dynamic 目录。
  2. 运行以下命令来创建 tgz 归档:

    创建 tgz 归档的命令示例

    npm pack
    Copy to Clipboard Toggle word wrap

    您可以使用-- json 标志从 npm pack 命令的输出中获取完整性哈希,如下所示:

    获取 tgz 归档的完整性哈希值的命令示例

    npm pack --json | head -n 10
    Copy to Clipboard Toggle word wrap

  3. 在 RHDH 实例可访问的 Web 服务器上托管存档,并在 dynamic-plugin-config.yaml 文件中引用其 URL,如下所示:

    dynamic-plugin-config.yaml 文件示例

    plugins:
      - package: https://example.com/backstage-plugin-myplugin-1.0.0.tgz
        integrity: sha512-<hash>
    Copy to Clipboard Toggle word wrap

  4. 运行以下命令来打包插件:

    打包动态插件的命令示例

    npm pack --pack-destination ~/test/dynamic-plugins-root/
    Copy to Clipboard Toggle word wrap

    提示

    要使用 OpenShift Container Platform 上的 HTTP 服务器创建插件 registry,请运行以下命令:

    在 OpenShift Container Platform 中构建和部署 HTTP 服务器的命令示例

    oc project my-rhdh-project
    oc new-build httpd --name=plugin-registry --binary
    oc start-build plugin-registry --from-dir=dynamic-plugins-root --wait
    oc new-app --image-stream=plugin-registry
    Copy to Clipboard Toggle word wrap

  5. 通过编辑 dynamic-plugin-config.yaml 文件,将 RHDH 配置为使用来自 HTTP 服务器的插件:

    在 RHDH 中使用打包插件的示例配置

    plugins:
      - package: http://plugin-registry:8080/backstage-plugin-myplugin-1.9.6.tgz
    Copy to Clipboard Toggle word wrap

2.2.3. 使用动态软件包创建 JavaScript 软件包

警告

派生的动态插件 JavaScript 软件包不得发布到公共 NPM 注册表。如果需要发布至 NPM 注册表,请使用私有 registry。

先决条件

流程

  1. 进入 dist-dynamic 目录。
  2. 运行以下命令,将软件包发布到您的私有 NPM registry:

    将插件软件包发布到 NPM registry 的命令示例

    npm publish --registry <npm_registry_url>
    Copy to Clipboard Toggle word wrap

    提示

    在运行 export 命令前,您可以在 package.json 文件中添加以下内容:

    package.json 文件示例

    {
      "publishConfig": {
        "registry": "<npm_registry_url>"
      }
    }
    Copy to Clipboard Toggle word wrap

    如果您在导出动态插件后修改 publishConfig,请重新运行 export-dynamic-plugin 命令,以确保包含正确的配置。

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. 要从经过身份验证的 registry 检索插件,请完成以下步骤:

    1. 登录到容器镜像 registry。

      podman login <registry>
      Copy to Clipboard Toggle word wrap
    2. 验证登录后创建的 auth.json 文件的内容。

      cat ${XDG_RUNTIME_DIR:-~/.config}/containers/auth.json
      Copy to Clipboard Toggle word wrap
    3. 使用以下示例创建 secret 文件:

      oc create secret generic _<secret_name>_ --from-file=auth.json=${XDG_RUNTIME_DIR:-~/.config}/containers/auth.json 
      1
      Copy to Clipboard Toggle word wrap
      • 对于基于 Operator 的部署,将 < secret_name> 替换为 dynamic-plugins-registry-auth
      • 对于基于 Helm 的部署,将 < secret_name > 替换为 & lt;Helm_release_name>_-dynamic-plugins-registry-auth
  2. 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 Toggle word wrap

  3. 要执行完整性检查,请使用镜像摘要来代替 dynamic-plugins.yaml 文件中的标签,如下例所示:

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

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

  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 Toggle word wrap

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

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

先决条件

流程

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

    npm view --registry <registry-url> <npm package>@<version> dist.integrity
    Copy to Clipboard Toggle word wrap
  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 Toggle word wrap

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

    .npmrc 文件示例

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

  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 Toggle word wrap

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

      <release_name>-dynamic-plugins-npmrc

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

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

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

    获取第三方插件源代码

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

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

    导出后端插件

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

    导出后端插件命令的输出

    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 Toggle word wrap

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

    导出前端插件

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

    导出前端插件命令的输出

    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 Toggle word wrap

  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 Toggle word wrap

    构建 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 Toggle word wrap

    将 OCI 镜像推送到容器 registry:

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

    推送 OCI image 命令的输出

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

  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 Toggle word wrap

第 3 章 启用在 RHDH 容器镜像中添加的插件

在 RHDH 容器镜像中,会预加载一组动态插件来增强功能。但是,由于强制配置要求,大多数插件都被禁用。

您可以在 RHDH 容器镜像中启用和配置插件,包括如何管理默认配置,设置必要的环境变量,并确保应用程序中的插件正常工作。

先决条件

  • 您可以访问 dynamic-plugins.default.yaml 文件,该文件列出所有预加载的插件及其默认配置。
  • 您已部署了 RHDH 应用程序,并可访问 install-dynamic-plugins init 容器的日志。
  • 您有修改插件配置并访问应用程序环境所需的权限。
  • 您已识别并设置插件默认配置引用的必要环境变量。这些环境变量必须在 Helm Chart 或 Operator 配置中定义。

流程

  1. 启动 RHDH 应用程序,并访问 RHDH pod 中 install-dynamic-plugins init 容器的日志。
  2. 识别默认情况下禁用的 红帽支持插件
  3. dynamic-plugins.default.yaml 文件中复制软件包配置。
  4. 打开插件配置文件,并找到您要启用的插件条目。

    插件配置文件的位置因部署方法而异。如需了解更多详细信息,请参阅使用 Red Hat Developer Hub Operator 安装动态插件 和 使用 Helm Chart 安装动态插件

  5. disabled 字段修改为 false,并添加软件包名称,如下所示:

    插件配置示例

    plugins:
      - disabled: false
        package: ./dynamic-plugins/dist/backstage-plugin-catalog-backend-module-github-dynamic
    Copy to Clipboard Toggle word wrap

    有关如何在 Developer Hub 中配置动态插件的更多信息,请参阅在 Red Hat Developer Hub 中安装动态插件

验证

  1. 重启 RHDH 应用程序,并验证插件是否已成功激活和配置。
  2. 验证应用程序日志以确认,并确保插件按预期工作。

第 4 章 Red Hat Developer Hub 中的扩展

重要

这些功能仅用于技术预览。红帽产品服务级别协议(SLA)不支持技术预览功能,且其功能可能并不完善,因此红帽不建议在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

Red Hat Developer Hub (RHDH)包括预装并启用的扩展功能。扩展功能为用户提供了用于浏览和管理可用插件的集中界面

您可以使用扩展来发现扩展 RHDH 功能、简化开发工作流并改进开发人员体验的插件。

4.1. 查看可用插件

您可以在 Extensions 页面中查看 Red Hat Developer Hub 应用程序可用的插件。

流程

  1. 打开 Developer Hub 应用程序,然后点击 Administration > Extensions
  2. 前往 Catalog 选项卡,以查看可用插件和相关信息的列表。

4.2. 查看已安装的插件

使用 Dynamic Plugins Info 前端插件,您可以查看当前安装在 Red Hat Developer Hub 应用程序中的插件。此插件默认是启用的。

流程

  1. 打开 Developer Hub 应用程序,然后点击 Administration > Extensions
  2. 进入 Installed 选项卡,以查看已安装的插件列表和相关信息。

4.3. 搜索并过滤插件

4.3.1. 根据插件名称搜索

您可以使用标头中的搜索栏来根据名称过滤 Extensions 插件卡。例如,如果您在搜索栏中键入 "A",则 Extensions 仅显示了在 Name 字段中包含字母"A"的插件。

另外,您还可以将搜索栏与过滤器结合使用,以仅根据名称过滤所选过滤器的插件。例如,您可以应用 Category 过滤器,然后在搜索栏中输入字符,以仅查看名称中包含键入字符的 Openshift 插件。

可用的过滤器如下:

  • 类别
  • 作者
  • 支持类型

4.3.2. 插件卡

对于每个插件卡,会显示以下详情:

徽标

定义了以下徽标:

  • 认证红帽:由红帽合作伙伴生成和支持的插件。
  • 经过红帽支持的生产就绪插件
  • 自定义插件:插件由客户创建并添加。

    注意

    如果插件与任何这些定义不匹配,则不会显示徽标。

图标
插件图标(base64)。
Name
插件名称。
作者
如果插件由多个作者开发,则单个作者名称或多个作者名称。
类别
过滤器和标签中显示的类别。这个卡中仅显示一个类别,但在使用 category 过滤器时,将应用您选择的任何其他类别。
简短描述
在卡(文本)中显示的简短描述。
了解更多链接
点击链接以打开插件详情页面。

4.3.3. 插件详情

当您点插件卡上的 Read more 链接时,会显示以下详情:

图标
插件图标(base64)。
Name
插件名称。
作者
如果插件由多个作者开发,则单个作者名称或多个作者名称。
亮点
插件功能列表。
安装按钮
按钮来安装插件(禁用)。
详细描述
插件的完整描述(Markdown)。
links
可点击链接提供有关插件的附加信息。
版本
根据插件的软件包名称,显示插件的名称、版本、角色、支持的版本和安装状态。

例如:

4.4. 删除扩展

Red Hat Developer Hub (RHDH)中预装了扩展功能插件,并默认启用。如果要从 RHDH 实例中删除扩展,您可以禁用相关的插件。

流程

  1. 要禁用扩展功能插件,请使用以下内容编辑 dynamic-plugins.yaml

    dynamic-plugins.yaml 片段

    plugins:
      - package: ./dynamic-plugins/dist/red-hat-developer-hub-backstage-plugin-marketplace
        disabled: true
      - package: ./dynamic-plugins/dist/red-hat-developer-hub-backstage-plugin-catalog-backend-module-marketplace-dynamic
        disabled: true
      - package: ./dynamic-plugins/dist/red-hat-developer-hub-backstage-plugin-marketplace-backend-dynamic
        disabled: true
    Copy to Clipboard Toggle word wrap

注意

如果您禁用 Extensions 功能插件, 目录和 Installed 选项卡也会被删除。您仍然可以通过点 Administration > Extensions 来查看已安装的插件。

法律通告

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat