持续部署管道
持续部署管道将生成所有证据和变更请求摘要内容。 管道将构建工件部署到环境 (例如登台或生产),然后收集,创建所有现有日志文件,证据和工件并将其上载到证据锁定程序。
阶段和任务
下表列出了 CD 管道中运行的任务。 此外,该表还提供了以下每个阶段的概述:
-
任务或阶段: 这是指在
.pipeline-config.yaml配置文件中定义的阶段的名称。 -
简短描述: 提供阶段执行期间执行的操作的简明说明。
-
允许定制: 这指示用户是否具有通过在
.pipeline-config.yaml文件中插入定制脚本来修改或替换阶段的缺省行为的灵活性。 -
默认参考实现:这表示DevSecOps管道是否带有预定义或默认的阶段实现。 值得注意的是,对于某些阶段,如“
unit-tests或”setup,DevSecOps管道不提供任何开箱即用的实施。 而是需要用户提供定制脚本或根据其应用程序需求定制的代码。 -
证据收集: 指示阶段是否执行标准证据收集。 当DevSecOps 管道为某一阶段提供了参考实施时,证据收集工作就会开箱即用。 但是,如果 用户 选择修改或替换这些预定义阶段,那么他们必须确保其定制实现包含相应的证据收集。 在DevSecOps管道没有提供开箱即用实施方案的阶段,用户也要承担同样的责任,因为他们必须进行证据收集。 该列指示负责执行证据收集的实体 (用户/管道)。
-
允许跳过 (适用于版本> = v10): 这指示用户是否可以通过在
.pipeline-config.yaml中将 skip 属性设置为 true 来选择退出运行此阶段。 但是,使用此功能时请务必谨慎,尤其是对于旨在收集证据的阶段。 跳过此类阶段可能会导致缺少构建的基本证据。
| 任务或阶段 | 简短描述 | 在 .pipeline-config.yaml 中允许定制 |
缺省引用实现 | 证据收集 | 允许跳过 |
|---|---|---|---|---|---|
start |
设置管道环境 | 否 | 是 | 不适用 | 否 |
setup |
设置构建和测试环境。 | 是 | 否 | 不适用 | 否 |
verify-peer-review |
请确保已核准用于当前部署的拉取请求。 此阶段将生成链接到正在进行的部署的拉取请求的列表。 如果任何拉取请求仍未获得批准,那么部署将停止。 | 是 | 是 | 管道 | 是 |
verify-artifact |
验证已安排部署的映像的正确签名。 如果图像缺乏正确的签名,将阻碍部署,并启动相应的证据收集过程。 | 是 | 是 | 管道 | 是 |
change-request |
生成变更请求并创建证据摘要。 | 否 | 是 | 管道 | 否 |
deployment |
将构建工件部署到环境,例如登台或生产。 | 是 | 否 | 不适用 | 否 |
acceptance-test |
在部署上运行验收和集成测试。 | 是 | 否 | 用户 | 是 |
finish |
收集日志文件,工件和证据并将其上载到证据锁定程序。 | 是 | 是 | 管道 | 是 |
rollback |
这是 prod-finish 中的一个步骤,每当迂到回滚方案时都会执行此步骤 |
是 | 是 | 不适用 | 否 |
有关如何使用 .pipeline-config.yaml 文件定制阶段的更多信息,请参阅 定制脚本 和 管道参数 列表。
部署增量
当库存提升准备就绪时,可启动持续部署管道。 部署增量是上次完成的部署的内容与当前部署的内容之间的差异。 部署增量列出了要部署的库存项。
要访问部署脚本中的部署增量,可以使用以下命令:
# return a JSON file path with an array of inventory entries that were changed
get_env DEPLOYMENT_DELTA_PATH
# return a JSON file path with an array of inventory entries that were deleted
get_env DEPLOYMENT_DELTA_DELETIONS_PATH
# returns a JSON file path with an array of all inventory entries
get_env INVENTORY_ENTRIES_PATH
计算部署 BOM
部署材料清单 (BOM) 表示作为单个变更请求的一部分部署的所有工件。 计算部署增量后,管道将根据这些项创建部署 BOM。
收集证据摘要
将根据在导致部署的相关构建期间创建的所有证据创建证据摘要。 部署期间创建的证据本身也会添加到摘要中。 证据摘要将添加到变更请求的描述中。 缺省情况下,证据摘要包含在 CI 管道中收集的构建时证据以及在当前 CD 管道执行期间收集的证据。
以下指示信息仅适用于以生产环境为目标的 CD 管道。 使用 target-environment-use 标志来确定环境是指定为 pre_prod 还是 production。
先决条件: 在以 pre_prod 环境为目标的 CD 管道中,将 pre-prod-evidence-collection 标志设置为 1。 这支持在由 CD 管道部署的所有资产的证据锁定器中收集和存储构建时证据,从而在预生产环境上执行部署。 缺省情况下,对于指定为 pre_prod 的环境,pre-prod-evidence-collection 标志设置为 1。
在以生产环境为目标的 CD 管道中,将 prod-evidence-collection 前标志设置为 1。 这使以生产环境为目标的 CD 管道能够检索在部署到生产前环境期间收集的证据。 缺省情况下,对于指定为生产的环境,pre-prod-evidence-collection 标志设置为 0。
一旦 pre-prod-evidence-collection 标志设置为 1,针对生产环境的 CD 管道生成的变更请求将在 验证记录 字段中包含对预生产环境中的变更请求标识的引用。
有关更多信息,请参阅 证据摘要。
准备并创建变更请求
必须通过变更请求来跟踪更改 基线 的所有内容。 这些更改包括对现有代码级别的更新,对配置的更改以及对工作程序节点的更新。 同级复审合规性 数据的收集基于可在库存,证据锁定程序和事件问题存储库中访问的数据。
使用 get_env CHANGE_REQUEST_ID 在后续阶段中利用变更请求标识的值。
请勿更改使用 set_env 的变量值,因为这仅用于内部执行。
此步骤通过根据 提升拉取请求 字段附加可用合规性数据来创建变更请求。 根据收集的合规性状态中的可用证据来计算 部署就绪情况。
如果生产部署中捕获了生产前证据,则会将生产前变更请求与生产变更请求关联起来。 有关更多信息,请参阅 变更请求中包含的数据。
可通过专用的变更请求监听器预先创建多个变更请求,以支持不同的 部署配置,包括向多个区域、目标和集群进行部署。 这些预先创建的变更请求在获得批准后,可即时传递至部署管道,该管道利用预先计算的信息来加速实际部署过程。
检查变更请求核准
如果每次合规性检查都成功 (例如,单元测试,代码风险分析器任务,分支保护和检测私钥),那么将自动核准变更请求并成功运行该任务。 有关更多信息,请参阅 自动化变更管理。
如果一致性检查失败,那么不会核准变更请求状态。 您可以 手动核准变更请求,并将 change-request-id 添加到环境属性以在下一次运行时使用先前创建的变更请求。 您还可以手动核准变更请求并添加紧急标签。
部署
在部署阶段,管道会将构建的工件部署到一个环境中,如暂存或生产环境。 可以在以下源中找到这些阶段的变量和凭证:
- 来自管道 UI 的变量 (
get_env)
编辑属性
有关如何访问这些变量的更多信息,请参阅 定制脚本。
验收测试
您可以运行一组自动化测试,以验证部署是否成功并按预期工作。 出于可跟踪性目的,请确保测试日志包含对正在测试的代码级别或映像的引用。
更改请求关闭
部署的详细信息将上载到关闭摘要更改任务,然后该任务将关闭更改请求。 close_category 将添加到“关闭变更请求”任务,并具有以下值:
- 成功(如果已部署就绪,且 CD 部署成功)
- 成功处理问题 (如果摘要有问题,那么部署未就绪,CD 部署发生紧急情况)
库存结束
有关库存结束的更多信息,请参阅 库存。
重新部署应用程序
概述
若应用程序在基础设施变更后发生崩溃或行为异常,可强制重新部署以解决问题。
在手动触发 CD 管道运行时 force-redeploy=true 使用此选项,以覆盖默认的变更检测行为。 此设置指示管道重新部署完整库存,即使未检测到任何新变更。
默认行为(不强制重新部署)
当未设置或设置 false 为 force-redeploy 时,管道仅在目标环境的库存存储库中检测到新变更时才会部署。
-
CD管道启动,并用管道运行ID标记当前提交。
-
管道从该标签读取对应环境分支的内容。
-
该管道计算当前提交与关联于该
<target-environment>_latest标签的提交之间的部署差异。 -
管道评估增量:
- 如果增量为空,则管道停止运行且不会进行部署。
- 如果增量包含更改,则管道继续执行。
-
该管道部署了增量中标识的变更。
-
部署成功后,管道会将
<target-environment>_latest标签附加到新提交上。
强制行为(伴随强制重新部署)
当 force-redeploy 设置为 true 时,管道将跳过增量验证,并重新部署完整的库存,无论是否检测到变更。 此方法可确保将完整的应用程序状态重新应用到部署目标。
- CD管道启动,并用管道运行ID标记当前提交。
- 管道从该标签读取对应环境分支的内容。
- 管道计算部署增量,在此场景下通常为空。
- 该
force-redeploy=true设置会导致管道跳过增量检查并继续执行。 - 该管道将整个应用程序状态从分支重新部署。
- 成功重新部署后,管道会将 标签
<target-environment>_latest附加到刚刚部署的提交上。
过程
-
启动新的手动CD 管道运行。
-
在管道配置中,将
force-redeploy环境变量设置为true。 -
运行该管道。
回滚部署
概述
回滚操作可撤销先前部署,并在部署导致系统不稳定、故障或合规性问题时,将应用程序恢复至已知状态。 回滚操作通常用于恢复服务可靠性、确保配置一致性或维持合规性。
有三种回滚方法可供选择,每种方法适用于不同的恢复场景:
- 完全回滚:通过引用变更请求 ServiceNow ID,恢复到最后已知良好配置。 推荐用于受控且可审计的恢复。
- 使用GitOps进行完整回滚:通过在库存仓库中手动撤销提交来恢复先前状态。 由于合规处理能力有限,不建议使用。
- 内联回滚:当执行错误发生时,在同一管道运行内回滚失败的部署。
完全回滚
回滚管道概述
此管道允许您通过指定特定 ServiceNow 变更请求ID(例如)回滚至先前已知的 CHG-12345 良好配置。
此变更请求ID作为成功部署的唯一标记,是回滚管道的必填输入项。
您可以通过两种方式查找先前部署的变更请求ID:
- ServiceNow:定位您要恢复的部署的变更请求。
- 库存仓库:由于库存状态由源代码控制管理,每次部署都通过提交进行唯一标识。 您可以找到想要回退的提交,并识别与该提交关联的
CHG-***标签。
回滚管道包含以下阶段:
prod-rollback-startprod-setupprod-rollback-change-requestprod-deploymentprod-acceptance-testsprod-rollback-finish
管道运行使用 rollback-change-request-id 环境属性中的信息来创建新的变更请求。
为保持合规性,管道重新开启与先前部署相关的问题。 这些问题已附加到新的变更请求中,其原始截止日期保持不变。 成功的回滚操作将库存中的 标签 _latest 移至上一个提交。
创建回滚管道
使用 触发 cd-rollback-listener 回滚至最后已知良好版本。
- 前往您的CD管道。
- 添加手动触发器或复制手动CD触发器。
- 编辑触发器并将监听器设置为
cd-rollback-listener。 - 选择保存。
- 为每个所需区域和目标环境组合创建独立的触发器。
触发回滚管道
回滚管道运行使用以下环境属性:
| 环境属性 | 描述 |
|---|---|
rollback-change-request-id |
(必填) 您要回滚的已完成部署的变更请求ID。 |
rollback-limit |
可回滚的最大部署次数。 默认值为 1(最后一次完成的部署)。 |
region |
回滚区域。 |
target-environment |
回滚的目标环境(例如,测试环境或生产环境)。 |
除非满足以下条件,否则管道终止:
rollback-change-request-id必须是同一区域和目标环境下已完成部署的ID。- 与之
rollback-change-request-id相关的部署版本号不得早于由回滚限制指定的部署次数。
Tekton PIPELINE_NAME 环境属性决定运行是部署还是回滚。
cd-rollback-pipeline回滚的默认值。cd-pipeline部署的默认值。
您可以使用此属性自定义分支逻辑。
使用完整回滚 GitOps
使用回滚功能的概述 GitOps
使用持续部署管道,通过执行将更改回滚到 Git 特定版本的操作 commit-id,将库存的先前版本部署到目标环境。
由于您直接在库存库中回滚提交,而非通过变更 ServiceNow 请求ID触发回滚管道,此操作不会自动重新开启之前的合规问题或管理其截止日期。
当触发时,CD管道将执行以下步骤完成重新部署:
- 管道启动并为当前提交(即回退提交)添加管道运行ID标签。
- 管道从该标签读取对应环境分支的内容。
- 该管道计算当前提交与关联于该
<target-environment>_latest标签的提交之间的部署差异。 - 成功部署后,该
<target-environment>_latest标签被移至新的(回退)提交。
创建回滚升级拉取请求
- 在库存中识别出您想要回滚到的部署
commit-id版本。 - 将仓库状态回退至该提交。
- 创建拉取请求以恢复已撤销的状态。
以下示例通过使用命令展示了这种情况 git。
-
列出提交和标签以查找最后已知良好状态的提交ID(例如
refs/tags/8)# /c/usr/devsecops/compliance-inventory (master) $ git show-ref --tags ... 83f7a87ee59185eaeac554bd3abeebfd2c1b4ad8 refs/tags/8 ... 1914a125e76aa97c497f4bd2c2f455b58cf079b8 refs/tags/prod_latest -
列出当前状态 (
refs/tags/prod_latest) 与目标状态 (refs/tags/8) 之间的所有提交。# /c/usr/devsecops/compliance-inventory (master) $ git rev-list --no-merges HEAD...83f7a87ee59185eaeac554bd3abeebfd2c1b4ad8 67cc8babdff3e09c1f0e632f897798c1b5424f38 6fab5ce3d60590cd858206424ecfd7d3a8c9ceb4 ... -
将库存状态回滚至目标提交(
refs/tags/8)。# /c/usr/devsecops/compliance-inventory (master) $ git revert -n $(git rev-list --no-merges HEAD...83f7a87ee59185eaeac554bd3abeebfd2c1b4ad8) -
提交新状态。
# /c/usr/devsecops/compliance-inventory (master|REVERTING) $ git commit -m "revert master to 83f7a87ee59185eaeac554bd3abeebfd2c1b4ad8" [master af82538] revert master to 83f7a87ee59185eaeac554bd3abeebfd2c1b4ad8 -
将更新推送到主分支。
# /c/usr/devsecops/compliance-inventory (master) $ git push --set-upstream origin master ... To [https://us-south.git.cloud.ibm.com/jaunin.b/compliance-inventory.git](https://us-south.git.cloud.ibm.com/jaunin.b/compliance-inventory.git) 67cc8ba..af82538 master -> master ...
触发持续部署管道
-
为回滚晋升变更创建拉取请求。
-
审查并合并拉取请求。
-
在您的持续交付工具链中触发手动CD 管道运行。
内联回滚
内联回滚概述
此模式将在同一管道运行上下文中回滚当前部署。 当部署或验收测试阶段发生错误或故障时,导致部署尝试被标记为失败,则需要执行此操作。
若环境 rollback-enabled 属性设置为 1,且在部署或验收测试阶段发生失败,则内联回滚将自动运行。
如果触发回滚,CD 管道将运行在您的 . rollback``.pipeline-config.yaml yaml 文件中为 segment 定义的操作。 如果文件中未定义某个 rollback 分段,则默认实现将运行并提示您提供回滚脚本。
示例回滚脚本位于 .pipeline-config.yaml:
rollback:
image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.74
script: |
#!/usr/bin/env bash
if [[ "$PIPELINE_DEBUG" == 1 ]]; then
trap env EXIT
env
set -x
fi
source $WORKSPACE/$PIPELINE_CONFIG_REPO_PATH/scripts/deploy_setup.sh
source $WORKSPACE/$PIPELINE_CONFIG_REPO_PATH/scripts/rollback.sh
内联回滚期间设置的属性
rollback-status: 指示回滚步骤的状态。 可能的值为:[notRun, success, failure]rollback-exit-code回滚步骤的退出代码。 如果回滚未执行,则此值为空。default-rollback-executed: 若默认实现(即提示输入脚本)已运行,则设置true为。 该值默认为空。pipeline-execution-status: 指示整体管道运行状态。 可能的值为:[successful_deployment, failed_deployment_failed_rollback, failed_deployment_successful_rollback]
实现部署的可追溯性
当合并请求或合并请求被合并时,系统会提供清晰的后续操作,从而提高透明度和可追溯性。 它会自动更新PR的部署状态,让利益相关者无需访问流水线详情即可轻松跟踪修复或功能的进度。 这种精简的方法不仅提高了透明度,还提高了可追溯性,减少了收集和验证信息所需的工作量。 部署成功后,部署中包含的拉取请求将带有格式为 deploy:{region}:{env} 的标签。
在CD管道中启用此功能需要选择加入标志 deployment-traceability。 用户可在需要时通过将标记设置为 1 来激活部署可追溯性。
为了进一步支持此功能,如果用户想要在应用库中为 PR 添加标签提供特定的令牌,可以使用以下环境属性来指定 Git。 Git查找顺序如下:
- 存储库特定令牌的现有环境属性:
git-token-$repo_name-$repo_org。 - 组织特定令牌的新环境属性:
git-token-$repo_org。