为初学者定制 DevSecOps 管道
了解采用 DevSecOps 和加载第一个应用程序或微服务的基础知识。
关于 DevSecops 工具链
您发现并测试了 IBM Cloud DevSecOps Continuous Integration (CI),Continuous Deployment (CD) 和 Continuous Compliance (CC) 工具链,这些工具链实现了 DevSecOps 最佳实践和安全工具。
现在,您已准备好启用自己的应用程序或微服务,并采用 DevSecOps。
准备工作
您需要以下资源以在 DevSecOps 工具链中加载应用程序:
- 包含应用程序代码 (通常称为 "应用程序存储库") 的应用程序源代码 Git 存储库。
.pipeline-config.yaml
文件。 此文件是 CI,CD 和 CC 管道用于定制管道运行过程中的任何阶段的核心配置文件。 开始使用 样本.pipeline-config.yaml
文件,您可以下载并定制该文件以满足自己的需求。 可以使用.pipeline-config.yaml
文件来定制除 start 阶段以外的所有阶段。 该文件会触发并运行定制脚本以构建,测试和部署应用程序。 您可以更改.pipeline-config.yaml
文件的名称,或者将不同的文件用于不同的管道或触发器。 确保管道或触发器中的参数值与配置文件匹配。 有关更多信息,请参阅 管道参数。
IBM Cloud 具有以下 DevSecOps 模板以帮助您入门:
DevSecOps 管道如何使用存储库
要构建,测试和部署应用程序,DevSecOps 管道使用两个存储库:
app-repo
: 应用程序存储库,其中包含应用程序的源代码。config-repo
: 配置库,其中包含管道配置 YAML 文件和脚本。
在 DevSecOps 样本应用程序 中,这两个存储库相同。 大多数 DevSecOps 采用者都以此模式开始。 但是,随着您加载更多微服务,可能需要一个专用且独立的管道配置存储库。 由于应用程序存储库和配置存储库在样本应用程序中相同,因此在运行管道时将克隆该存储库两次,这可能会导致错误。 因此,最好有一个单独的配置存储库来托管可以在不同 DevSecOps 工具链和管道之间共享和复用的配置文件和脚本。 有关定制配置库的更多信息,请参阅 高级定制步骤。
DevSecOps 脚本将 app-repo
和 config-repo
视为两个单独的存储库。 在管道的启动阶段,脚本会克隆存储库两次。 这些克隆称为 app-repo
和 one-pipeline-config-repo
。 每个阶段都在 config repo
的上下文中运行。
板载应用程序
为简单起见,请先使用 样本 Node 应用程序 创建并测试 DevSecOps CI 工具链,然后再继续。
有三种主要方法可将第一个应用程序加载到现有 DevSecOps CI 工具链中:
- 选项 1: 将应用程序存储库添加到工具链,并使用样本应用程序存储库作为配置存储库。
- 选项 2: 将样本应用程序存储库替换为应用程序存储库。
- 选项 3: 将应用程序存储库添加到工具链并使用专用配置库。 有关此选项的更多信息,请参阅 高级定制步骤。
DevSecOps 工具链使用由 IBM(也称为 GRIT) 管理的 Gitlab 存储库。 可以改为使用其他 Git 提供程序。 例如,应用程序存储库可能在 GitHub 或 Gitlab 上托管。
选项 1: 添加应用程序存储库,并使用样本应用程序存储库作为配置存储库
要将应用程序存储库添加到工具链并将样本应用程序存储库用作配置库,请完成以下步骤:
- 在 IBM Cloud 控制台中,单击 菜单 图标 > DevOps > 工具链,然后选择要编辑的工具链。
- 单击添加。
- 选择托管应用程序存储库的位置:
Gitlab
或GitHub
。 - 使用缺省服务器或添加新服务器。
- 输入定制服务器的 URL 和个人访问令牌。
- 单击创建集成。
- 输入应用程序源代码存储库 URL。
- 单击创建集成。
接下来,通过完成以下步骤将样本应用程序存储库指定为配置存储库:
- 在 IBM Cloud 控制台中,单击 菜单 图标 > DevOps > 工具链,然后选择要编辑的工具链。
- 单击 pr-pipeline。
- 单击 设置 并转至 环境属性 选项卡。
- 编辑
pipeline-config-repo
属性的值以指向样本应用程序存储库 URL。 - 返回到 CI 工具链。
- 单击 ci-pipeline。
- 单击 设置 并转至 环境属性 选项卡。
- 编辑
pipeline-config-repo
属性的值以指向样本应用程序存储库 URL。
您的 CI 管道现在使用样本应用程序存储库 pipeline-config
作为配置存储库。
选项 2: 将样本应用程序存储库替换为您自己的应用程序存储库
要将样本应用程序存储库替换为您自己的应用程序存储库,请完成以下步骤:
- 在 IBM Cloud 控制台中,单击 菜单 图标 > DevOps > 工具链,然后选择要编辑的 CI 工具链。
- 找到样本应用程序源代码存储库,然后选择 配置。
- 将存储库 URL 替换为应用程序源代码存储库 URL。
- 单击保存集成。
在替换样本应用程序存储库之后,请确保新应用程序存储库包含 .pipeline-config.yaml
文件和相应的脚本。 将 .pipeline-config.yaml
文件和脚本从样本应用程序存储库复制到应用程序存储库,或者使用 此样本配置文件。
配置 CI 管道
添加应用程序存储库后,必须配置 CI 管道以使用新存储库。
配置管道触发器
缺省触发器使用样本应用程序存储库,因此您必须更新它们以使用应用程序存储库。 验证触发器设置,并在需要时对其进行修改,以确保所有触发器都指向应用程序存储库。 完成以下步骤:
- 在 IBM Cloud 控制台中,单击 菜单 图标 > DevOps > 工具链,然后选择要编辑的 CI 工具链。
- 单击 pr-pipeline。
- 编辑 Git PR 触发器 并提供应用程序存储库 URL 和分支。
- 单击保存。
- 返回到 CI 工具链,然后单击 ci-pipeline。
- 编辑 Git CI 触发器 并提供应用程序存储库 URL 和分支。 确保 属性 部分中的应用程序名称正确。
- 单击保存。
- 编辑 手动触发器。 在 属性 部分中,确保应用程序名称正确。
- 确保存储库和分支属性正确并指向应用程序存储库。
配置 .pipeline-config.yaml
文件
将 .pipeline-config.yaml
文件从样本应用程序存储库复制到应用程序存储库,或者使用 此样本配置文件。
对于 pr-pipeline
和 ci-pipeline
,请确保正确设置了 pipeline-config
,pipeline-config-branch
和 pipeline-config-repo
参数并与您的配置匹配。 如果未正确设置这些参数,那么您可能会将更改落实到错误的分支,这将导致管道发生错误。
如果未设置 pipeline-config-repo
变量,那么 DevSecOps 管道假定它与应用程序源代码存储库是同一存储库。
将定制脚本与 DevSecOps 配合使用
pipeline-config.yaml
文件是用于编排和定制 DevSecOps 管道行为的关键组件。 该文件使用脚本来构建,测试和部署应用程序。 此文件定义如何配置阶段以及运行哪些脚本。 有关更多信息,请参阅 定制脚本。
DevSecOps 管道使用了两大类脚本:
- 用于构建,测试和部署应用程序的应用程序相关脚本。 这些脚本是您自己的职责,超出了 DevSecOps 支持的范围。 由于这些脚本没有缺省实现,因此必须将其添加到应用程序或配置库。 您可能需要从 Jenkins 或其他源中提取脚本。
- 用于运行安全性和合规性扫描的安全性和合规性脚本。 大多数都随附 缺省脚本,您可以覆盖这些脚本以使用自己的定制实现。
除了开始阶段,CI,CD 或 CC 管道的每个阶段都可以使用您自己的脚本进行定制,以覆盖阶段的缺省实现。 无法使用您自己的脚本定制启动阶段。
虽然 Bash 脚本作为样本提供,但您可以使用其他语言 (例如 Python 或 Go) 来构建,测试和部署应用程序。 确保对每个阶段使用正确的 image
。 请参阅 DevSec"Ops 管道" 部分中的 Docker 个图像。
请参阅概述 CI 管道的各个阶段的表 阶段和任务。 此表还提供了有关阶段是否具有缺省引用实现,是否可以定制或跳过该阶段,或者是否存在阶段执行所需的显式证据收集的合并信息。
从 Jenkins 或 Travis 迁移到 DevSecOps
大多数 DevSecOps 采用者不会从任何内容开始。 大多数采用者已具备持续集成和持续交付流程以及相应的脚本库。 这些流程通常通过使用 Jenkins,Travis 或某些其他平台来实现。
迁移到 DevSecOps 的关键点:
pipeline-config.yaml
配置文件应反映 CI 和 CD 管道当前的编排方式。 阶段和步骤应映射到 DevSecOps 管道阶段。- 您应该使用已存在的相同脚本,基本映像和变量。
- 需要将私钥属性迁移到 私钥存储。
- 需要将非私钥属性添加为管道或触发器属性。
在开发方式下工作
您可以使用 CI 和 CD 管道的开发方式来测试 .pipeline-config.yaml
文件和脚本的实现。 开发方式管道不会运行任何与安全性或合规性相关的任务,这将减少管道的运行时。 有关更多信息,请参阅 以开发方式运行管道。
仅出于开发目的使用开发方式。 开发方式不是官方 DevSecOps CI 和 CD 管道的替代方法,它们仍然是参考实现。
配置 CD 管道
在 DevSec操作持续集成,持续部署工作流程 中,CI 管道在 CI 管道的 deploy-release
阶段将更新推送到库存存储库。 有关更多信息,请参阅 样本 release.sh 脚本。
在此工作流程中,多个 CI 触发器和不同的 DevSecOps CI 工具链可以向同一库存存储库添加内容。
与 CI 管道相反,CD 管道所使用的部署脚本需要根据 Jenkins,Travis 或某些其他平台中的当前脚本进行调整,以使用 库存存储库 中的条目。
此 样本代码 显示了如何从库存中检索信息并将其用于运行 Kubernetes 部署。
DevSecOps 脚本位置
DevSecOps 管道随附缺省安全性和扫描工具以及关联的脚本。
例如,阶段日志的开头引用了缺省脚本:
scan-artifact:
image: icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.24
dind: true
dind_image: icr.io/continuous-delivery/toolchains/devsecops/docker:20.10.21-dind
abort_on_failure: false
image_pull_policy: IfNotPresent
script: |
#!/bin/sh
"/opt/commons/scan-artifact/scan.sh"
/opt/commons/scan-artifact/scan.sh
是缺省脚本。
DevSecOps 管道提供了名为 COMMONS_PATH
的环境变量中 公共库 的根文件夹的路径,该环境变量在所有任务和步骤中都可用。 要访问内置到合规性基本映像中的脚本,请将 COMMONS_PATH
变量与所需的脚本文件夹配合使用:
source "${COMMONS_PATH}/<script folder in commons>/<script file name>
请参阅概述 CD 管道的各个阶段的表 阶段和任务。 该表还提供了有关阶段是否具有缺省引用实现,是否可以定制或跳过该阶段,或者阶段执行是否需要显式证据收集的合并信息。
环境属性
DevSecOps 管道随附 预定义环境属性,但您可以根据需要添加任意数量的定制属性。 您可以使用 get_env
命令 来访问脚本中的这些属性值。
将属性及其可选缺省值添加到管道或触发器之后,请在脚本中使用 get_env
命令来检索该属性的值。 以下示例检索 my-variable
属性的值:
MY_VARIABLE=$(get_env my-variable "")
您还可以使用 set_env
命令 动态覆盖脚本中的属性值。 以下示例覆盖 my-variable
属性中的值:
set_env my-variable new-value
跳过阶段
某些阶段可能不相关。 例如,您可能未在构建任何 Docker 映像,或者尚未实施验收测试。 如果要跳过阶段,可以编辑 .pipeline-config.yaml
文件以包含 exit 0
,或者将 skip
变量设置为 true
。
以下示例添加 exit 0
以跳过阶段:
scan-artifact:
image: icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.24
dind: true
dind_image: icr.io/continuous-delivery/toolchains/devsecops/docker:20.10.21-dind
abort_on_failure: false
image_pull_policy: IfNotPresent
skip: false
runAfter: null
script: |
#!/bin/sh
exit 0
"/opt/commons/scan-artifact/scan.sh"
DevSecOps 管道中的 Docker 映像
缺省情况下,DevSecOps 管道使用 IBM Continuous Delivery 映像。 这些映像包含一些最常见的工具,例如用于运行脚本的 Node 和 Java。 您还可以使用其他供应商的映像或您自己的包含首选工具的定制映像。
在 .pipeline-config.yaml
文件中指定了 DevSecOps 管道所使用的 Docker 映像。 每个阶段都可以使用不同的图像。
更改映像版本
根据您的需求,您可能需要使用不同版本的映像。 要更改映像版本,请编辑 .pipeline-config.yaml
文件。 例如,如果在 YAML 文件 icr.io/continuous-delivery/pipeline/pipeline-base-ubi
中引用了以下图像:3.24
,那么将其更改为 icr.io/continuous-delivery/pipeline/pipeline-base-ubi
:3.27
会导致使用该图像的 V 3.27 。
同样,更改阶段的 dind_image
:
scan-artifact:
image: icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.24
dind: true
dind_image: icr.io/continuous-delivery/toolchains/devsecops/docker:20.10.21-dind
(...)
获取支持
定制 DevSecOps 管道时,通过 在 Slack 上加入我们,直接从 IBM Cloud 开发团队获取帮助。