如何批量迁移Azure DevOps实例间项目的200+CI/CD管道?
批量迁移Azure DevOps CI/CD管道及文件夹的可行方案
方法一:通过Azure DevOps REST API实现全量迁移
步骤1:导出源实例的管道与文件夹结构
- 调用API获取所有管道元数据:
该接口会返回所有管道的ID、名称、所在文件夹路径等信息。GET https://dev.azure.com/{源组织名}/{源项目名}/_apis/pipelines?api-version=7.1-preview.1 - 逐个获取管道完整定义:
遍历每个管道ID,调用接口导出完整配置(YAML或经典管道的详细结构):
将结果按文件夹路径分类保存,记录每个管道的归属路径。GET https://dev.azure.com/{源组织名}/{源项目名}/_apis/pipelines/{管道ID}?api-version=7.1-preview.1
步骤2:在目标实例创建对应文件夹层级
- 按导出的文件夹路径,从父到子依次调用API创建文件夹:
请求体示例:POST https://dev.azure.com/{目标组织名}/{目标项目名}/_apis/pipelines/folders?api-version=7.1-preview.1{"path": "/父文件夹/子文件夹"}
步骤3:批量导入管道到目标实例
- 遍历保存的管道定义,调用导入接口:
请求体中包含管道名称、目标文件夹ID(可通过查询文件夹API获取)、完整定义内容。由于已提前创建同名服务连接,无需额外修改连接配置。POST https://dev.azure.com/{目标组织名}/{目标项目名}/_apis/pipelines?api-version=7.1-preview.1
方法二:使用Azure DevOps CLI快速迁移(适合YAML管道为主的场景)
前期准备
- 安装Azure DevOps CLI扩展:
az extension add --name azure-devops - 配置源实例默认值:
az devops configure --defaults organization=https://dev.azure.com/{源组织名} project={源项目名}
导出管道
- 先获取所有管道ID列表,循环导出每个管道的YAML配置:
for id in $(az pipelines list --query "[].id" -o tsv); do name=$(az pipelines show --id $id --query "name" -o tsv) folder=$(az pipelines show --id $id --query "folder" -o tsv) mkdir -p "./pipelines$folder" az pipelines show --id $id --output yaml > "./pipelines$folder/$name.yaml" done
导入管道到目标实例
- 配置目标实例默认值:
az devops configure --defaults organization=https://dev.azure.com/{目标组织名} project={目标项目名} - 先创建所有目标文件夹:
find ./pipelines -type d | grep -v "^./pipelines$" | while read dir; do folder_path=${dir#./pipelines} az pipelines folder create --path "$folder_path" --yes done - 循环导入YAML管道:
find ./pipelines -name "*.yaml" | while read file; do folder_path=$(dirname "$file" | sed 's/^./pipelines//') name=$(basename "$file" .yaml) az pipelines create --name "$name" --folder-path "$folder_path" --yaml-path "$file" --yes done
方法三:PowerShell脚本自动化(支持经典+YAML混合管道)
编写PowerShell脚本实现端到端迁移,核心逻辑包括:
- 用PAT(个人访问令牌)完成源/目标实例的身份认证
- 递归获取源实例的所有文件夹和管道信息
- 在目标实例批量创建文件夹结构
- 逐个导入管道定义,经典管道需保留变量、触发器、任务配置等细节
关键注意事项
- PAT权限:源实例需授予
Build (Read)权限,目标实例需授予Build (Edit)权限 - 依赖检查:经典管道迁移前,确认目标实例已安装所有用到的自定义任务,变量组需提前同步
- 资源引用:YAML管道需确保仓库、模板等资源在目标实例已存在,服务连接名称与源一致
- 测试验证:迁移完成后,选取不同文件夹下的管道测试运行,确认配置生效
内容的提问来源于stack exchange,提问作者Antony
相关产品推荐
相关产品推荐

