IBM Cloud Docs
高级 DevSecOps 管道定制

高级 DevSecOps 管道定制

在加载第一个应用程序或微服务后,了解 DevSecOps 采用的高级功能。

确保查看 DevSecOps 管道定制的基础知识。 在这里,您可以了解可用的不同模板,支持选项以及其他重要信息,以帮助您开始使用 DevSecOps。

设计选项

在将更多应用程序和微服务加入到 DevSecOps 时,您可能迂到以下设计问题:

  • 我是否需要每个微服务一个工具链?
  • 我是否需要每个微服务一个管道?
  • 我需要将共享的 DevSecOps 存储库用于库存和问题,还是需要单独的存储库?

以下信息和最佳实践旨在帮助您做出这些设计选择。

工具链和管道注意事项

大多数应用程序由具有不同源存储库的多个微服务组成。 通常,单个工具链用于托管逻辑分组的微服务。 通常,使用一个工具链和一个管道,或者使用尽可能少的管道,但使用多个触发器。 在每个管道中,您可以根据需要复制和配置任意数量的触发器,每个管道最多有 1024 个触发器。 此策略可帮助实施公共流程,脚本和配置文件。 有关更多信息,请参阅 在一个 CI 工具链上配置多个应用程序

此方法具有以下优点:

  • 使用较少的管道可避免重复并减少错误。 更新也更易于维护,例如,添加,编辑或删除环境属性或私钥时。
  • 使用此方法可以更快地加载服务。 为微服务添加 Git 集成,复制 Git 和手动触发器,并根据需要进行修改。 然后,确保为您的微服务实现了 .pipeline-config.yaml 文件和脚本。

此方法具有以下缺点:

  • 一次编辑会影响使用同一管道的每个团队。
  • 用户访问权通过使用 Identity and Access Management(IAM) 进行管理,并且是在工具链级别 (而不是管道级别) 设置的。 因此,如果要将单个工具链用于多个服务,那么团队的每个成员都可以查看其他团队的管道。 根据用户在 IAM 中的访问权,他们可能能够编辑,删除或触发管道。

计费注意事项

Continuous Delivery 服务根据每个 CD 实例的授权用户数以及用于工具链的资源组数来确定计费。 有权访问存储库的用户也被视为授权用户。 有关更多信息,请参阅 授权用户。 要降低成本,请确保所有工具链都位于同一资源组中。 这样做不会影响工具链部署到包含应用程序环境的其他资源组的能力。

DevSecOps 存储库注意事项

如果要创建由多个微服务组成的应用程序,那么可以在微服务之间共享大多数 DevSecOps 存储库 (证据存储库除外)。

有关更多信息,请参阅 DevSecOps 管道如何使用存储库

共享配置库注意事项

DevSecOps 样本应用程序随附一个位于同一位置的pipeline-config.yaml 配置文件和相应的脚本。 在加载多个微服务时,最佳实践是将源代码存储库与 DevSecOps 配置文件和脚本分开。 将它们存储在可由 CI,CD 或 CC 管道使用的单独的专用公共配置存储库中。

这包括:

  • 专用 Git 存储库,用于托管公共脚本库和pipeline-config.yaml 文件。
  • 单个pipeline-config.yaml 文件,它是所有服务的公共文件。 如果它太复杂或不可能,请使用不同的.pipeline-config.yaml 文件。
  • 基于每个文件夹进行定制。 实现pipeline-config.yaml 文件以指向配置存储库中的不同脚本文件夹。 在单独的 CI,CD 和 CC 文件夹中组织脚本,或者根据服务语言 (Go,Python,NodeJS),服务,应用程序名称或任何最适合您需要的内容来组织脚本。

通过将 pipeline-config-repo 管道属性 (可选的 pipeline-config-branch) 的值设置为共享配置库 URL,更改管道以使用此共享配置库。

库存存储库注意事项

可以在许多管道和工具链之间共享单个库存存储库。 多个 CI 工具链,管道和触发器可以添加到同一个库存存储库中。 CI 管道通常在发布阶段将更新推送到库存存储库。 然后,库存存储库将用作 CD 管道的源输入。 通常,最佳实践是将库存存储库分组到同一工具链中,以减少最终创建的变更请求数。

使用共享库存存储库是在开始加载微服务之前需要做出的体系结构决策,因为此决策会影响在管道运行时创建的变更请求数。 例如,假设您要将 10 个微服务加载到 DevSecOps 中。 您可以有 10 个不同的 CD 工具链,其中有 10 个不同的库存存储库,这将在每次 CD 管道运行时产生 10 个不同的更改请求。 如果共享公共库存存储库和公共 CD 工具链,那么更容易管理这 10 个不同的微服务。 这将仅产生一个变更请求,即使您对多个微服务进行更新也是如此,因为这些微服务都共享库存存储库和工具链。

问题存储库注意事项

问题存储库是跟踪微服务的所有漏洞问题的存储库。 如果您决定使用共享库存存储库,那么可能还需要使用共享问题存储库。

在管道或触发器级别设置 incident-assignessincident-labels 可帮助自动将问题分配给正确的团队。 有关更多信息,请参阅 连续部署参数

证据存储库注意事项

您的证据存储库包含合规性信息,并提供要在合规性审计期间使用的纸质跟踪。

即使您的库存存储库和问题存储库是共享的,也不要将同一证据存储库用于多个工具链。 由于 DevSecOps 管道生成的证据量,证据存储库的大小通常会越来越大。 将同一证据存储库用于多个工具链会导致更大的证据存储库,这可能会导致管道的性能问题。 确保定期 修剪证据存储库 以除去过时的证据并使存储库尽可能小。

IBM Cloud Object Storage 注意事项

如果您正在使用共享库存存储库和共享问题存储库,那么还可以使用 IBM Cloud® Object Storage 的共享实例。 完成以下步骤:

  1. 创建要在工具链和管道之间使用的 IBM Cloud Object Storage 实例
  2. 在该共享 IBM Cloud Object Storage 实例中,针对每个微服务创建一个 Object Storage 存储区。
  3. 设置管道和触发器 (如果适用),以通过设置 cos-bucket-name 环境属性来使用 IBM Cloud Object Storage 存储区。

同一 CI,CD 和 CC 管道中的所有微服务共享一个 Object Storage 存储区,而不考虑部署环境。 Object Storage 存储区的功能与证据存储库类似,但不存在大型证据存储库可能发生的性能问题。 由于大型 Object Storage 存储区不会发生性能问题,因此您无需从 Object Storage 存储区修剪证据。

部署到多个环境

可以通过多种方式将 CD 管道部署到多个目标环境。

每个 targeted environment 都应该在库存存储库中具有相应的分支,其中更改从 source 提升到 target 分支。

以下可选设计可能适合您的体系结构:

  • 针对每个目标环境使用一个手动触发器。 复制触发器,然后编辑环境属性以适应新环境。
  • 使用 Git 配置存储库,每个目标环境一个文件夹,其中特定配置设置存储在文件中。

使用缺省脚本和定制脚本

大多数安全性和合规性脚本都随附 缺省脚本,如果没有为阶段提供定制脚本,那么这些脚本将运行。 有时很难确定运行哪个脚本,在何处查找相应的源脚本以及如何覆盖缺省脚本。

确定要运行的脚本

要识别针对某个阶段运行的脚本,请打开管道运行 (最好是 CI 管道)。 展开任务,然后单击 run-stage 以打开日志。 run-stage 日志的开头提供了有关阶段中使用的脚本的信息,包括脚本所在的存储库。 在日志中,您可以滚动以查找有关已运行的脚本的更多详细信息。 例如,code-compliance-checks 任务可能在 run-stage 日志中具有以下信息,其中包括阶段的环境属性:

compliance-checks:
  image: icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.18
  dind: true
  abort_on_failure: false
  image_pull_policy: IfNotPresent
  script:
    #!/bin/sh

    "/opt/commons/compliance-checks/run.sh"

在该示例中,运行的脚本为 /opt/commons/compliance-checks/run.sh,它位于 commons library 中。 使用此公共库作为源来复制可针对特定边缘案例定制的代码。 在该示例中,compliance-checks/run.sh 位于 compliance-commons 库 中。

覆盖缺省脚本

要覆盖缺省脚本,请完成以下步骤:

  1. 在阶段日志中,复制用于标识缺省脚本的片段:
compliance-checks:
  image: icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.18
  dind: true
  abort_on_failure: false
  image_pull_policy: IfNotPresent
  script:
    #!/bin/sh

    "/opt/commons/compliance-checks/run.sh"
  1. 将片段粘贴到 .pipeline-config.yaml 文件中。
  2. 在调用脚本之前或之后添加定制代码。
  3. 根据需要编辑,删除或添加属性。

以下示例显示了 .pipeline-config.yaml 文件中的已更新脚本:

compliance-checks:
  image: icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.18
  dind: true
  abort_on_failure: false
  image_pull_policy: IfNotPresent
  script: |
    #!/bin/sh
    # run some custom script here
    ./scripts/my-custom-script1.sh

    "/opt/commons/compliance-checks/run.sh"

    # then some additional work
    ./scripts/my-custom-script2.sh

有关更多信息,请参阅 定制脚本

用于使用 DevSecOps 工具链即代码的 Terraform 模板

以下工具链提供了用于使用 Terraform 创建 DevSecOps CI,CD 和 CC 工具链的代码:

正在按现状提供对这些 Terraform 工具链的早期访问。 这些工具链处于活动开发状态,因此变量和变量名称可能会更改。