Red Hat Developer Hub 入门


Red Hat Developer Hub 1.2

Red Hat Customer Content Services

摘要

Red Hat Developer Hub 是一个用于构建开发人员门户的企业级平台。您可以配置和自定义 Developer Hub 实例,以满足您的需要和首选项。

前言

作为开发者,您可以使用 Red Hat Developer Hub 体验简化的开发环境。Red Hat Developer Hub 由集中软件目录驱动,为您的微服务和基础架构提供效率。它使您的产品团队能够在没有任何影响的情况下提供质量代码。

Red Hat Developer Hub 支持

如果您在执行本文档所述的某个流程时遇到问题,请访问红帽客户门户。您可以使用红帽客户门户网站进行以下目的:

第 1 章 Red Hat Developer Hub 概述

Red Hat Developer Hub (Developer Hub)充当专为构建开发人员门户而设计的开放开发人员平台,并基于 backstage 项目。通过开发人员 Hub,工程团队可以访问统一平台,以简化开发流程,并提供各种工具和资源,以便有效地构建高质量的软件。

Developer Hub 的目标是通过以下方式解决与创建和持续开发人员门户相关的困难:

  • 中央化仪表板,用于查看所有可用的开发人员工具和资源,以提高生产力
  • 自助服务功能以及 guardrails,适用于符合企业级最佳实践的云原生应用程序开发
  • 对整个企业的所有开发人员进行适当的安全性和监管

Red Hat Developer Hub 通过提供开发人员体验来简化对内部批准的工具、编程语言以及自助管理门户网站中各种开发人员资源的决策。这种方法有助于加速应用程序开发和维护代码质量,同时促进创新。

第 2 章 Red Hat Developer Hub 的大小要求

Red Hat Developer Hub 的可扩展性需要大量资源分配。下表列出了安装和运行 Red Hat Developer Hub 的大小要求,包括 Developer Hub 应用程序和 Developer Hub 数据库组件。

表 2.1. 运行 Red Hat Developer Hub 的建议大小
组件Red Hat Developer Hub 应用程序Red Hat Developer Hub 数据库

中央处理单元(CPU)

4 vCPU

2 vCPU

内存

16 GB

8 GB

存储大小

2 GB

20 GB

Replicas

2 或以上

3 或以上

第 3 章 Red Hat Developer Hub 支持的配置

本节论述了访问 Red Hat Developer Hub 所需的配置,包括:

  • 自定义应用程序配置
  • Developer Hub 目录的源控制配置

3.1. 在 Red Hat OpenShift Container Platform 中添加自定义应用程序配置文件

要访问 Red Hat Developer Hub,您必须在 Red Hat OpenShift Container Platform 中添加自定义应用程序配置文件。在 OpenShift Container Platform 中,您可以使用以下内容作为基础模板,创建名为 app-config-rhdh 的 ConfigMap:

kind: ConfigMap
apiVersion: v1
metadata:
  name: app-config-rhdh
data:
  app-config-rhdh.yaml: |
    app:
      title: {product}
Copy to Clipboard

您可以使用以下方法之一将自定义应用程序配置文件添加到 OpenShift Container Platform 中:

  • Red Hat Developer Hub Operator
  • Red Hat Developer Hub Helm Chart。

3.1.1. 使用 Helm Chart 将自定义应用程序配置文件添加到 OpenShift Container Platform 中

您可以使用 Red Hat Developer Hub Helm Chart 将自定义应用程序配置文件添加到 OpenShift Container Platform 实例中。

先决条件

  • 您已创建了 Red Hat OpenShift Container Platform 帐户。

流程

  1. 在 OpenShift Container Platform Web 控制台中,选择 ConfigMaps 选项卡。
  2. Create ConfigMap
  3. Create ConfigMap 页面中,选择 Configure via 中的 YAML view 选项,并根据需要更改该文件。
  4. Create
  5. 进入 Helm 选项卡查看 Helm 发行版本列表。
  6. 点击您要使用的 Helm 发行版本的 overflow 菜单,然后选择 Upgrade
  7. 使用 Form viewYAML 视图 来编辑 Helm 配置。

    • 使用 Form view

      1. 展开 Root Schema → Backstage chart schema → Backstage parameters → Extra app 配置文件到内联到命令参数 中
      2. Add Extra app 配置文件以内联到命令参数 链接。
      3. 在以下字段中输入值:

        • configMapRef: app-config-rhdh
        • filename: app-config-rhdh.yaml
      4. 单击 Upgrade
    • 使用 YAML 视图

      1. 设置 upstream.backstage.extraAppConfig.configMapRefupstream.backstage.extraAppConfig.filename 参数的值,如下所示:

        # ... other Red Hat Developer Hub Helm Chart configurations
        upstream:
          backstage:
            extraAppConfig:
              - configMapRef: app-config-rhdh
                filename: app-config-rhdh.yaml
        # ... other Red Hat Developer Hub Helm Chart configurations
        Copy to Clipboard
      2. 单击 Upgrade

3.1.2. 使用 Operator 将自定义应用程序配置文件添加到 OpenShift Container Platform 中

自定义应用程序配置文件是一个 ConfigMap 对象,可用于更改 Red Hat Developer Hub 实例的配置。如果要在 Red Hat OpenShift Container Platform 上部署 Developer Hub 实例,您可以使用 Red Hat Developer Hub Operator 将自定义应用程序配置文件添加到 OpenShift Container Platform 实例,方法是创建 ConfigMap 对象并在 Developer Hub 自定义资源(CR)中引用它。

自定义应用配置文件包含一个名为 BACKEND_SECRET 的敏感环境变量。此变量包含一个强制的后端身份验证密钥,Developer Hub 用来引用 OpenShift Container Platform secret 中定义的环境变量。您必须创建一个名为 'secrets-rhdh' 的 secret,并在 Developer Hub CR 中引用它。

注意

您需要保护 Red Hat Developer Hub 安装不受外部和未授权访问的影响。像管理任何其他机密一样管理后端身份验证密钥。满足强的密码要求,不要在任何配置文件中公开它,仅将其作为环境变量注入配置文件中。

先决条件

  • 您有一个活跃的 Red Hat OpenShift Container Platform 帐户。
  • 您的管理员已在 OpenShift Container Platform 中安装了 Red Hat Developer Hub Operator。如需更多信息,请参阅安装 Red Hat Developer Hub Operator
  • 您已在 OpenShift Container Platform 中创建 Red Hat Developer Hub CR。

流程

  1. 从 OpenShift Container Platform Web 控制台中的 Developer 视角,选择 Topology 视图,然后点击 Developer Hub pod 上的 Open URL 图标来识别 Developer Hub 外部 URL: < RHDH_URL>
  2. 从 OpenShift Container Platform Web 控制台中的 Developer 视角,选择 ConfigMaps 视图。
  3. Create ConfigMap
  4. Configure via 中选择 YAML view 选项,并使用以下示例作为基础模板来创建 ConfigMap 对象,如 app-config-rhdh.yaml

    kind: Backstage
    apiVersion: rhdh.redhat.com/v1alpha1
    metadata:
      name: app-config-rhdh
    data:
      "app-config-rhdh.yaml": |
        app:
          title: Red Hat Developer Hub
          baseUrl: <RHDH_URL> 
    1
    
        backend:
          auth:
            keys:
              - secret: "${BACKEND_SECRET}" 
    2
    
          baseUrl: <RHDH_URL> 
    3
    
          cors:
            origin: <RHDH_URL> 
    4
    Copy to Clipboard
    1
    设置 Red Hat Developer Hub 实例的外部 URL。
    2
    使用环境变量公开 OpenShift Container Platform secret,以定义强制的 Developer Hub 后端身份验证密钥。
    3
    设置 Red Hat Developer Hub 实例的外部 URL。
    4
    设置 Red Hat Developer Hub 实例的外部 URL。
  5. Create
  6. 选择 Secrets 视图。
  7. Create Key/value Secret
  8. 创建名为 secrets-rhdh 的 secret。
  9. 添加名为 BACKEND_SECRET 的键,并将 base64 编码字符串作为值。为每个 Red Hat Developer Hub 实例使用唯一值。例如,您可以使用以下命令从终端生成密钥:

    node -p 'require("crypto").randomBytes(24).toString("base64")'
    Copy to Clipboard
  10. Create
  11. 选择 Topology 视图。
  12. 点您要使用的 Red Hat Developer Hub 实例的 overflow 菜单,然后选择 Edit Backstage 来加载 Red Hat Developer Hub 实例的 YAML 视图。

    Operator 安装 2
  13. 在 CR 中,输入自定义应用程序配置配置映射的名称作为 spec.application.appConfig.configMaps 字段的值,并输入 secret 的名称作为 spec.application.extraEnvs.secrets 字段的值。例如:

    apiVersion: rhdh.redhat.com/v1alpha1
    kind: Backstage
    metadata:
      name: developer-hub
    spec:
      application:
        appConfig:
          mountPath: /opt/app-root/src
          configMaps:
             - name: app-config-rhdh
        extraEnvs:
          secrets:
             - name: secrets-rhdh
        extraFiles:
          mountPath: /opt/app-root/src
        replicas: 1
        route:
          enabled: true
      database:
        enableLocalDb: true
    Copy to Clipboard
  14. 点击 Save
  15. 返回到 Topology 视图,并等待 Red Hat Developer Hub pod 启动。
  16. Open URL 图标使用 Red Hat Developer Hub 平台以及配置更改。

其他资源

3.2. 在 Red Hat Developer Hub 中为目录添加源控制

要填充 Red Hat Developer Hub 中的 Catalog,您需要添加软件模板并添加模板,您必须启用受支持的源控制,如 GitHub。

先决条件

  • 您有一个 GitHub 帐户。
  • 在 Red Hat OpenShift 集群上有一个帐户。
  • 已安装 Developer Hub,否则 GitHub 登录失败。

有关安装的更多信息,请参阅在 OpenShift Container Platform 上安装 Red Hat Developer Hub

3.2.1. 配置 GitHub 身份验证

需要 GitHub 身份验证配置,才能在 Developer Hub 中启用 GitHub OAuth 登录。

流程

  1. 在 Red Hat OpenShift 集群中,导航到您要创建 OAuth 应用程序的 GitHub 机构的主页面。
  2. SettingsDeveloper SettingsOAuth AppsRegister an application
  3. 输入应用程序名称作为 Developer Hub
  4. 将以下 URL 添加为 Homepage URL

    https://developer-hub-<NAMESPACE_NAME>.<OPENSHIFT_ROUTE_HOST>/

  5. 将以下 URL 添加为 授权回调 URL

    https://developer-hub-<NAMESPACE_NAME>.<OPENSHIFT_ROUTE_HOST>/api/auth/github/handler/frame

  6. 清除 Enable Device Flow 复选框。
  7. Register application 创建 OAuth 应用程序。
  8. 创建应用程序后,点 Generate a new client secret 并复制生成的客户端 secret。
  9. 在 OpenShift 中,单击 ConfigMaps
  10. 使用提供的环境变量作为键,生成名为 'github-secrets' 的键/值 secret,然后输入您为 GitHub OAuth 应用程序生成的值:

    1. 在 Red Hat OpenShift 中,进入 Secrets 选项卡,再点 Create
    2. 选择 Key/value secret
    3. 输入 Secret 名称作为 github-secrets
    4. 将环境变量添加为 KeyValue,再单击 Create

      表 3.1. 环境变量
      value

      GITHUB_OAUTH_CLIENT_ID

      来自 OAuth 应用程序的客户端 ID

      GITHUB_OAUTH_CLIENT_SECRET

      OAuth 应用程序的客户端 Secret

  11. 修改 app-config-rhdh ConfigMap 使其包含 GitHub 身份验证配置,如下所示:

    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: app-config-rhdh
    data:
      app-config-rhdh.yaml: |
        app:
          title: Red Hat Developer Hub
        auth:
          # see https://backstage.io/docs/auth/ to learn about auth providers
          environment: development
          providers:
            github:
              development:
                clientId: ${GITHUB_OAUTH_CLIENT_ID}
                clientSecret: ${GITHUB_OAUTH_CLIENT_SECRET}
    Copy to Clipboard
  12. 点击 Save
  13. 进入 Helm 选项卡并选择 Upgrade
  14. 使用以下视图之一编辑 Helm 配置:

    • 使用 Form view

      1. 展开 Root Schema → Backstage Chart Schema → Backstage Parameters → Backstage container 环境变量
      2. 从现有的 Secrets 链接点 Add Backstage 容器环境变量。
      3. 输入 github-secrets 作为值。
      4. 单击 Upgrade
    • 使用 YAML 视图

      1. upstream.backstage.extraEnvVarsSecrets 的值设置为 github-secrets,如下例所示:

        # other Red Hat Developer Hub Helm Chart configurations
        upstream:
          backstage:
            # other Red Hat Developer Hub Helm Chart configurations
            extraEnvVarsSecrets:
              - github-secrets
            # other Red Hat Developer Hub Helm Chart configurations
        Copy to Clipboard
      2. 单击 Upgrade

3.2.2. 配置 GitHub 集成

在 Developer Hub 中启用 GitHub 插件需要配置 GitHub。

流程

  1. 在 Red Hat OpenShift 集群中,导航到您要创建 OAuth 应用程序的 GitHub 机构的主页面。
  2. SettingsDeveloper SettingsGitHub AppsNew GitHub App
  3. 输入应用程序名称作为 Developer Hub
  4. 将以下 URL 添加为 Homepage URL

    https://developer-hub-<NAMESPACE_NAME>.<OPENSHIFT_ROUTE_HOST>/

  5. 将以下 URL 添加为 授权回调 URL

    https://developer-hub-<NAMESPACE_NAME>.<OPENSHIFT_ROUTE_HOST>/api/auth/github/handler/frame

  6. 取消选择 Webhook URLActive
  7. 可以安装此 GitHub 应用程序的位置下,请确保只选择此帐户
  8. 点击 Register application
  9. 创建应用程序后,点 Generate a new client secret 并复制生成的客户端 secret。
  10. 点页面底部的 Generate a私钥 并下载生成的文件。
  11. 在 OpenShift 中,单击 ConfigMaps
  12. 使用提供的环境变量作为键,生成名为 'github-secrets' 的键/值 secret,然后输入您为 GitHub OAuth 应用程序生成的值:

    1. 在 Red Hat OpenShift 中,进入 Secrets 选项卡,再点 Create
    2. 选择 Key/value secret
    3. 输入 Secret 名称作为 github-secrets
    4. 将环境变量添加为 KeyValue,再单击 Create
    表 3.2. 环境变量
    value

    GITHUB_APP_APP_ID

    来自 GitHub 应用程序的应用程序 ID

    GITHUB_APP_CLIENT_ID

    来自 GitHub 应用程序的客户端 ID

    GITHUB_APP_CLIENT_SECRET

    GitHub 应用程序的客户端 Secret

    GITHUB_APP_WEBHOOK_URL

    输入 "none"

    GITHUB_APP_WEBHOOK_SECRET

    输入 "none"

    GITHUB_APP_PRIVATE_KEY

    上传下载的私钥

  13. 修改 app-config-rhdh ConfigMap 使其包含 GitHub 集成配置,如下所示:

    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: app-config-rhdh
    data:
      app-config-rhdh.yaml: |
        app:
          title: Red Hat Developer Hub
        integrations:
          github:
            - host: github.com
              apps:
                - appId: ${GITHUB_APP_APP_ID}
                  clientId: ${GITHUB_APP_CLIENT_ID}
                  clientSecret: ${GITHUB_APP_CLIENT_SECRET}
                  webhookUrl: ${GITHUB_APP_WEBHOOK_URL}
                  webhookSecret: ${GITHUB_APP_WEBHOOK_SECRET}
                  privateKey: |
                    ${GITHUB_APP_PRIVATE_KEY}
    Copy to Clipboard
  14. Toplogydeveloper hubActions (drop-down)→ Restart rollout

3.2.3. 在 Red Hat Developer Hub 中启用 GitHub 发现

您可以为 Developer Hub 中的组件启用 GitHub 发现功能,如包含 catalog-info.yaml 文件的任何存储库。

先决条件

流程

  1. 在 OpenShift Container Platform Web 控制台的 Developer 视角中,进入 Helm 选项卡。
  2. 点 Helm 发行版本的 overflow 菜单并选择 Upgrade
  3. 使用以下视图之一编辑 Helm 配置:

    • 使用 Form view

      1. 展开 Root Schema → global → Dynamic plugins configuration → 在 backstage 应用中安装的动态插件列表
      2. 单击 backstage 应用链接中应安装的动态插件的 Add List
      3. 在要安装的动态插件的 Package 规格中。它应该可以被 npm pack 命令使用。 字段,添加以下值:

        ./dynamic-plugins/dist/backstage-plugin-catalog-backend-module-github-dynamic

        启用 gh discovery
      4. 单击 Upgrade
    • 使用 YAML 视图

      1. global.dynamic.plugins.package 参数的值设置为 ./dynamic-plugins/dist/backstage-plugin-catalog-backend-module-github-dynamic,如下例所示:

        global:
          dynamic:
            # other Red Hat Developer Hub Helm Chart configurations
            plugins:
              - disabled: false
                package: >-
                  ./dynamic-plugins/dist/backstage-plugin-catalog-backend-module-github-dynamic
            # other Red Hat Developer Hub Helm Chart configurations
        Copy to Clipboard
      2. 单击 Upgrade
  4. 在 ConfigMap 中添加以下代码:

    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: app-config-rhdh
    data:
      app-config-rhdh.yaml: |
        ...
          catalog:
            providers:
              github:
                providerId:
                  organization: '${GITHUB_ORG}'
                  schedule:
                    frequency:
                      minutes: 30
                    initialDelay:
                      seconds: 15
                    timeout:
                      minutes: 3
        ...
    Copy to Clipboard

    在前面的代码中,将 ${GITHUB_ORG} 替换为您要发现组件的 GitHub 组织。另外,如果只有一个供应商,可以在 ConfigMap 中添加以下代码:

    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: app-config-rhdh
    data:
      app-config-rhdh.yaml: |
        ...
        catalog:
          providers:
            github:
              organization: ${GITHUB_ORG}
              schedule:
                frequency: { minutes: 1 }
                timeout: { minutes: 1 }
                initialDelay: { seconds: 100 }
        ...
    Copy to Clipboard

    当存在列表时,需要前面的代码中的 providerId 来识别提供程序。

  5. 点击 Save

3.2.4. 在 Red Hat Developer Hub 中启用 GitHub 机构成员发现

您还可以为 GitHub 组织的成员启用 GitHub 发现功能。

先决条件

流程

  1. 在 OpenShift Container Platform Web 控制台的 Developer 视角中,进入 Helm 选项卡。
  2. 点 Helm 发行版本的 overflow 菜单并选择 Upgrade
  3. 使用以下视图之一编辑 Helm 配置:

    • 使用 Form view

      1. 展开 Root Schema → global → Dynamic plugins configuration → 在 backstage 应用中安装的动态插件列表
      2. 单击 backstage 应用链接中应安装的动态插件的 Add List
      3. 在要安装的动态插件的 Package 规格中。它应该可以被 npm pack 命令使用。 字段,添加以下值:

        ./dynamic-plugins/dist/backstage-plugin-catalog-backend-module-github-org-dynamic

        启用 gh 成员发现
      4. 单击 Upgrade
    • 使用 YAML 视图

      1. global.dynamic.plugins.package 参数的值设置为 ./dynamic-plugins/dist/backstage-plugin-catalog-backend-module-github-org-dynamic,如下例所示:

        global:
          dynamic:
            # other Red Hat Developer Hub Helm Chart configurations
            plugins:
              - disabled: false
                package: >-
                  ./dynamic-plugins/dist/backstage-plugin-catalog-backend-module-github-org-dynamic
            # other Red Hat Developer Hub Helm Chart configurations
        Copy to Clipboard
      2. 单击 Upgrade
  4. 在 ConfigMap 中添加以下代码:

    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: app-config-rhdh
    data:
      app-config-rhdh.yaml: |
        ...
        catalog:
          providers:
            githubOrg:
              id: production
              githubUrl: "${GITHUB_URL}"
              orgs: [ "${GITHUB_ORG}" ]
        ...
    Copy to Clipboard

    其中:

    ${GITHUB_URL}
    表示必须替换为 GitHub URL 的变量。
    ${GITHUB_ORG}
    表示必须替换为您要从中嵌套用户的 GitHub 组织的变量。
  5. 点击 Save

第 4 章 自定义 Red Hat Developer Hub 中的主页

要访问 Red Hat Developer Hub 中的 Home 页面,基本 URL 必须包含 /developer-hub 代理。您可以通过将数据作为代理传递给 app-config.yaml 文件来配置 Home 页面。您可以在以下源的 Home 页面中提供数据:

  • 托管在 GitHub 或 GitLab 上的 JSON 文件。
  • 使用 API 以 JSON 格式提供 Home 页面数据的专用服务。

4.1. 使用托管的 JSON 文件向学习路径提供数据

先决条件

已使用 Operator 或 Helm Chart 安装 Red Hat Developer Hub。

如需更多信息,请参阅在 OpenShift Container Platform 上安装 Red Hat Developer Hub

流程

要从 JSON 文件中访问数据,请完成以下步骤:

  • 将以下代码添加到 app-config.yaml 文件中:

    proxy:
      endpoints:
        # Other Proxies
        # customize developer hub instance
        '/developer-hub':
          target: <DOMAIN_URL> # i.e https://raw.githubusercontent.com/
          pathRewrite:
            '^/api/proxy/developer-hub': <path to json file> # i.e /janus-idp/backstage-showcase/main/packages/app/public/homepage/data.json
          changeOrigin: true
          secure: true
          # Change to "false" in case of using self hosted cluster with a self-signed certificate
          headers:
    	<HEADER_KEY>: <HEADER_VALUE> # optional and can be passed as needed i.e Authorization can be passed for private GitHub repo and PRIVATE-TOKEN can be passed for private GitLab repo
    Copy to Clipboard

4.2. 使用专用服务向学习路径提供数据

在使用专用服务时,您可以执行以下操作:

  • 使用相同的服务向所有可配置的 Developer Hub 页面提供数据,或者为每个页面使用不同的服务。
  • 使用 red-hat-developer-hub-customization-provider 作为示例服务,它为 Home 和 Tech Radar 页面提供数据。red-hat-developer-hub-customization-provider 服务提供与默认的 Developer Hub 数据相同的数据。如果需要,您可以从 GitHub 中 fork red-hat-developer-hub-customization-provider 服务存储库,并使用您自己的数据进行修改。
  • 在同一集群中部署 red-hat-developer-hub-customization-provider 服务和 Developer Hub Helm Chart。

先决条件

流程

要使用单独的服务提供 Home 页面数据,请完成以下步骤:

  1. 从 Red Hat OpenShift Container Platform Web 控制台中的 Developer 视角,点 +Add > Import from Git
  2. Git Repo URL 字段中输入 Git 存储库的 URL。

    要使用 red-hat-developer-hub-customization-provider 服务,请添加 red-hat-developer-hub-customization-provider 存储库的 URL 或包含您的自定义的存储库分叉。

  3. General 选项卡中,在 Name 字段中输入 red-hat-developer-hub-customization-provider,然后单击 Create
  4. Advanced Options 选项卡中,从 Target Port 复制值。

    注意

    Target Port 会自动生成 Kubernetes 或 OpenShift Container Platform 服务以与之通信。

  5. 将以下代码添加到 app-config-rhdh.yaml 文件中:

    proxy:
      endpoints:
        # Other Proxies
        # customize developer hub instance
        '/developer-hub':
          target: ${HOMEPAGE_DATA_URL}
          changeOrigin: true
          # Change to "false" in case of using self-hosted cluster with a self-signed certificate
          secure: true
    Copy to Clipboard

    其中 HOMEPAGE_DATA_URL 定义为 http://<SERVICE_NAME>:8080,例如 http://rhdh-customization-provider:8080

    注意

    red-hat-developer-hub-customization-provider 服务默认包含 8080 端口。如果使用自定义端口,您可以使用 app-config-rhdh.yaml 文件中的 'PORT' 环境变量指定它。

  6. 将 URL 添加到 rhdh-secrets 或直接在自定义 ConfigMap 中替换它,替换 HOMEPAGE_DATA_URL
  7. 删除 Developer Hub pod,以确保正确载入新配置。

验证

  • 要查看该服务,请导航到 OpenShift Container Platform Web 控制台中的 Administrator 视角,然后点 Networking > Service

    注意

    您还可以在 Topology 视图中查看 Service Resources

  • 确保 Home 页面提供的 API URL 以 JSON 格式返回数据,如下例所示:

    [
      {
        "title": "Dropdown 1",
        "isExpanded": false,
        "links": [
          {
            "iconUrl": "https://imagehost.com/image.png",
            "label": "Dropdown 1 Item 1",
            "url": "https://example.com/"
          },
          {
            "iconUrl": "https://imagehost2.org/icon.png",
            "label": "Dropdown 1 Item 2",
            "url": ""
          }
        ]
      },
      {
        "title": "Dropdown 2",
        "isExpanded": true,
        "links": [
          {
            "iconUrl": "http://imagehost3.edu/img.jpg",
            "label": "Dropdown 2 Item 1",
            "url": "http://example.com"
          }
        ]
      }
    ]
    Copy to Clipboard
    注意

    如果请求调用失败或没有配置,Developer Hub 实例会回退到默认的本地数据。

  • 如果镜像或图标没有加载,那么通过将您的镜像或图标主机 URL 添加到自定义 ConfigMap 中的内容安全策略(csp) img-src 来列出它们,如下所示:
kind: ConfigMap
apiVersion: v1
metadata:
  name: app-config-rhdh
data:
  app-config-rhdh.yaml: |
    app:
      title: Red Hat Developer Hub
    backend:
      csp:
        connect-src:
          - "'self'"
          - 'http:'
          - 'https:'
        img-src:
          - "'self'"
          - 'data:'
          - <image host url 1>
          - <image host url 2>
          - <image host url 3>
    # Other Configurations
Copy to Clipboard

第 5 章 在 Red Hat Developer Hub 中自定义 Tech Radar 页面

在 Red Hat Developer Hub 中,技术 Radar 页面由 tech-radar 动态插件提供,该插件默认为禁用。有关在 Red Hat Developer Hub 中启用动态插件的详情,请参考 在 Red Hat Developer Hub 中配置插件

在 Red Hat Developer Hub 中,您可以通过将数据作为代理传递给 app-config.yaml 文件来配置学习路径。基础技术 Radar URL 必须包含 /developer-hub/tech-radar 代理。

注意

由于将重叠的 pathRewrite 用于 tech-radar homepage 快速访问代理,因此您必须在创建 主页 配置(^api/proxy/developer-hub/tech-radar)前创建 tech-radar 配置(^/api/proxy/developer-hub)。

有关在 Red Hat Developer Hub 中自定义 Home 页面的更多信息,请参阅 Red Hat Developer Hub 中的自定义 Home 页面

您可以从以下源向 Tech Radar 页面提供数据:

  • 托管在 GitHub 或 GitLab 上的 JSON 文件。
  • 使用 API 以 JSON 格式提供 Tech Radar 数据的专用服务。

5.1. 使用托管 JSON 文件向 Tech Radar 页面提供数据

先决条件

已使用 Operator 或 Helm Chart 安装 Red Hat Developer Hub。如需更多信息,请参阅在 OpenShift Container Platform 上安装 Red Hat Developer Hub

流程

要从 JSON 文件中访问数据,请完成以下步骤:

  • 将以下代码添加到 app-config.yaml 文件中:

    proxy:
      endpoints:
        # Other Proxies
        # customize developer hub instance
        '/developer-hub':
          target: <DOMAIN_URL> # i.e https://raw.githubusercontent.com/
          pathRewrite:
            '^/api/proxy/developer-hub/tech-radar': <path to json file> # i.e /janus-idp/backstage-showcase/main/packages/app/public/tech-radar/data-default.json
    	 '^/api/proxy/developer-hub': <path to json file> # i.e /janus-idp/backstage-showcase/main/packages/app/public/homepage/data.json
          changeOrigin: true
          secure: true
    
          # Change to "false" in case of using self hosted cluster with a self-signed certificate
          headers:
    	<HEADER_KEY>: <HEADER_VALUE> # optional and can be passed as needed i.e Authorization can be passed for private GitHub repo and PRIVATE-TOKEN can be passed for private GitLab repo
    Copy to Clipboard

5.2. 使用专用服务向 Tech Radar 页面提供数据

在使用专用服务时,您可以执行以下操作:

  • 使用相同的服务向所有可配置的 Developer Hub 页面提供数据,或者为每个页面使用不同的服务。
  • 使用 red-hat-developer-hub-customization-provider 作为示例服务,它为 Home 和 Tech Radar 页面提供数据。red-hat-developer-hub-customization-provider 服务提供与默认的 Developer Hub 数据相同的数据。如果需要,您可以从 GitHub 中 fork red-hat-developer-hub-customization-provider 服务存储库,并使用您自己的数据进行修改。
  • 在同一集群中部署 red-hat-developer-hub-customization-provider 服务和 Developer Hub Helm Chart。

先决条件

流程

要使用单独的服务来提供 Tech Radar 数据,请完成以下步骤:

  1. 将以下代码添加到 app-config-rhdh.yaml 文件中:

    proxy:
      endpoints:
        # Other Proxies
        '/developer-hub/tech-radar':
          target: ${TECHRADAR_DATA_URL}
          changeOrigin: true
          # Change to "false" in case of using self hosted cluster with a self-signed certificate
          secure: true
    Copy to Clipboard

    其中 TECHRADAR_DATA_URL 定义为 http://<SERVICE_NAME>/tech-radar,例如 http://rhdh-customization-provider/tech-radar

    注意

    您可以通过将其添加到 rhdh-secrets 或直接将其替换为自定义 ConfigMap 中的值来定义 TECHRADAR_DATA_URL

  2. 删除 Developer Hub pod,以确保正确载入新配置。

第 6 章 在 Red Hat Developer Hub 中自定义学习路径

在 Red Hat Developer Hub 中,您可以通过将数据作为代理传递给 app-config.yaml 文件来配置学习路径。基本 URL 必须包含 /developer-hub/learning-paths 代理。

注意

由于对 learning-path主页快速访问代理使用重叠的 pathRewrites,因此您必须在创建主页 配置(^api/proxy/developer-hub)之前创建 learning-paths 配置(^api/proxy/developer-hub)。

有关在 Red Hat Developer Hub 中自定义 Home 页面的更多信息,请参阅 Red Hat Developer Hub 中的自定义 Home 页面

您可以将数据提供给以下源的学习路径:

  • 托管在 GitHub 或 GitLab 上的 JSON 文件。
  • 使用 API 以 JSON 格式提供学习路径数据的专用服务。

6.1. 使用托管的 JSON 文件向学习路径提供数据

先决条件

已使用 Operator 或 Helm Chart 安装 Red Hat Developer Hub。如需更多信息,请参阅在 OpenShift Container Platform 上安装 Red Hat Developer Hub

流程

要从 JSON 文件中访问数据,请完成以下步骤:

  • 将以下代码添加到 app-config.yaml 文件中:

    proxy:
      endpoints:
        '/developer-hub':
          target: https://raw.githubusercontent.com/
          pathRewrite:
            '^/api/proxy/developer-hub/learning-paths': '/janus-idp/backstage-showcase/main/packages/app/public/learning-paths/data.json'
            '^/api/proxy/developer-hub/tech-radar': '/janus-idp/backstage-showcase/main/packages/app/public/tech-radar/data-default.json'
            '^/api/proxy/developer-hub': '/janus-idp/backstage-showcase/main/packages/app/public/homepage/data.json'
          changeOrigin: true
          secure: true
    Copy to Clipboard

6.2. 使用专用服务向学习路径提供数据

在使用专用服务时,您可以执行以下操作:

  • 使用相同的服务向所有可配置的 Developer Hub 页面提供数据,或者为每个页面使用不同的服务。
  • 使用 red-hat-developer-hub-customization-provider 作为示例服务,它为 Home 和 Tech Radar 页面提供数据。red-hat-developer-hub-customization-provider 服务提供与默认的 Developer Hub 数据相同的数据。如果需要,您可以从 GitHub 中 fork red-hat-developer-hub-customization-provider 服务存储库,并使用您自己的数据进行修改。
  • 在同一集群中部署 red-hat-developer-hub-customization-provider 服务和 Developer Hub Helm Chart。

先决条件

流程

要使用专用服务来提供学习路径数据,请完成以下步骤:

  1. 将以下代码添加到 app-config-rhdh.yaml 文件中:

       proxy:
          endpoints:
            # Other Proxies
            '/developer-hub/learning-paths':
              target: ${LEARNING_PATH_DATA_URL}
              changeOrigin: true
              # Change to "false" in case of using self hosted cluster with a self-signed certificate
              secure: true
    Copy to Clipboard

    其中 LEARNING_PATH_DATA_URL 定义为 http://<SERVICE_NAME>/learning-paths,例如 http://rhdh-customization-provider/learning-paths

    注意

    您可以通过将 LEARNING_PATH_DATA_URL 添加到 rhdh-secrets,或将其替换为自定义 ConfigMap 中的值来定义 LEARNING_PATH_DATA_URL。

  2. 删除 Developer Hub pod,以确保正确载入新配置。

第 7 章 自定义 Red Hat Developer Hub 实例的外观

Red Hat Developer Hub 有以下默认主题配置:

Red Hat Developer Hub 主题
默认主题配置使开发人员门户像一个标准的 Red Hat Developer Hub 实例。如需更多信息,请参阅 第 7.7 节 “默认 Red Hat Developer Hub 主题”
Backstage 主题
使开发人员门户成为标准 Backstage 实例的默认主题配置。如需更多信息,请参阅 第 7.8 节 “默认阶段主题”

您可以通过修改 app-config-rhdh.yaml 文件来更改或禁用特定参数。在 app-config-rhdh.yaml 文件中,您可以自定义常见的主题组件,包括:

  • 公司名称和徽标
  • 字体颜色、大小和样式,以段落、标题、标头和按钮形式
  • 标头颜色、科学和形成
  • 按钮颜色
  • 导航指示器颜色

您还可以从 Developer Hub GUI 自定义一些组件,如主题模式(Light Theme,Dark Theme, 或 Auto)。

7.1. 为 Developer Hub 实例自定义主题模式

注意

在 Developer Hub 中,主题配置用于更改不同 UI 组件的外观和感觉。因此,您可能会注意到不同 UI 组件的更改,如按钮、选项卡、侧边栏、卡和表,以及一些背景颜色和字体更改,用于 RHDH 页面。

您可以为 Developer Hub 实例选择以下主题模式之一:

  • 辅助主题
  • dark 主题
  • auto

默认主题模式是 Auto,它会根据您的系统首选项自动设置 light 或 dark 主题。

先决条件

  • 已登陆到 Developer Hub web 控制台。

流程

  1. 在 Developer Hub web 控制台中点 Settings
  2. Appearance 面板中,单击 LIGHT THEMEDARK THEMEAUTO 以更改主题模式。

    自定义主题模式 1

7.2. 自定义 Developer Hub 实例的品牌徽标

您可以通过配置 app-config-rhdh.yaml 文件 的品牌 部分来自定义 Developer Hub 实例的品牌徽标,如下例所示:

app:
  branding:
    fullLogo: ${BASE64_EMBEDDED_FULL_LOGO} 
1

    iconLogo: ${BASE64_EMBEDDED_ICON_LOGO} 
2
Copy to Clipboard

其中:

1
fullLogo 是展开的(固定)侧栏上的徽标,需要采用 base64 编码的图像。
2
iconLogo 是折叠(未固定)边栏上的徽标,需要一个 base64 编码的图像。

您还可以通过为品牌部分中的 fullLogoWidth 字段设置值来自定义 品牌 徽标的宽度,如下例所示:

app:
  branding:
    fullLogoWidth: 110px 
1

# ...
Copy to Clipboard
1
徽标宽度的默认值为 110px。支持以下单位: 整数,px,em,rem, , percentage.

7.3. 为 Developer Hub 实例自定义应用程序标题

您可以通过为 title 字段设置值来自定义应用程序 标题 文本,如下例所示:

app:
  title: My custom developer hub
# ...
Copy to Clipboard

7.4. 为您的 Developer Hub 实例自定义主题模式颜色面板

您可以通过配置 app-config-rhdh.yaml 文件的 branding.palette 部分的 light.palettedark.palette 参数来自定义 Developer Hub 实例中 light 和 dark theme 模式的颜色面板,如下例所示:

app:
  branding:
    theme:
      light:
        palette:
          primary:
            main: <light_primary_color> 
1

          navigation:
            indicator: <light_indicator_color> 
2

        pageTheme:
          default:
            backgroundColor: [<light_background_color_1>, <light_background_color_2>] 
3

      dark:
        palette:
          primary:
            main: <dark_primary_color> 
4

          navigation:
            indicator: <dark_indicator_color> 
5

        pageTheme:
          default:
            backgroundColor: [<dark_background_color_1>, <dark_background_color_2>] 
6

# ...
Copy to Clipboard
1
light color palette 的主要颜色,例如:": ffffffwhite
2
light color palette 的导航指示符颜色,它是一个垂直栏,它表示导航面板中的所选标签页,如 #FF0000red
3
light color palette 的默认页面主题的背景颜色,例如:": ffffffwhite
4
dark color palette 的主要颜色,例如: #000000black
5
dark color palette 的导航指示符颜色,它是一个垂直栏,代表导航面板中的所选标签页,例如 #FF0000red
6
dark color palette 的默认页面主题的背景颜色,例如 #000000black

7.5. 为 Developer Hub 实例自定义页面主题标头

您可以通过修改 app-config-rhdh.yaml 文件的 branding.theme 部分来自定义 Developer Hub 实例中 light 和 dark 的标头颜色。您还可以为其他 Developer Hub 页面自定义页面标头,如 HomeCatalogAPI 页面。

app:
  branding:
    theme:
      light: 
1

        palette: {}
        pageTheme:
          default: 
2

            backgroundColor: "<default_light_background_color>" 
3

            fontColor: "<default_light_font_color>" 
4

            shape: none 
5

          apis: 
6

            backgroundColor: "<apis_light_background_color>"
            fontColor: "<apis_light_font_color>"
            shape: none
      dark:
        palette: {}
        pageTheme:
          default:
            backgroundColor: "<default_dark_background_color>"
            fontColor: "<default_dark_font_color>"
            shape: none
# ...
Copy to Clipboard
1
me 模式,如 lightdark
2
主题配置的默认页面的 yaml 标头
3
页面标头背景的颜色,如 #ffffffwhite
4
页面标头中文本颜色,如 #000000black
5
页面标头中的模式,如 waveround、或 none
6
特定页面主题配置的 yaml 标头,如 apishome

7.6. 为 Developer Hub 实例自定义字体

您可以配置 app-config-rhdh.yaml 文件的 typography 部分,以更改页面文本的默认字体系列和大小,以及每个标题级别的字体系列和大小,如下例所示:

app:
  branding:
    theme:
      light:
        typography:
          fontFamily: "Times New Roman"
          htmlFontSize: 11 # smaller is bigger
          h1:
            fontFamily: "Times New Roman"
            fontSize: 40
          h2:
            fontFamily: "Times New Roman"
            fontSize: 30
          h3:
            fontFamily: "Times New Roman"
            fontSize: 30
          h4:
            fontFamily: "Times New Roman"
            fontSize: 30
          h5:
            fontFamily: "Times New Roman"
            fontSize: 30
          h6:
            fontFamily: "Times New Roman"
            fontSize: 30
      dark:
        typography:
          fontFamily: "Times New Roman"
          htmlFontSize: 11 # smaller is bigger
          h1:
            fontFamily: "Times New Roman"
            fontSize: 40
          h2:
            fontFamily: "Times New Roman"
            fontSize: 30
          h3:
            fontFamily: "Times New Roman"
            fontSize: 30
          h4:
            fontFamily: "Times New Roman"
            fontSize: 30
          h5:
            fontFamily: "Times New Roman"
            fontSize: 30
          h6:
            fontFamily: "Times New Roman"
            fontSize: 30
# ...
Copy to Clipboard

7.7. 默认 Red Hat Developer Hub 主题

您可以使用默认的 Red Hat Developer Hub 主题配置使 Developer Hub 实例类似于标准的 Red Hat Developer Hub 实例。您还可以修改 app-config-rhdh.yaml 文件以自定义或禁用特定参数。

7.7.1. 默认 Red Hat Developer Hub 主题颜色面板

app-config-rhdh.yaml 文件对默认的 Red Hat Developer Hub 颜色面板使用以下配置:

app:
  branding:
    theme:
      light:
        variant: "rhdh"
        mode: "light"
        palette:
          background:
            default: "#F8F8F8"
            paper: "#FFFFFF"
          banner:
            closeButtonColor: "#FFFFFF"
            error: "#E22134"
            info: "#2E77D0"
            link: "#000000"
            text: "#FFFFFF"
            warning: "#FF9800"
          border: "#E6E6E6"
          bursts:
            backgroundColor:
              default: "#7C3699"
            fontColor: "#FEFEFE"
            gradient:
              linear: "linear-gradient(-137deg, #4BB8A5 0%, #187656 100%)"
            slackChannelText: "#ddd"
          errorBackground: "#FFEBEE"
          errorText: "#CA001B"
          gold: "#FFD600"
          highlight: "#FFFBCC"
          infoBackground: "#ebf5ff"
          infoText: "#004e8a"
          link: "#0A6EBE"
          linkHover: "#2196F3"
          mode: "light"
          navigation:
            background: "#222427"
            indicator: "#0066CC"
            color: "#ffffff"
            selectedColor: "#ffffff"
            navItem:
              hoverBackground: "#3c3f42"
            submenu:
              background: "#222427"
          pinSidebarButton:
            background: "#BDBDBD"
            icon: "#181818"
          primary:
            main: "#0066CC"
          secondary:
            main: "#8476D1"
          status:
            aborted: "#757575"
            error: "#E22134"
            ok: "#1DB954"
            pending: "#FFED51"
            running: "#1F5493"
            warning: "#FF9800"
          tabbar:
            indicator: "#9BF0E1"
          textContrast: "#000000"
          textSubtle: "#6E6E6E"
          textVerySubtle: "#DDD"
          warningBackground: "#F59B23"
          warningText: "#000000"
          text:
            primary: "#151515"
            secondary: "#757575"
          rhdh:
            general:
              disabledBackground: "#D2D2D2"
              disabled: "#6A6E73"
              searchBarBorderColor: "#E4E4E4"
              formControlBackgroundColor: "#FFF"
              mainSectionBackgroundColor: "#FFF"
              headerBottomBorderColor: "#C7C7C7"
              cardBackgroundColor: "#FFF"
              sideBarBackgroundColor: "#212427"
              cardBorderColor: "#C7C7C7"
              tableTitleColor: "#181818"
              tableSubtitleColor: "#616161"
              tableColumnTitleColor: "#151515"
              tableRowHover: "#F5F5F5"
              tableBorderColor: "#E0E0E0"
              tableBackgroundColor: "#FFF"
              tabsBottomBorderColor: "#D2D2D2"
              contrastText: "#FFF"
            primary:
              main: "#0066CC"
              focusVisibleBorder: "#0066CC"
            secondary:
              main: "#8476D1"
              focusVisibleBorder: "#8476D1"
            cards:
              headerTextColor: "#151515"
              headerBackgroundColor: "#FFF"
              headerBackgroundImage: "none"

      dark:
        variant: "rhdh"
        mode: "dark"
        palette:
          background:
            default: "#333333"
            paper: "#424242"
          banner:
            closeButtonColor: "#FFFFFF"
            error: "#E22134"
            info: "#2E77D0"
            link: "#000000"
            text: "#FFFFFF"
            warning: "#FF9800"
          border: "#E6E6E6"
          bursts:
            backgroundColor:
              default: "#7C3699"
            fontColor: "#FEFEFE"
            gradient:
              linear: "linear-gradient(-137deg, #4BB8A5 0%, #187656 100%)"
            slackChannelText: "#ddd"
          errorBackground: "#FFEBEE"
          errorText: "#CA001B"
          gold: "#FFD600"
          highlight: "#FFFBCC"
          infoBackground: "#ebf5ff"
          infoText: "#004e8a"
          link: "#9CC9FF"
          linkHover: "#82BAFD"
          mode: "dark"
          navigation:
            background: "#0f1214"
            indicator: "#0066CC"
            color: "#ffffff"
            selectedColor: "#ffffff"
            navItem:
              hoverBackground: "#3c3f42"
            submenu:
              background: "#0f1214"
          pinSidebarButton:
            background: "#BDBDBD"
            icon: "#404040"
          primary:
            main: "#1FA7F8"
          secondary:
            main: "#B2A3FF"
          status:
            aborted: "#9E9E9E"
            error: "#F84C55"
            ok: "#71CF88"
            pending: "#FEF071"
            running: "#3488E3"
            warning: "#FFB84D"
          tabbar:
            indicator: "#9BF0E1"
          textContrast: "#FFFFFF"
          textSubtle: "#CCCCCC"
          textVerySubtle: "#727272"
          warningBackground: "#F59B23"
          warningText: "#000000"

          rhdh:
            general:
              disabledBackground: "#444548"
              disabled: "#AAABAC"
              searchBarBorderColor: "#57585a"
              formControlBackgroundColor: "#36373A"
              mainSectionBackgroundColor: "#0f1214"
              headerBottomBorderColor: "#A3A3A3"
              cardBackgroundColor: "#292929"
              sideBarBackgroundColor: "#1b1d21"
              cardBorderColor: "#A3A3A3"
              tableTitleColor: "#E0E0E0"
              tableSubtitleColor: "#E0E0E0"
              tableColumnTitleColor: "#E0E0E0"
              tableRowHover: "#0f1214"
              tableBorderColor: "#515151"
              tableBackgroundColor: "#1b1d21"
              tabsBottomBorderColor: "#444548"
              contrastText: "#FFF"
            primary:
              main: "#1FA7F8"
              focusVisibleBorder: "#ADD6FF"
            secondary:
              main: "#B2A3FF"
              focusVisibleBorder: "#D0C7FF"
            cards:
              headerTextColor: "#FFF"
              headerBackgroundColor: "#0f1214"
              headerBackgroundImage: "none"
Copy to Clipboard

另外,您可以使用 app-config-rhdh.yaml 文件中的以下 变体 和模式 值应用以前的默认配置:

app:
  branding:
    theme:
      light:
        variant: "rhdh"
        mode: "light"
      dark:
        variant: "rhdh"
        mode: "dark"
Copy to Clipboard

7.7.2. 默认 Red Hat Developer Hub 页主题

默认 Developer Hub 标头颜色在 light mode 和 black in dark 模式中是白色的,如以下 app-config-rhdh.yaml 文件配置中所示:

app:
  branding:
    theme:
      light:
        palette: {}
        defaultPageTheme: default
        pageTheme:
          default:
            backgroundColor: "#ffffff"
      dark:
        palette: {}
        defaultPageTheme: default
        pageTheme:
          default:
            backgroundColor: "#0f1214"
Copy to Clipboard

7.8. 默认阶段主题

您可以使用默认的 Backstage 主题配置使 Developer Hub 实例类似于标准 Backstage 实例。您还可以修改 app-config-rhdh.yaml 文件以自定义或禁用特定参数。

7.8.1. 默认回阶段主题颜色面板

app-config-rhdh.yaml 文件对默认的 Backstage color palette 使用以下配置:

app:
  branding:
    theme:
      light:
        variant: "backstage"
        mode: "light"
        palette:
          background:
            default: "#F8F8F8"
            paper: "#FFFFFF"
          banner:
            closeButtonColor: "#FFFFFF"
            error: "#E22134"
            info: "#2E77D0"
            link: "#000000"
            text: "#FFFFFF"
            warning: "#FF9800"
          border: "#E6E6E6"
          bursts:
            backgroundColor:
              default: "#7C3699"
            fontColor: "#FEFEFE"
            gradient:
              linear: "linear-gradient(-137deg, #4BB8A5 0%, #187656 100%)"
            slackChannelText: "#ddd"
          errorBackground: "#FFEBEE"
          errorText: "#CA001B"
          gold: "#FFD600"
          highlight: "#FFFBCC"
          infoBackground: "#ebf5ff"
          infoText: "#004e8a"
          link: "#0A6EBE"
          linkHover: "#2196F3"
          navigation:
            background: "#171717"
            color: "#b5b5b5"
            indicator: "#9BF0E1"
            navItem:
              hoverBackground: "#404040"
            selectedColor: "#FFF"
            submenu:
              background: "#404040"
          pinSidebarButton:
            background: "#BDBDBD"
            icon: "#181818"
          primary:
            main: "#1F5493"
          status:
            aborted: "#757575"
            error: "#E22134"
            ok: "#1DB954"
            pending: "#FFED51"
            running: "#1F5493"
            warning: "#FF9800"
          tabbar:
            indicator: "#9BF0E1"
          textContrast: "#000000"
          textSubtle: "#6E6E6E"
          textVerySubtle: "#DDD"
          warningBackground: "#F59B23"
          warningText: "#000000"

      dark:
        variant: "backstage"
        mode: "dark"
        palette:
          background:
            default: "#333333"
            paper: "#424242"
          banner:
            closeButtonColor: "#FFFFFF"
            error: "#E22134"
            info: "#2E77D0"
            link: "#000000"
            text: "#FFFFFF"
            warning: "#FF9800"
          border: "#E6E6E6"
          bursts:
            backgroundColor:
              default: "#7C3699"
            fontColor: "#FEFEFE"
            gradient:
              linear: "linear-gradient(-137deg, #4BB8A5 0%, #187656 100%)"
            slackChannelText: "#ddd"
          errorBackground: "#FFEBEE"
          errorText: "#CA001B"
          gold: "#FFD600"
          highlight: "#FFFBCC"
          infoBackground: "#ebf5ff"
          infoText: "#004e8a"
          link: "#9CC9FF"
          linkHover: "#82BAFD"
          mode: "dark"
          navigation:
            background: "#424242"
            color: "#b5b5b5"
            indicator: "#9BF0E1"
            navItem:
              hoverBackground: "#404040"
            selectedColor: "#FFF"
            submenu:
              background: "#404040"
          pinSidebarButton:
            background: "#BDBDBD"
            icon: "#404040"
          primary:
            dark: "#82BAFD"
            main: "#9CC9FF"
          secondary:
            main: "#FF88B2"
          status:
            aborted: "#9E9E9E"
            error: "#F84C55"
            ok: "#71CF88"
            pending: "#FEF071"
            running: "#3488E3"
            warning: "#FFB84D"
          tabbar:
            indicator: "#9BF0E1"
          textContrast: "#FFFFFF"
          textSubtle: "#CCCCCC"
          textVerySubtle: "#727272"
          warningBackground: "#F59B23"
          warningText: "#000000"
Copy to Clipboard

另外,您可以使用 app-config-rhdh.yaml 文件中的以下 变体 和模式 值应用以前的默认配置:

app:
  branding:
    theme:
      light:
        variant: "backstage"
        mode: "light"
      dark:
        variant: "backstage"
        mode: "dark"
Copy to Clipboard

7.8.2. 默认 Backstage 页主题

默认的 Backstage 标头颜色在 light mode 和 black in dark 模式中是白色的,如以下 app-config-rhdh.yaml 文件配置中所示:

app:
  branding:
    theme:
      light:
        palette: {}
        defaultPageTheme: default
        pageTheme:
          default:
            backgroundColor: ['#005B4B'] # teal
            fontColor: '#ffffff'
            shape: wave
          documentation:
            backgroundColor: ['#C8077A', '#C2297D'] # pinkSea
            fontColor: '#ffffff'
            shape: wave2
          tool:
            backgroundColor: ['#8912CA', '#3E00EA'] # purpleSky
            fontColor: '#ffffff'
            shape: round
          service:
            backgroundColor: ['#006D8F', '#0049A1'] # marineBlue
            fontColor: '#ffffff'
            shape: wave
          website:
            backgroundColor: ['#0027AF', '#270094'] # veryBlue
            fontColor: '#ffffff'
            shape: wave
          library:
            backgroundColor: ['#98002B', '#8D1134'] # rubyRed
            fontColor: '#ffffff'
            shape: wave
          other:
            backgroundColor: ['#171717', '#383838'] # darkGrey
            fontColor: '#ffffff'
            shape: wave
          app:
            backgroundColor: ['#BE2200', '#A41D00'] # toastyOrange
            fontColor: '#ffffff'
            shape: shapes.wave
          apis:
            backgroundColor: ['#005B4B'] # teal
            fontColor: '#ffffff'
            shape: wave2
          card:
            backgroundColor: ['#4BB8A5', '#187656'] # greens
            fontColor: '#ffffff'
            shape: wave

      dark:
        palette: {}
        defaultPageTheme: default
        pageTheme:
          default:
            backgroundColor: ['#005B4B'] # teal
            fontColor: '#ffffff'
            shape: wave
          documentation:
            backgroundColor: ['#C8077A', '#C2297D'] # pinkSea
            fontColor: '#ffffff'
            shape: wave2
          tool:
            backgroundColor: ['#8912CA', '#3E00EA'] # purpleSky
            fontColor: '#ffffff'
            shape: round
          service:
            backgroundColor: ['#006D8F', '#0049A1'] # marineBlue
            fontColor: '#ffffff'
            shape: wave
          website:
            backgroundColor: ['#0027AF', '#270094'] # veryBlue
            fontColor: '#ffffff'
            shape: wave
          library:
            backgroundColor: ['#98002B', '#8D1134'] # rubyRed
            fontColor: '#ffffff'
            shape: wave
          other:
            backgroundColor: ['#171717', '#383838'] # darkGrey
            fontColor: '#ffffff'
            shape: wave
          app:
            backgroundColor: ['#BE2200', '#A41D00'] # toastyOrange
            fontColor: '#ffffff'
            shape: shapes.wave
          apis:
            backgroundColor: ['#005B4B'] # teal
            fontColor: '#ffffff'
            shape: wave2
          card:
            backgroundColor: ['#4BB8A5', '#187656'] # greens
            fontColor: '#ffffff'
            shape: wave
Copy to Clipboard

7.9. Developer Hub 实例的自定义组件选项

您可以使用两个组件变体来自定义 Developer Hub 的不同组件:

  • PatternFly
  • MUI

除了在 light 或dark theme 模式配置中为每个参数分配组件变体外,您还可以切换 rippleEffectoff

以下代码显示了您可以在 app-config-rhdh.yaml 文件中使用的选项来为 Developer Hub 实例配置主题组件:

app:
  branding:
    theme:
      light:
        options:
          rippleEffect: off / on
          paper: patternfly / mui
          buttons: patternfly / mui
          inputs: patternfly / mui
          accordions: patternfly / mui
          sidebars: patternfly / mui
          pages: patternfly / mui
          headers: patternfly / mui
          toolbars: patternfly / mui
          dialogs: patternfly / mui
          cards: patternfly / mui
          tables: patternfly / mui
          tabs: patternfly / mui
      dark:
        options:
          rippleEffect: off / on
          paper: patternfly / mui
          buttons: patternfly / mui
          inputs: patternfly / mui
          accordions: patternfly / mui
          sidebars: patternfly / mui
          pages: patternfly / mui
          headers: patternfly / mui
          toolbars: patternfly / mui
          dialogs: patternfly / mui
          cards: patternfly / mui
          tables: patternfly / mui
          tabs: patternfly / mui
Copy to Clipboard

第 8 章 Red Hat Developer Hub 中的 ServiceNow Custom 操作

重要

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

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

在 Red Hat Developer Hub 中,您可以访问 ServiceNow 自定义操作(自定义操作),以便在目录中获取和注册资源。

Developer Hub 中的自定义操作可让您促进和自动化记录管理。使用自定义操作,您可以执行以下操作:

  • 创建、更新或删除记录
  • 检索有关单个记录或多个记录的信息

8.1. 在 Red Hat Developer Hub 中启用 ServiceNow 自定义操作插件

在 Red Hat Developer Hub 中,ServiceNow 自定义操作作为预加载插件提供,该插件默认为禁用。您可以按照以下流程启用自定义操作插件。

先决条件

流程

  1. 要激活自定义操作插件,请使用插件名称 添加软件包,并更新 Helm Chart 中的 disabled 字段,如下所示:

    global:
      dynamic:
        includes:
          - dynamic-plugins.default.yaml
        plugins:
          - package: ./dynamic-plugins/dist/janus-idp-backstage-scaffolder-backend-module-servicenow-dynamic
            disabled: false
    Copy to Clipboard
    注意

    插件的默认配置从 dynamic-plugins.default.yaml 文件中提取,但您可以使用 pluginConfig 条目来覆盖默认配置。

  2. 在 Helm Chart 中设置以下变量来访问自定义操作:

    servicenow:
      # The base url of the ServiceNow instance.
      baseUrl: ${SERVICENOW_BASE_URL}
      # The username to use for authentication.
      username: ${SERVICENOW_USERNAME}
      # The password to use for authentication.
      password: ${SERVICENOW_PASSWORD}
    Copy to Clipboard

8.2. Red Hat Developer Hub 中支持的 ServiceNow 自定义操作

ServiceNow 自定义操作可让您管理 Red Hat Developer Hub 中的记录。自定义操作支持以下 API 请求的 HTTP 方法:

  • GET: 从指定资源端点检索指定信息
  • POST :创建或更新资源
  • PUT :修改资源
  • PATCH :更新资源
  • DELETE :删除资源

8.2.1. ServiceNow 自定义操作

[GET] servicenow:now:table:retrieveRecord

从 Developer Hub 中的表检索指定记录的信息。

表 8.1. 输入参数
Name类型要求描述

tableName

string

必填

要从中检索记录的表名称

sysId

string

必填

要检索的记录的唯一标识符

sysparmDisplayValue

enum("true", "false", "all")

选填

返回字段显示值,如 true,实际值为 false,或两者。默认值为 false

sysparmExcludeReferenceLink

布尔值

选填

设置为 true 以排除参考字段的 Table API 链接。默认值为 false

sysparmFields

string[]

选填

响应中返回的字段数组

sysparmView

string

选填

根据指定的 UI 视图呈现响应。您可以使用 sysparm_fields 覆盖此参数。

sysparmQueryNoDomain

布尔值

选填

如果授权,则设置为 true 以访问跨域的数据。默认值为 false

表 8.2. 输出参数
Name类型描述

result

record<PropertyKey, unknown>

请求的响应正文

[GET] servicenow:now:table:retrieveRecords

从 Developer Hub 中的表检索有关多个记录的信息。

表 8.3. 输入参数
Name类型要求描述

tableName

string

必填

要从中检索记录的表名称

sysparamQuery

string

选填

用于过滤结果的编码查询字符串

sysparmDisplayValue

enum("true", "false", "all")

选填

返回字段显示值,如 true,实际值为 false,或两者。默认值为 false

sysparmExcludeReferenceLink

布尔值

选填

设置为 true 以排除参考字段的 Table API 链接。默认值为 false

sysparmSuppressPaginationHeader

布尔值

选填

设置为 true 以阻止分页标头。默认值为 false

sysparmFields

string[]

选填

响应中返回的字段数组

sysparmLimit

int

选填

每页返回的最大结果数。默认值为 10,000

sysparmView

string

选填

根据指定的 UI 视图呈现响应。您可以使用 sysparm_fields 覆盖此参数。

sysparmQueryCategory

string

选填

用于查询的查询类别的名称

sysparmQueryNoDomain

布尔值

选填

如果授权,则设置为 true 以访问跨域的数据。默认值为 false

sysparmNoCount

布尔值

选填

不要在表上执行 select count DomainMapping。默认值为 false

表 8.4. 输出参数
Name类型描述

result

record<PropertyKey, unknown>

请求的响应正文

[POST] servicenow:now:table:createRecord

在 Developer Hub 的表中创建记录。

表 8.5. 输入参数
Name类型要求描述

tableName

string

必填

要保存记录的表的名称

requestBody

record<PropertyKey, unknown>

选填

在指定记录中定义的每个参数的字段名称和关联的值

sysparmDisplayValue

enum("true", "false", "all")

选填

返回字段显示值,如 true,实际值为 false,或两者。默认值为 false

sysparmExcludeReferenceLink

布尔值

选填

设置为 true 以排除参考字段的 Table API 链接。默认值为 false

sysparmFields

string[]

选填

响应中返回的字段数组

sysparmInputDisplayValue

布尔值

选填

使用其显示值(如 true 或实际值)设置字段值,如 false。默认值为 false

sysparmSuppressAutoSysField

布尔值

选填

设置为 true,以禁止自动生成系统字段。默认值为 false

sysparmView

string

选填

根据指定的 UI 视图呈现响应。您可以使用 sysparm_fields 覆盖此参数。

表 8.6. 输出参数
Name类型描述

result

record<PropertyKey, unknown>

请求的响应正文

[PUT] servicenow:now:table:modifyRecord

修改 Developer Hub 中表中的记录。

表 8.7. 输入参数
Name类型要求描述

tableName

string

必填

要从中修改记录的表名称

sysId

string

必填

要修改的记录的唯一标识符

requestBody

record<PropertyKey, unknown>

选填

在指定记录中定义的每个参数的字段名称和关联的值

sysparmDisplayValue

enum("true", "false", "all")

选填

返回字段显示值,如 true,实际值为 false,或两者。默认值为 false

sysparmExcludeReferenceLink

布尔值

选填

设置为 true 以排除参考字段的 Table API 链接。默认值为 false

sysparmFields

string[]

选填

响应中返回的字段数组

sysparmInputDisplayValue

布尔值

选填

使用其显示值(如 true 或实际值)设置字段值,如 false。默认值为 false

sysparmSuppressAutoSysField

布尔值

选填

设置为 true,以禁止自动生成系统字段。默认值为 false

sysparmView

string

选填

根据指定的 UI 视图呈现响应。您可以使用 sysparm_fields 覆盖此参数。

sysparmQueryNoDomain

布尔值

选填

如果授权,则设置为 true 以访问跨域的数据。默认值为 false

表 8.8. 输出参数
Name类型描述

result

record<PropertyKey, unknown>

请求的响应正文

[PATCH] 服务现在:now:table:updateRecord

更新 Developer Hub 中的表中的记录。

表 8.9. 输入参数
Name类型要求描述

tableName

string

必填

要更新记录的表的名称

sysId

string

必填

要更新的记录的唯一标识符

requestBody

record<PropertyKey, unknown>

选填

在指定记录中定义的每个参数的字段名称和关联的值

sysparmDisplayValue

enum("true", "false", "all")

选填

返回字段显示值,如 true,实际值为 false,或两者。默认值为 false

sysparmExcludeReferenceLink

布尔值

选填

设置为 true 以排除参考字段的 Table API 链接。默认值为 false

sysparmFields

string[]

选填

响应中返回的字段数组

sysparmInputDisplayValue

布尔值

选填

使用其显示值(如 true 或实际值)设置字段值,如 false。默认值为 false

sysparmSuppressAutoSysField

布尔值

选填

设置为 true,以禁止自动生成系统字段。默认值为 false

sysparmView

string

选填

根据指定的 UI 视图呈现响应。您可以使用 sysparm_fields 覆盖此参数。

sysparmQueryNoDomain

布尔值

选填

如果授权,则设置为 true 以访问跨域的数据。默认值为 false

表 8.10. 输出参数
Name类型描述

result

record<PropertyKey, unknown>

请求的响应正文

[DELETE] servicenow:now:table:deleteRecord

从 Developer Hub 中的表中删除记录。

表 8.11. 输入参数
Name类型要求描述

tableName

string

必填

从中删除记录的表名称

sysId

string

必填

要删除的记录的唯一标识符

sysparmQueryNoDomain

布尔值

选填

如果授权,则设置为 true 以访问跨域的数据。默认值为 false

第 9 章 Red Hat Developer Hub 中的审计日志

审计日志是记录用户活动、系统事件和数据更改的记录集,影响您的 Red Hat Developer Hub 用户、管理员或组件。管理员可以查看 OpenShift Container Platform Web 控制台中的 Developer Hub 审计日志,以监控构建器事件、对 RBAC 系统的更改,以及对 Catalog 数据库的更改。审计日志包括以下信息:

  • 审计事件的名称
  • 触发审计事件的操作者,如终端、端口、IP 地址或主机名
  • 事件元数据,如日期、时间
  • 事件状态,如 成功失败
  • 严重性级别,如 infodebugwarnerror

您可以使用审计日志中的信息来实现以下目标:

增强安全性
跟踪活动,包括由自动化系统和软件模板启动到其源的活动。了解何时执行软件模板,以及应用程序和组件安装、更新、配置更改和删除的详细信息。
自动化合规性
使用简化的流程查看指定时间点的日志数据,以满足审计目的或持续合规维护。
调试问题
使用访问记录和活动详情来修复软件模板或插件的问题。
注意

默认情况下,审计日志不会转发到内部日志存储,因为这不提供安全存储。您需要自己确保转发审计日志的系统符合您所在机构及政府的相关要求,并具有适当的安全性。

9.1. 在 OpenShift Container Platform 上为 Developer Hub 配置审计日志

使用 OpenShift Container Platform Web 控制台将以下 OpenShift Container Platform 日志记录组件配置为使用 Developer Hub 的审计日志记录:

日志记录部署
配置日志记录环境,包括每个日志记录组件的 CPU 和内存限值。如需更多信息,请参阅 Red Hat OpenShift Container Platform - 配置日志记录部署
日志记录收集器
配置 ClusterLogging 自定义资源(CR)中的 spec.collection 小节,以使用支持的对日志收集器的修改,并从 STDOUT 收集日志。如需更多信息,请参阅 Red Hat OpenShift Container Platform - 配置日志记录收集器
日志转发
通过在 ClusterLogForwarder CR 中指定输出和管道的组合,将日志发送到 OpenShift Container Platform 集群内部和外部的特定端点。如需更多信息,请参阅 Red Hat OpenShift Container Platform - 启用 JSON 日志转发Red Hat OpenShift Container Platform - 配置日志转发

9.2. 在 Developer Hub 中查看审计日志

管理员可以从 Red Hat OpenShift Container Platform Web 控制台查看、搜索、过滤和管理日志数据。您可以使用 isAuditLog 字段过滤其他日志类型的审计日志。

先决条件

  • 在 OpenShift Container Platform Web 控制台中以管理员身份登录。

流程

  1. 从 OpenShift Container Platform Web 控制台的 Developer 视角中,点 Topology 选项卡。
  2. Topology 视图中,点击您要查看审计日志数据的 pod。
  3. 在 pod 面板中点 Resources 选项卡。
  4. Resources 选项卡的 Pods 部分中,单击 View logs
  5. Logs 视图中,在 Search 字段中输入 isAuditLog,以过滤来自其他日志类型的审计日志。您可以使用箭头浏览包含 isAuditLog 字段的日志。

9.2.1. 审计日志字段

Developer Hub 审计日志可以包括以下字段:

eventName
审计事件的名称。
行动者

包含触发审计事件的操作者信息的对象。包含以下字段:

actorId
关联的用户或服务的 name/id/entityRef。如果未经身份验证的用户访问端点并禁用默认的验证策略,则可以是 null
ip
行动者的 IP 地址(可选)。
hostname
操作者的主机名(可选)。
client
行动者的用户代理(可选)。
stage
生成审计日志时事件的阶段,如启动 或完成
status
事件的状态,如 成功或失败
meta
包含事件特定数据的可选对象,如 taskId
Request (请求)

可选字段,其中包含发送到端点的 HTTP 请求信息。包含以下字段:

方法
请求的 HTTP 方法。
query
请求的 查询 字段。
params
请求的 params 字段。
正文(body)
请求正文。创建任务时提供的 secret 被重新设计,显示为 *
url
请求的端点 URL。
响应

可选字段,其中包含从端点发送的 HTTP 响应的信息。包含以下字段:

status
HTTP 响应的状态代码。
正文(body)
请求正文的内容。
isAuditLog
设置为 true 的标志,用于将审计日志与其他日志类型区分开。
errors
包含 名称消息 以及错误 堆栈 字段的错误列表。只有当 状态 失败 时才会出现。

9.2.2. Scaffolder 事件

Developer Hub 审计日志可以包括以下 scaffolder 事件:

ScaffolderParameterSchemaFetch
跟踪对 /v2/templates/:namespace/:kind/:name/parameter-schema 端点的 GET 请求,该端点返回模板参数 schema
ScaffolderInstalledActionsFetch
跟踪对 /v2/actions 端点的 GET 请求,该端点获取已安装操作的列表
ScaffolderTaskCreation
跟踪对 /v2/tasks 端点的 POST 请求,该端点创建 scaffolder 执行的任务
ScaffolderTaskListFetch
跟踪对 /v2/tasks 端点的 GET 请求,该端点获取 scaffolder 中所有任务的详细信息。
ScaffolderTaskFetch
跟踪对 /v2/tasks/:taskId 端点的 GET 请求,该端点获取指定任务 :taskId的详细信息
ScaffolderTaskCancellation
跟踪对 /v2/tasks/:taskId/cancel 端点的 POST 请求,该端点取消正在运行的任务
ScaffolderTaskStream
跟踪 GET 请求到 /v2/tasks/:taskId/eventstream 端点,该端点返回任务 :taskId的任务日志的事件流。
ScaffolderTaskEventFetch
跟踪对 /v2/tasks/:taskId/events 端点的 GET 请求,该端点返回任务 :taskId的任务日志的快照
ScaffolderTaskDryRun
跟踪对 /v2/dry-run 端点的 POST 请求,该端点会创建一个空运行任务。与空运行关联的事件的所有审计日志会将 meta.isDryLog 标志设为 true
ScaffolderStaleTaskCancellation
跟踪自动取消过时的任务
ScaffolderTaskExecution
跟踪实际构建器任务执行的启动和完成(空运行不会发生)
ScaffolderTaskStepExecution
跟踪 启动和完成 构建器任务步骤执行
ScaffolderTaskStepSkip
如果未满足条件, 跟踪跳过的步骤
ScaffolderTaskStepIteration
跟踪包含每个字段的任务步骤 执行的步骤

9.2.3. 目录事件

Developer Hub 审计日志可包括以下目录事件:

CatalogEntityAncestryFetch
跟踪对 /entities/by-name/:kind/:namespace/:name/ancestry 端点的 GET 请求,该端点返回实体的ancestry
CatalogEntityBatchFetch
跟踪 POST 请求到 /entities/by-refs 端点,该端点返回批实体
CatalogEntityDeletion
跟踪对 /entities/by-uid/:uid 端点的 DELETE 请求,该端点删除实体
注意

如果已删除实体的父位置仍存在于目录中,则在下一个处理周期期间会在目录中恢复实体。

CatalogEntityFacetFetch
跟踪 GET 请求到 /entity-facets 端点,该端点返回实体的挑战
CatalogEntityFetch
跟踪 GET 请求到 /entities 端点,该端点返回实体列表
CatalogEntityFetchByName
跟踪 GET 请求到 /entities/by-name/:kind/:namespace/:name 端点,该端点返回与指定实体引用匹配的实体,例如 < kind>:<namespace>/<name>
CatalogEntityFetchByUid
跟踪 GET 请求到 /entities/by-uid/:uid 端点,该端点返回与指定实体的唯一 ID 匹配的实体
CatalogEntityRefresh
跟踪 POST 请求到 /entities/refresh 端点,该端点调度指定的实体刷新
CatalogEntityValidate
跟踪对 /entities/validate 端点的 POST 请求,该端点验证指定的实体
CatalogLocationCreation
跟踪对 /locations 端点的 POST 请求,这将创建一个位置
注意

位置是一种标记,引用其他位置来查找目录数据。

CatalogLocationAnalyze
跟踪对 /locations/analyze 端点的 POST 请求,该端点分析指定的位置
CatalogLocationDeletion
跟踪对 /locations/:id 端点的 DELETE 请求,该端点删除位置以及与其关联的所有子实体
CatalogLocationFetch
跟踪 GET 请求到 /locations 端点,该端点返回位置列表
CatalogLocationFetchByEntityRef
跟踪 GET 请求到 /locations/by-entity 端点,该端点返回与指定实体引用关联的位置列表
CatalogLocationFetchById
跟踪 GET 请求到 /locations/:id 端点,该端点返回与指定位置 ID 匹配的位置
QueriedCatalogEntityFetch
GET 请求跟踪到 /entities/by-query 端点,该端点返回与指定查询匹配的实体列表

法律通告

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