使用 DevSecOps 设置 Tekton 持续集成管道
完成以下步骤以设置具有合规性的 Tekton 持续集成管道。 建议的配置选项将指导您完成创建工具链的步骤。
准备工作
- 在 IBM Cloud Kubernetes Service 上 创建 Kubernetes 集群 以部署应用程序。
- 在操作系统上安装 IBM Cloud CLI ,以与 IBM Cloud 资源进行交互。
- 使用正确的编码 创建映像签名密钥 以签署应用程序 Docker 映像。
- 创建工具链私钥 以访问不同的集成并保护它们。
- 可选。 将 Cloud Object Storage 配置为合规性证据锁定程序,以持久存储管道运行证据。
- 验证建议的 IAM 许可权 已分配给相应的集成。
CI 工具链的指导式设置概述
查看以下视频教程以获取设置过程的概述:
图 1 中的进度指示器将指导您完成工具链配置。 如果需要返回到上一个步骤,那么可以使用进度指示器来浏览到上一个步骤。

当前步骤的配置选项显示在页面的主区域中。
要前进到下一步,请单击 继续。 仅当当前步骤的配置完成且有效时,才能前进到下一步。 您可以通过单击 后退来浏览至上一步。
某些步骤可能具有 切换到高级配置 切换。 这些步骤为您提供了建议的最低配置。 但是,需要细颗粒度控制的高级用户可以单击 切换到高级配置 开关以查看底层集成的所有选项。

成功完成所有步骤后,单击 创建 以创建工具链。
您可以返回到引导式安装程序中的先前步骤。 工具链安装程序将保留您完成的所有配置。
启动 CI 工具链设置
使用下列其中一个选项来启动 CI 工具链配置:
设置 CI 工具链名称和区域
复查工具链设置的缺省信息。 工具链的名称在 IBM Cloud 中起到标识符的作用。 确保工具链的名称在工具链中对于 IBM Cloud中的同一区域和资源组是唯一的。
工具链区域可能与集群和注册表区域不同。

设置 CI 工具集成
必须在引导式设置期间配置多个存储库,如以下部分中所述。
对于每个存储库,请克隆作为样本提供的存储库,或者提供指向您拥有的现有 IBM托管的 Git Repos and Issue Tracking 存储库的 URL。 工具链仅支持链接到现有 Git Repos and Issue Tracking 存储库。
应用程序
以下图像中显示了引用应用程序源代码存储库的 "应用程序" 步骤。

缺省情况下会显示建议的选项,但您可以单击 切换到高级配置 开关以查看可用于底层 Git 集成的所有配置选项。 工具链的缺省行为是 使用缺省样本应用程序 ,它将样本应用程序克隆为 IBM托管的 Git Repos and Issue Tracking 存储库。
输入由工具链作为应用程序存储库创建的 IBM托管的 Git Repos and Issue Tracking 存储库的名称。
存储库的区域与工具链的区域相同。
如果要链接工具链的现有应用程序存储库,请选择 自带应用程序 选项,并将其作为输入提供给 存储库 URL 字段。 如前所述,工具链当前仅支持链接到现有 Git Repos and Issue Tracking 存储库。 如果要了解有关 自带应用程序的更多信息,请参阅 将您自己的应用程序引入 DevSecOps。
Git 集成
要查看用于访问 Git 提供程序的缺省认证方法,请单击 切换到高级配置。 Auth Type
的缺省值为 OAuth。
要在 Git 集成中使用个人访问令牌,请选择 个人访问令牌。 您还必须为字段 Personal Access Token
提供个人访问令牌值,该字段具有存储库的相应许可权。
清单
在此存储库中跟踪变更管理。 CD 管道将创建一个命名为已创建 CR 编号的新分支,并在部署结束后将其合并到主节点。

工具链的缺省行为是 创建新的库存存储库 ,该存储库将创建新的库存存储库作为 IBM托管的 Git Repos and Issue Tracking 存储库。 如果要链接工具链的现有库存存储库,那么可以选择 使用现有库存存储库 选项,并将其作为输入提供给 存储库 URL 字段。 如前所述,工具链当前仅支持链接到现有 Git Repos and Issue Tracking 存储库。
- 新存储库名称: 由工具链作为库存存储库创建的 IBM托管的 Git Repos and Issue Tracking 存储库的名称。 存储库的区域与工具链的区域保持不变。
问题
在存储库中跟踪有关构建和部署过程中捕获的事件的问题。

工具链的缺省行为是 创建新问题存储库 ,用于将新存储库创建为 IBM托管的 Git Repos and Issue Tracking 存储库。 如果要链接工具链的现有问题存储库,那么可以选择 使用现有问题存储库 选项,并将其作为输入提供给 存储库 URL 字段。 如前所述,工具链当前仅支持链接到现有 Git Repos and Issue Tracking 存储库。
- 新存储库名称: 由工具链创建为库存存储库的 IBM托管的 Git Repos and Issue Tracking 存储库的名称。 存储库的区域与工具链的区域保持不变。
密钥
此工具链中的多个工具需要私钥才能访问特权资源。 IBM Cloud API 密钥是此类私钥的示例。 所有私钥都必须安全地存储在私钥保险库中,然后根据工具链的要求进行引用。
私钥 步骤指定将哪些私钥保险库集成添加到工具链。 使用提供的开关来添加或除去所需的保险库集成。 但是,可以在后续步骤中配置这些参数。 此外,请熟悉 保护 Continuous Delivery中的敏感数据 文档中的概念,因为这提供了有关预配置保险库提供程序和集成的重要信息。

如果计划使用 IBM Key Protect 或 HashiCorp 保险库文件来管理私钥,请参阅 CI 设置指南的 IBM Key Protect 部分。
IBM Key Protect
使用 Key Protect 可安全地存储和应用属于工具链的密钥,例如 API 密钥,映像签名或 HashiCorp 保险库文件凭证。 必须先创建 Key Protect 服务实例,然后再继续操作。 如果您已创建 Key Protect 服务实例作为先决条件,那么可以在此步骤中链接相同的服务实例。

- 名称: 由工具链创建的 Key Protect 实例的名称。 在工具链设置的各个阶段,此名称可访问此密钥保护实例。
- 区域: Key Protect 服务所在的区域。
- 资源组: Key Protect 服务所属的资源组。
- 服务名称: Key Protect 服务名称。
为了符合使用 HashiCorp 保险库文件的最佳实践,此模板包含 Key Protect 工具集成,用于安全地管理 HashiCorp 保险库文件 Role ID
和 Secret ID
。 通过将这些 HashiCorp 保险库文件私钥存储在 Key Protect 中作为用户创建工具链的先决条件,您可以保护对 HashiCorp 保险库文件 (这是大多数使用者的缺省私钥存储库) 的访问。
IBM Secrets Manager
使用 Secrets Manager 可安全地存储和应用属于工具链的私钥,例如 API 密钥,映像签名或 HashiCorp 保险库文件凭证。 必须先创建 Secrets Manager 服务实例,然后再继续操作。 如果创建了 Secrets Manager 服务实例作为先决条件,那么可以在此步骤中链接相同的实例。

- 名称: 由工具链创建的 Secrets Manager 实例的名称。 在工具链设置的各个阶段中,此名称可访问此 Secrets Manager 实例。
- 区域: Secrets Manager 服务所在的区域。
- 资源组: Secrets Manager 服务所属的资源组。
- 服务名称: Secrets Manager 服务名称。
HashiCorp 保险库文件
使用 HashiCorp 保险库文件可安全地存储工具链所需的私钥。 私钥的示例包括 API 密钥,用户密码或允许访问敏感信息的任何其他令牌。 工具链存储对 HashiCorp 保险库文件私钥 (而不是字面值私钥值) 的引用,这些私钥支持高级功能 (例如私钥轮换)。

- 名称: 此工具集成的名称。 此名称显示在工具链中。
- 服务器 URL: HashiCorp 保险库文件实例的服务器 URL。 (例如
https://192.168.0.100:8200
) - 集成 URL: 单击 HashiCorp 保险库文件集成磁贴时要浏览到的 URL。
- 私钥路径: 私钥存储在 HashiCorp 保险库文件实例中的安装路径。
- 认证方法: HashiCorp 保险库文件实例的认证方法。
- 角色标识: 团队的 AppRole 角色标识。
- 私钥标识: 团队的 私钥标识。
注: 建议您使用 AppRole 认证方法,因为此方法可用于读取私钥值。
证据存储
将在此存储库中收集属于应用程序的所有原始合规性证据。 此存储库选项仅用于评估目的。
工具链的缺省行为是 创建新的证据锁定程序存储库 ,该存储库将创建新的存储库作为 IBM托管的 Git Repos and Issue Tracking 存储库。 如果您想要链接工具链的现有证据锁定程序,请选择 使用现有证据锁定程序存储库 选项,并将其作为输入提供给 存储库 URL 字段。 如前所述,工具链当前仅支持链接到现有 Git Repos and Issue Tracking 存储库。
但是,您必须收集所有证据并将其存储在 Cloud Object Storage 存储区中,如以下图像中所述进行配置。

云对象存储区

Cloud Object Storage 用于存储 DevSecOps Pipeline 生成的证据和工件。 如果要使用此功能,那么必须具有 Cloud Object Storage 实例和存储区。 请阅读有关配置可充当合规证据锁定程序的存储区的建议。
您可以选择将任何类型的 Cloud Object Storage 存储区设置为锁定程序,即使没有保留策略也是如此。 此时管道不会检查或强制实施设置。 有关帮助,请参阅 Cloud Object Storage 文档。
您需要为管道提供以下信息才能到达存储区:
- Cloud Object Storage 端点
- 存储区名称
- 服务 API 密钥
您可以稍后通过提供必需的 cos-bucket-name
和 cos-endpoint
来设置 Cloud Object Storage 锁定程序。 要除去 Cloud Object Storage 存储区,请使用上一步中的 Cloud Object Storage 存储区切换控件。
要获取 Cloud Object Storage 端点,请参阅 Cloud Object Storage 实例的页面,并在菜单中选择 "端点" 部分。 您需要复制与存储区的区域和弹性相匹配的公共端点。

如果您决定不使用 Cloud Object Storage 作为证据锁定程序,那么还可以在创建工具链后通过在 CI 管道中设置 cos-bucket-name
和 cos-endpoint environment
变量来设置必需值。
部署
工具链的缺省行为是 克隆现有管道 ,该管道创建新的存储库作为 IBM托管的 Git Repos and Issue Tracking 存储库。 如果要链接工具链的现有管道存储库,请选择 使用现有存储库 ,并将其作为输入提供给 存储库 URL 字段。 如前所述,工具链当前仅支持链接到现有 Git Repos and Issue Tracking 存储库。
- 应用程序名称:
应用程序的名称。 -缺省值: hello-compliance-app
IBM Cloud API 密钥
API 密钥用于在多个任务中与 ibmcloud CLI 工具进行交互。 如果您已创建集群,那么 API 用于访问集群并将密钥存储在安全保险库文件 ( Key Protect, Secrets Manager或 HashiCorp 保险库文件中的任何一个) 中,作为先决条件,您可以在此步骤中使用相同的密钥。
- Option-1: 可以通过单击密钥图标 (建议) 从创建为先决条件的现有密钥提供程序实例 (Key Protect 实例,密钥管理器实例或 HashiCorp 保险库文件) 导入现有密钥
- Option-2: 可以复制和粘贴现有密钥 (不推荐)
- Option-3: 可以从此处通过单击 **新建 +**来创建新密钥。如果没有新的 API 密钥或将现有密钥复制到该字段,请生成新的 API 密钥。 可以将新生成的 API 密钥保存到现有 Key Protect 实例。
可以将新生成的 API 密钥保存到现有 Key Protect 实例。

单击密钥图标以使用私钥提供程序中的现有密钥。
- 提供者: 存储 API 密钥以访问集群的私钥提供者,如先前链接到工具链的那样。 它可以是 Key Protect 实例, Secret Manager 实例或 HashiCorp 保险库文件实例。
- 资源组: Secrets Manager 提供者所属的资源组。
- 私钥名称: 私钥的名称或别名,例如 API 密钥。
如果 API 密钥具有足够的访问权,那么使用创建的 API 密钥,从保险库文件中检索的 API 密钥或手动输入的以下字段将自动装入。 如果 API 密钥有效,那么将自动填充容器注册表区域和名称空间集群区域,名称,名称空间和资源组。 如果需要,请更改其中任何字段以与配置匹配。

库存目标和源分支
- 库存源环境: 要从中提升应用程序的环境缺省值 :master
- 库存目标环境: 要将应用程序部署到的环境缺省值 :prod
- 目标区域: 应用程序部署到的目标区域 (可选)
- 变更请求 PR 和问题的紧急标签: 要用于紧急部署的变更请求上的标签
映像签名
必须先对由此工具链构建并记录在清单中的任何映像进行签名,然后才能将其部署到生产环境。 管道使用 Skopeo 作为缺省工具来提供映像签名功能。 您可以使用现有 GPG 密钥或创建新的 GPG 密钥对。
确保密钥遵循所选工具用于存储私钥的相应编码。

单击 密钥 以使用密钥提供者中的现有密钥。
- 提供者: 私钥提供者,用于存储 GPG 密钥。 它可以是 Key Protect 实例, Secret Manager 实例或 HashiCorp 保险库文件实例。
- 资源组: Secrets Manager 提供者所属的资源组。
- 私钥名称: 私钥的名称或别名,即 GPG 密钥。
DevOps Insights
IBM Cloud DevOps Insights 包含在创建的工具链中,并且在每个合规性检查证据发布到其中之后。 您无需为 DevOps Insights提供任何配置步骤, CI 管道将自动使用工具链中包含的洞察实例。 DevOps Insights 可聚集代码,测试,构建和部署数据,以提供对所有团队和发行版的速度和质量的可视性。
可选工具
Slack
如果要接收有关 PR/CI 管道事件的通知,可以在设置期间从工具链模板配置 Slack 工具,也可以稍后添加 Slack 工具。
为了使 Slack 通道接收来自工具的通知,您需要 Slack Webhook URL。 要获取 Webhook URL ,请参阅 Slack API Web 站点的 "传入 Webhook" 部分。

公共 DevOps Insights 工具链
可以选择将 DevOps Insights 包含在创建的工具链中,并在将每个合规性检查证据发布到其中之后。 工具链可以使用现有 DevOps Insights 实例将部署记录发布到洞察。 您可以通过提供集成标识从其他工具链链接 DevOps Insights 集成。

您可以从工具链的 URL 复制工具链标识。 工具链的 URL 遵循以下模式: https://cloud.ibm.com/devops/toolchains/<toolchain-ID-comes-here>?env_id=ibm:yp:us-south
例如,如果 URL 为: https://cloud.ibm.com/devops/toolchains/aaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee?env_id=ibm:yp:us-south
,那么工具链的标识为: aaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
。
注: 仅包括标识,而不是完整 URL。
您还可以为 DOI 交互设置目标环境。 此参数是可选参数。 如果提供此参数,那么将使用此参数来代替库存中的目标环境。
devops insights
使用此选项可创建要用于工具链的 DevOps Insights 的新实例。 无需配置,如果选择了此选项,那么工具链将创建 DevOps Insight 的新实例。 CI 管道会自动使用工具链中包含的洞察实例。
Delivery 管道专用工作程序
Delivery Pipeline Private Worker 工具集成与一个或多个可单独运行 Delivery Pipeline 工作负载的专用工作程序连接。
SonarQube
将 SonarQube 配置为工具链的静态代码分析工具。 SonarQube 提供了源代码总体运行状况和质量的概述,并重点阐述了在新代码中发现的问题。 静态代码分析器会检测棘手的错误,例如空指针取消引用,逻辑错误和多种编程语言的资源泄漏。
使用 缺省配置, SonarQube 扫描将在 Docker 容器中未持久存储的隔离 Docker 中运行。
通过 集群配置,管道将在 部署 步骤中配置的 Kubernetes 集群中供应新的 SonarQube 实例。 此实例在第一次管道运行期间供应,并且仍可用于所有后续管道运行。
如果希望工具链使用在另一主机上供应的现有 SonarQube 实例,请使用 定制配置 选项。

创建 CI 工具链
创建工具链:
-
在 " 摘要 " 步骤中单击 创建 ,然后等待创建工具链。
您可以在创建管道后配置各个工具链集成。

浏览 CI 工具链
创建的 CI 工具链如下所示:

它包含两个管道:
- PR: 在应用程序存储库中提交新 PR 时触发
- CI: 在将 PR 合并到应用程序存储库中的主项时手动运行或触发
运行 PR-CI 管道
要启动 PR 管道,应在应用程序存储库中创建合并请求。 要实现此目标,请执行以下操作:
- 在 CI 工具链页面上,单击应用程序存储库磁贴。 缺省情况下,将使用名称 **
compliance-app-<timestamp>
**进行创建。 - 从主节点创建分支。
- 更新应用程序或自述文件中的一些代码并保存更改。
- 提交合并请求。
- 返回到 CI 工具链页面,单击 pr-pipeline 磁贴。 PR 管道已启动。
应用程序存储库中的相应合并请求处于 "暂挂" 状态,直到 PR 管道的所有阶段成功完成为止。
PR 管道运行成功后,您可以单击该管道以浏览已完成的大量步骤。

- 返回到合并请求。
- 合并请求,以便将更改复制到应用程序存储库的主分支: 将自动触发 CI 管道。
简化了管道中的任务流: (省略了实用程序任务。 例如, GitHub上的状态检查更新,凭证访存等)。

在 DevSecOps 世界中,左移是一种防止和发现缺陷,安全漏洞等问题的实践。 左移还在软件交付过程中早期执行合规性检查。
- 可以在代码/存储库上运行且不需要构建映像的检查应尽早运行,以防止不合规代码合并到存储库的主分支中。 未从 PR 管道收集证据。 管道的目标是尽可能地转移合规性检查。
- 每次运行管道时都会执行所有检查,即使先前的检查失败,管道也会前进到下一个检查。 要评估在运行中是否有任何故障,需要检查管道的最后一个步骤,该步骤具有管道评估程序。
- 如果您正在尝试合并紧急修订,并且想要绕过合规性检查,请向合并请求添加标签以指示此情况。 运行 CD 管道时必须提供相同的标签。
运行 PR 管道
-
要启动 PR 管道,请在应用程序存储库中创建拉取请求。
-
应用程序存储库中的相应合并请求处于 "暂挂" 状态,直到 PR 管道的所有阶段成功完成为止。
运行 CI 管道
有两种方法可以启动 CI 管道:
- 自动: 在 PR 管道成功后,通过核准 PR 并将其合并到主分支。
- 手动: 要手动触发 CI 管道,请选择 Delivery Pipeline 卡,然后单击 运行管道 ,然后选择 手动触发器。
在本文档中,在将代码更改合并到应用程序存储库的主分支之后,将触发 CI 管道。
- 在 CI 工具链页面上,单击 ci-pipeline 磁贴。
- 观察: 管道运行正在运行。 等待管道运行完成。
CI 管道运行成功后,您可以单击该管道以浏览已完成的步骤。

简化了管道中的任务流: (同样,省略了实用程序任务。 例如, GitHub上的状态检查更新,凭证访存等) 绿色任务正在输出证据。

证据从 CI 管道中的所有合规性检查收集到工具链设置期间提供的证据锁定程序存储库。 来自 CI 的证据存储在 raw/ci/<pipeline-run-id>/*.json
下。
还会将证据发布到工具链中的 DevOps Insights 实例。 您可以通过单击工具链中的 DevOps Insights 工具卡来浏览至该工具卡。 您可以在 "质量仪表板" 页面上查看收集的证据。

要评估管道运行中是否有任何故障,需要检查管道的最后一个步骤,该步骤具有管道评估程序。
查看正在运行的应用程序
成功运行 CI 管道后,样本应用程序将部署在 Kubernetes 集群上,并且正在开发名称空间中运行。
可以在 CI 管道运行的 run stage
step of deploy-dev
任务的日志末尾找到应用程序 URL。 使用该 URL 来验证应用程序是否正在运行。

配置管道
如果手动触发管道,那么可以添加 commit-id
文本属性 (单击 添加属性 并选择 文本属性)。 如果未提供 commit-id
,那么管道将从应用程序的主分支获取最新的落实标识。
例如:

添加触发器参数 (单击 运行管道 ) ,选择 手动触发器 ,然后单击 运行。
