将 Continuous Delivery 资源迁移至其他区域
您可以使用 @ibm-cloud/cd-tools 工具复制资源,将 Continuous Delivery 资源(包括工具链、工具集成、Tekton Delivery Pipeline 以及 Git Repos and Issue Tracking 项目和组)迁移至其他区域。
支持的资源
支持将以下资源迁移到另一个区域:
| 资源 | 是否支持迁移 |
|---|---|
| 工具链 | 是 1 |
| Git Repos and Issue Tracking | 是 2 |
| Delivery Pipeline(Tekton) | 是 3 |
| Delivery Pipeline(经典版) | 否 |
| DevOps Insights | 否 |
| 其他工具集成 | 是 |
概述
将 Continuous Delivery 资源从一个区域迁移到另一个区域的推荐方法是:使用本迁移指南中所述的迁移工具 , 将资源复制到新区域。 您的原始资源仍可在原区域使用,您可继续使用这些资源,直至在新区域验证资源并准备就绪后再进行迁移。
本指南介绍了将 Continuous Delivery 资源迁移到另一个区域的建议步骤:
- 将 Git Repos and Issue Tracking 项目复制到新区域(如适用)
- 将工具链或Tekton管道中存储的机密导出至 Secrets Manager (如适用)
- 将工具链(包括Tekton管道)复制到新区域
- 验证新区域中的资源
- 禁用原始资源
若您正在迁移 Git Repos and Issue Tracking 项目,则在将项目复制到新区域后,原始项目所做的任何更改都不会反映在副本中。 因此,您应通知团队迁移正在进行中,以确保迁移期间所做的更改不会丢失。
迁移工具以命令行工具的形式提供,具体表现为npx命令。npx ( Node Package Execute)是随npm提供的实用工具 Node.js,它能自动下载模块及其依赖项,并在您的机器上运行。
@ibm-cloud/cd-tools npx 实用程序提供以下命令:
- copy-project-group:将一组 Git Repos and Issue Tracking 项目复制到另一个区域
- copy-toolchain:将工具链(包括工具集成和Tekton管道)复制到另一个区域或资源组
- export-secrets:将直接存储在工具链或管道中的机密导出至 Secrets Manager
以下各节将详细描述迁移过程的每个步骤。
限制
工具链和 Delivery Pipeline 的限制
资源从一个区域迁移到另一个区域受以下限制。
- 经典管道 不被支持。
- DevOps Insights 不支持。
- 不会复制直接存储在工具链或 Delivery Pipeline (环境属性或触发器属性)中的秘密。
export-secrets命令将秘密导出到一个 Secrets Manager 实例中,用 秘密引用 替换存储的秘密。 支持隐秘引用。 - Tekton 管道 webhook 触发器密钥不会被复制,因为 webhook 触发器密钥不支持引用。 复制工具链后,您需要添加密钥。
- Tekton 管道运行历史记录、日志和资产将不会被复制。 您可以暂时保留原始管道以保留历史记录。
- GitHub 和 Git Repos and Issue Tracking 工具集成配置的 OAuth 类型验证将自动转换为使用执行复制的用户(API 密钥所有者)的 OAuth 身份,而不是原始用户。 此举旨在简化复制操作。 复制后,您可以重新配置工具集成以使用其他用户。
- Git Repos and Issue Tracking 使用个人访问令牌 (PAT) 进行身份验证的工具集成将自动转换为使用 OAuth。 复制后,您可以重新配置工具集成以再次使用PAT。
Git Repos and Issue Tracking 的限制
以下限制仅适用于您迁移 Git Repos and Issue Tracking 项目的情况。
- 个人项目不予支持。 如果在 个人命名空间下创建了项目,可以 将个人项目移动到组中,或者 将个人命名空间转换为组,然后使用新的 URL 更新工具链中的引用。 建议将项目按组存储,因为组功能支持多管理员协作,并能确保项目在长期运行中保持更好的连续性。
- 项目复制使用 GitLab 直接传输功能,该功能有一定的 限制。
- 复制大型项目,或包含大文件或大量资源的项目,可能需要花费时间。
- 由于每个 Git Repos and Issue Tracking 区域都是独立的,您的项目用户可能尚未存在于目标区域中。 该
copy-project-group命令将确保用户存在于新区域中,但可能与目标区域中的其他用户发生用户名冲突。 若发生用户名冲突,目标区域的用户名可通过添加后缀进行微调。
先决条件
要执行迁移,您需要具备以下条件:
- 一个具有以下IAM访问权限的 IBM Cloud API密钥。 API 密钥必须是用户 API 密钥。 不支持服务 ID API 密钥。
- 复制源工具链的查看者访问权限
- 在目标区域创建新工具链的编辑器访问权限
- 其他具有工具集成且通过IAM服务间授权的 IBM Cloud 服务实例的管理员访问权限,例如 Secrets Manager、等 Event Notifications。
- 访问工具链中工具集成所引用的任何 GitHub 或 Git Repos and Issue Tracking 仓库,并拥有读取仓库和创建 webhook 的权限。 这是创建管道 Git 类型触发器所必需的,该类型触发器需要在仓库上添加webhook以触发管道,同时确保管道在执行过程中能够克隆仓库。 请注意,服务 ID API 密钥不能代表用户进行授权。
- 在目标区域和资源组中需要存在 Continuous Delivery 服务实例,才能正确创建工具链副本。 请注意,Continuous Delivery 的功能(如 Delivery Pipeline、Git Repos and Issue Tracking 等)受限于与工具链位于同一区域和资源组中的 Continuous Delivery 实例的计划。 了解更多信息
- 源区域和目标区域中 Git Repos and Issue Tracking 服务的个人访问令牌(PAT),具有
api以下作用域: 这些仅在迁移 Git Repos and Issue Tracking 项目时需要。
重要注意事项
在开始迁移之前,您必须仔细阅读以下重要注意事项。
- 计费注意事项
- 在迁移过程中,您需要在目标区域和资源组中创建一个新的 Continuous Delivery 实例,以便在目标区域启用工具链、管道和项目。 您可能还希望在完成向新区域的迁移之前,将源区域中的原始资源保留可用状态。 如果将 Continuous Delivery 服务与专业计划一起使用,请注意将根据每个实例中配置的授权用户数量对两个区域收费。 如果担心成本问题,可以在过渡到新区域后,将源区域 Continuous Delivery 实例中的计划更改为 Lite。 如果您超出了 精简版计划的限制,资源将只读。 不过,如果您想再次使用专业版,随时可以切换回去。 了解更多 关于 Continuous Delivery 计费和计划。
- 管道重复运行
- 在迁移过程中,您可以在目标区域创建新的管道。 如果这些管道中的定时触发器被设置为按计划自动运行,或 Git 触发器被配置为按 Git 事件(如 PR 或提交)自动运行,那么这些事件可能会触发重复的管道运行(一个在原管道中,一个在新管道中)。 为避免潜在干扰,复制的管道将默认禁用此类触发器。 建议管理这些触发器,确保每次仅启用一组。 当您对新管道的迁移感到满意后,即可启用该管道上的触发器,并禁用原始管道上的触发器。
- 硬编码假设
- 迁移后,您的 Git Repos and Issue Tracking 仓库(如果适用)将使用不同的 URL,您的工具链和管道将使用不同的 ID 和 URL。 在 Tekton 定义、脚本、环境属性或其他自动化中,可能会有一些关于 URL /ID 或资源位置的假设。 迁移后,您有责任更新这些内容。
安装依赖项
@ibm-cloud/cd-tools 实用程序在本地计算机上运行,需要安装以下依赖项。
macOS
运行以下命令在 macOS 上安装依赖项。
brew install node
brew tap hashicorp/tap
brew install hashicorp/tap/terraform
其他平台
在目标区域创建一个 Continuous Delivery 实例
要在新区域或资源组中成功复制工具链,应确保该区域和目标资源组中有 Continuous Delivery 服务实例。
要查看您的 Continuous Delivery 服务实例,请打开 资源列表 页面,然后在页面顶部的页眉中选择您的账户。 服务实例将在开发者工具部分显示。
若您尚未拥有 Continuous Delivery 实例,请参阅 《创建 Continuous Delivery 服务实例》。
复制 Git Repos and Issue Tracking 项目
此步骤仅适用于在 IBM Cloud 中使用 Git Repos and Issue Tracking 项目的情况。 若您不使用这些功能,可跳过此步骤。
如果使用 Git Repos and Issue Tracking 项目,则必须先将它们复制到新区域,然后再复制工具链和管道。 复制项目是在组一级进行的,也就是说,复制的是整个组。 小组是相关项目的集合。 组名是项目 URL 路径的一部分。 例如,对于项目 url https://us-south.git.cloud.ibm.com/my-group/my-project,组为 my-group。 请按照以下步骤复制您的项目和组。
-
确定要复制的组列表。
不支持在 个人命名空间中复制项目。 如果在 个人命名空间下创建了项目,可以 将个人项目移动到组中,或者 将个人命名空间转换为组,然后使用新的 URL 更新工具链中的引用。 建议将项目按组存储,因为组功能支持多管理员协作,并能确保项目在长期运行中保持更好的连续性。
将项目从个人命名空间移动到组:
- 按照 GitLab 文档中的步骤 创建新组并将项目转移到该组。
- 对于工具链中引用项目 repo 网址的每个工具集成,在工具集成菜单中选择“配置”更新工具集成,并将 Repository URL 字段更新为带有新组名称的新 URL。 保存整合。
- 如果您的 Tekton 管道引用了这些版本库中的管道定义,请更新定义以使用新的版本库 URL。
- 如果您的管道中有 Git 类型的触发器,请更新并重新保存触发器,以重新创建触发管道的网络钩子。
- 同样,更新部署脚本、配置、管道环境属性等中对 repo url 的任何其他引用。
-
对于每个组,运行来自 @ibm-cloud/cd-tools 的
copy-project-group命令,将该组复制到新区域。例如,以下命令使用提供的个人访问令牌 (PAT) 将
my-group组及其所有项目从华盛顿特区(美国东部)区域复制到达拉斯(美国南部)区域。npx @ibm-cloud/cd-tools copy-project-group -g my-group -s us-east -d us-south --st ${PAT_US_EAST} --dt ${PAT_US_SOUTH}请注意,对于大型团队或项目,此步骤可能需要时间。 要查看
copy-project-group命令的全部选项,请运行npx @ibm-cloud/cd-tools copy-project-group -h -
请确认组内项目已成功复制。
在继续之前,必须确保没有数据缺失。 确保将正确的用户纳入项目成员,并对项目中的数据(仓库、问题等)进行抽查,以确保数据完整无缺。 请注意,个人访问令牌未包含在副本中。 如果需要重新运行复制命令,则需要先删除或重命名已复制的组,或在再次复制时选择不同的名称。
复制工具链和Tekton管道
接下来,将您的工具链复制到新区域。 工具集成(包括Tekton管道)将包含在工具链副本中,具体限制详见上述“限制”部分所述。 您可以在 资源列表 页面 或平台自动化 下的 工具链 页面中找到您的工具链。
CRN
IBM Cloud 资源通过 云资源名称(CRN) 进行唯一标识。 您需要复制目标工具链的课程注册号(CRN)。 获取工具链的CRN有以下几种方式:
- 在“平台自动化 > 工具链”页面定位工具链,打开该工具链,点击 “详细信息”查看工具链详情,其中会显示CRN。
- 在 资源列表 页面定位工具链,点击工具链行展开详细信息面板,该面板将显示CRN。
- 使用 ibmcloud 命令行界面,您可以通过以下方式列出工具链及其 CRN:
ibmcloud resource service-instances --service-name toolchain --long - 使用 工具链应用程序接口
检查存储的工具链/管道秘密
工具链和 Tekton 管道可能在以下位置包含秘密,即 API 密钥或密码等敏感值:
- 工具集成属性,例如 Delivery Pipeline Private Worker 工具集成的服务 ID API Key 属性
- Tekton 管道环境特性
- Tekton 管道触发特性
配置密钥有两种方法:
- 直接存储在工具链或管道中
- 引用 存储在秘密存储服务(如 IBM Cloud Secrets Manager 或 IBM Cloud Key Protect.
复制工具链将自动包含 秘密引用,这些引用将在新工具链中保持不变。 不过,为了最大限度地降低泄漏敏感数据的风险,直接存储在工具链或管道中的机密将不会包含在工具链副本中。 您可以使用下一节介绍的 export-secrets 命令,也可以在复制后在复制的工具链或管道中再次手动输入秘密。
但请注意,如果不导出秘钥,在复制工具链时,某些工具集成可能会因为缺少所需的秘钥值而无法成功提供,可能需要在运行命令后手动重新创建。
首先,检查工具链或其 Tekton 管道是否包含任何运行时不引用的存储秘密:
npx @ibm-cloud/cd-tools export-secrets -c ${CRN} --check
将存储的工具链/管道秘密导出到 Secrets Manager
如果您的工具链或管道不包含任何存储的秘密,您可以跳过这一步,继续复制工具链。 将秘密导出到 Secrets Manager 会在 Secrets Manager 实例中创建秘密,同时也会修改原始工具链,将现有秘密转换为引用 Secrets Manager 中新建的秘密。 这将允许在复制工具链时保留秘密引用,是提高安全性的推荐做法。
为防止意外泄露秘密,应检查实例的 IAM 权限,确保只授予预期的读取权限。Secrets Manager 实例的 IAM 权限,确保只授予读取机密的预期访问权限。
要将存储在工具链或管道中的机密导出到 Secrets Manager,请按照以下步骤操作:
- 如果您还没有 Secrets Manager 实例,请 创建一个。 请注意,必须在与您将使用的 API 密钥相关联的账户中创建实例。
- 确保要使用的 API 密钥的所有者拥有在 Secrets Manager 实例中创建机密的 IAM 权限。
- 打开工具链和 Secrets Manager 工具集成,根据提示创建授权策略,然后创建工具集成。
- 运行
export-secrets命令以导出密钥:npx @ibm-cloud/cd-tools export-secrets -c ${CRN} - 出现提示时,从工具链中选择 Secrets Manager 实例来存储秘密。 如果您没有看到您的实例在列表中,它可能在不同的账户中。 确保使用的 API 密钥与实例的账户相同。
- 出现提示时,请为找到的每个秘密指定是否复制该秘密,以及要存储该秘密的名称和组,或按回车键接受默认值。
您可以根据需要多次运行该命令来导出所有机密。
复制工具链
要复制工具链,请运行 @ibm-cloud/cd-tools copy-toolchain 命令。 要查看可用选项,请运行
npx @ibm-cloud/cd-tools copy-toolchain -h
Usage: @ibm-cloud/cd-tools copy-toolchain [options]
Copies a toolchain, including tool integrations and Tekton pipelines, to another region or resource group.
Examples:
export IBMCLOUD_API_KEY='...'
npx @ibm-cloud/cd-tools copy-toolchain -c ${TOOLCHAIN_CRN} -r us-south
Copy a toolchain to the Dallas region with the same name, in the same resource group.
npx @ibm-cloud/cd-tools copy-toolchain -c ${TOOLCHAIN_CRN} -r eu-de -n new-toolchain-name -g new-resource-group --apikey ${APIKEY}
Copy a toolchain to the Frankfurt region with the specified name and target resource group, using the given API key
Environment Variables:
IBMCLOUD_API_KEY API key used to authenticate. Must be a user API key, with IAM permission to read and create toolchains and service-to-service authorizations in source and target
region / resource group
Basic options:
-c, --toolchain-crn <crn> The CRN of the source toolchain to copy
-r, --region <region> The destination region of the copied toolchain (choices: "br-sao", "eu-de", "eu-gb", "jp-tok", "us-south")
-a, --apikey <api_key> API key used to authenticate. Must be a user API key, with IAM permission to read and create toolchains and service-to-service authorizations in source and target
region / resource group
-n, --name <name> (Optional) The name of the copied toolchain (default: same name as original)
-g, --resource-group <resource_group> (Optional) The name or ID of destination resource group of the copied toolchain (default: same resource group as original)
-t, --tag <tag> (Optional) The tag to add to the copied toolchain
-h, --help Display help for command
Advanced options:
-d, --terraform-dir <path> (Optional) The target local directory to store the generated Terraform (.tf) files
-D, --dry-run (Optional) Skip running terraform apply; only generate the Terraform (.tf) files
-f, --force (Optional) Force the copy toolchain command to run without user confirmation
-S, --skip-s2s (Optional) Skip creating toolchain-generated service-to-service authorizations
-T, --skip-disable-triggers (Optional) Skip disabling Tekton pipeline Git or timed triggers. Note: This may result in duplicate pipeline runs
-C, --compact (Optional) Generate all resources in a single resources.tf file
-v, --verbose (Optional) Increase log output
-q, --quiet (Optional) Suppress non-essential output, only errors and critical warnings are displayed
copy-toolchain 的工作原理是首先将工具链转换为 Terraform (.tf) 文件,然后应用 Terraform 在目标区域创建新的工具链。 该命令将显示 Terraform 输出,并在创建工具链之前提示确认。 您可以在创建新工具链副本前查看 Terraform
输出。
示例
将带有 CRN crn:v1:bluemix:public:toolchain:au-syd:a/9d5d528aa786af01ce99593a827a05f0:69e8d78b-0d1a-49ed-9a46-3b4c1bb4f24a:: 的工具链从悉尼 (au-syd) 区域复制到东京 (jp-tok) 区域,复制时使用相同的资源组和工具链名称:
export IBMCLOUD_API_KEY='<your_api_key>'
npx @ibm-cloud/cd-tools copy-toolchain -c 'crn:v1:bluemix:public:toolchain:au-syd:a/9d5d528aa786af01ce99593a827a05f0:69e8d78b-0d1a-49ed-9a46-3b4c1bb4f24a::' -r jp-tok
将工具链复制到法兰克福 (eu-de) 区域,但通过参数而非环境属性提供 API 密钥:
npx @ibm-cloud/cd-tools copy-toolchain -c "${CRN}" -r eu-de --apikey '<your_api_key>'
将工具链复制到达拉斯(美国南部)区域,重命名为 toolchain-dallas:
export IBMCLOUD_API_KEY='<your_api_key>'
npx @ibm-cloud/cd-tools copy-toolchain -c "${CRN}" -r us-south -n 'toolchain-dallas'
批量复制工具链
要一次性复制多个工具链而不是逐个复制,可以使用 Bash 或类似脚本使用 ibmcloud cli 查询工具链,并使用 jq 等实用程序解析 JSON 输出,然后多次调用 copy-toolchain 命令。 下面是几个示例:
将位于多伦多(ca-tor)区域的当前账户中的所有工具链复制到达拉斯(us-south)区域。 这不会创建任何工具链,而是对工具链进行检查,并在发现任何可能导致 copy-toolchain 命令无法复制工具链的问题时发出通知。
for i in $(ibmcloud resource service-instances --service-name toolchain --location ca-tor --all-resource-groups -o json | jq -r '.[].crn'); do
npx @ibm-cloud/cd-tools copy-toolchain -c ${i} -r us-south --dry-run -f
done
将 my-resource-group 资源组中的所有工具链复制到法兰克福 (eu-de) 区域,并尽量减少输出 (-q, --quiet)。
for i in $(ibmcloud resource service-instances --service-name toolchain -g my-resource-group -o json | jq -r '.[].crn'); do
npx @ibm-cloud/cd-tools copy-toolchain -c ${i} -r eu-de -q
done
将所有名称以 "test-"开头的工具链复制到东京 (jp-tok) 区域。
for i in $(ibmcloud resource service-instances --service-name toolchain --all-resource-groups -o json | jq -r '.[] | select(.name | startswith("test-")) | .crn'); do
npx @ibm-cloud/cd-tools copy-toolchain -c ${i} -r jp-tok
done
错误后重试
如果在复制工具链时发生错误,复制的工具链可能不完整。 您可能需要重新尝试该命令。 要重新尝试,你可以:
- 删除部分创建的工具链,然后重新运行
copy-toolchain命令,或 - 重新运行该
terraform apply命令。
第一步copy-toolchain将源工具链序列化为Terraform(.tf)文件。 若未指定-d, --terraform-dir <path>路径,Terraform 文件将被放置在当前工作目录下的名为output-{id}的文件夹中,例如output-1764100766410。 您可以定位到最新的输出文件夹并重新运行terraform apply。 这将从上一个命令中断处继续执行。 当系统提示输入API密钥时,请指定与执行命令时相同的APIcopy-toolchain密钥。
$ cd output-1764102115772
$ terraform apply
var.ibmcloud_api_key
Enter a value: {api_key}
...
完成迁移
核实资源
将工具链、Tekton 管道和 Git Repos and Issue Tracking 项目(如适用)复制到新区域后,应在禁用或删除原始资源前验证它们是否已正确复制并正常运行。 请注意:
- Tekton 管道定时触发器和 Git 触发器未在复制管道中默认启用,以防止新管道和原始管道之间重复运行。 一旦您觉得满意,就可以启用新管道中的触发器,并禁用原管道中的触发器。
- 如果有任何 Webhook 类型的 Tekton 管道触发器,则需要重新配置触发器并重新输入密文。 该密文不支持 密文引用,也不会随管道一起复制。
- 在复制的 Git Repos and Issue Tracking 项目中拥有个人访问令牌的用户需要重新创建新的令牌,因为这些令牌没有被复制。
- Git Repos and Issue Tracking repos 的工具集成将转换为使用执行复制的用户的 OAuth 身份。 如果您想使用不同的身份,请使用该用户登录并重新保存工具集成,或改用个人访问令牌。
- 在 Tekton 定义、脚本、环境属性或其他自动操作中,可能会假设资源的 ID、URL 或位置。 建议您查看这些内容,以确保使用新的 ID、URL 和位置。
禁用原始资源
在确认复制的资源运行正常后,可以禁用原来的资源,以避免冲突或混乱。
- 对于 Tekton 管道,您可以禁用触发器,以避免不必要的管道运行,并向其他用户发出不再使用这些触发器的信号。
- 对于 Continuous Delivery 服务实例,如果您使用的是专业计划,您可以切换到精简版计划,以避免对原有资源的进一步收费。 如果您超出了精简版计划的限制,这可能会导致您的资源变成只读资源,但如果您需要再次使用这些资源,可以随时切换回专业版。
- 对于 Git Repos 和问题跟踪项目 (如果适用),可以归档原始项目,使其成为只读项目,防止用户进一步更改,还可以选择更新项目说明或 readme,以指明新项目的位置。
即使不打算保留原始资源,也可能希望保留原始资源一段时间作为备份,以防日后发现问题。 一旦您觉得满意,就可以删除原始资源。