使用GitHub Copilot现代化代理进行批量升级

通过批处理升级,可以同时跨多个存储库应用一致的现代化计划。 本文介绍如何在企业规模上有效地升级多个应用程序。

通过使用批处理升级,可以:

  • 使用相同的升级目标同时升级多个应用程序
  • 跨应用程序使用类似的升级模式应用一致的模式
  • 在将任务委派给云编码代理时,充分利用并行执行。

批量升级具有以下优势:

  • 一致的执行:

    • 标准化方法:在所有存储库中应用相同的现代化模式。
    • 减少可变性:确保类似应用程序的一致升级路径。
    • 可重用策略:跨应用程序使用组织特定的技能。
  • 规模和效率

    • 并行处理:使用云编码代理同时处理多个存储库。
    • 自动化工作流:与 CI/CD 管道集成,实现计划的现代化。
    • 节省时间:将现代化总时间从数周减少到数小时。

先决条件

  • 现代化命令行界面 (CLI)
  • 建议但不必需完成批量评估
  • 所有存储库都使用相同的编程语言(Java或.NET)。
  • 访问要升级的所有存储库。
  • 已配置GitHub身份验证(gh auth login)。

重要

批量升级中的所有存储库都必须使用相同的编程语言。 如果存储库使用不同的语言,批处理升级会将存储库标记为失败,并跳过它。

配置存储库

现代化代理支持多种方法来指定要升级的存储库:

  • 当前文件夹:升级当前工作目录中的项目。
  • 手动输入:直接输入本地目录路径或远程 Git URL。
  • 存储库配置文件:使用列出所有存储库的 JSON 配置文件。

存储库配置文件

对于跨多个存储库的批处理操作,请创建 JSON 配置文件以列出所有存储库。 例如,在工作目录中创建它 .github/modernize/repos.json ,或提供自定义路径。

小窍门

对于示例存储库,请首先对其进行分叉,并确保你具有将作业委托给云编码代理的管理员权限。

简单格式 (存储库数组):

[
  {
    "name": "PhotoAlbum-Java",
    "url": "https://github.com/Azure-Samples/PhotoAlbum-Java.git"
  },
  {
    "name": "ZavaSocialFrontEnd",
    "url": "https://github.com/Azure-Samples/ZavaSocialFrontEnd"
  }
]

完整格式 (包含分支和本地路径):

{
  "repos": [
    {
      "name": "PhotoAlbum-Java",
      "url": "https://github.com/Azure-Samples/PhotoAlbum-Java.git",
      "branch": "main"
    },
    {
      "name": "local-project",
      "path": "/absolute/path/to/project"
    }
  ]
}

每个存储库条目支持以下字段:

领域 说明 必需
name 存储库的友好名称(用于报表和仪表板)。 是的
url HTTPS 或 SSH 格式的 Git 克隆 URL。 其中一个urlpath
path 绝对本地目录路径。 其中之一urlpath
branch 克隆后要签出的分支。
description 人工可读说明。

小窍门

你可以包括来自不同组织的存储库,只要你有权访问,就可以使用不同的身份验证方法。

在互动模式下选择“从配置文件”时,新式化代理会自动检测repos.json位于.github/modernize/repos.json的文件。 还可以提供自定义路径。

选择执行模式

批处理升级支持两种执行模式和两种交互方法:

执行模式

本地执行

  • 最适合:测试、较小的存储库集(1-5 存储库),或首选本地控制时。
  • 工作原理:在本地计算机上按顺序处理存储库。
  • 设置要求:除了基本先决条件之外,无需配置。
  • 支持:Git URL 和本地路径存储库。

云编码代理委派

  • 最适合:企业规模操作、大型组合(5+ 存储库)或并行处理。
  • 工作原理:将任务提交到GitHub云编码代理,以便在云中并行执行。
  • 需要设置:每个存储库中的 MCP 服务器配置(在安装期间配置)。
  • Supports:仅包含GitHub(github.com)URL 的存储库。 不支持本地路径和非GitHub提供程序。

重要

云编码代理委派要求存储库具有 GitHub (github.com) 存储库 URL。 在云委托期间,会跳过那些使用本地路径指定的存储库或托管在非GitHub托管服务(例如GitLab、Azure DevOps)上的存储库。 对这些存储库使用本地执行。

小窍门

通过并行处理存储库,云编码代理委派可以减少从小时到分钟的总现代化时间。

交互方法

交互模式 (TUI)

  • 引导性菜单和提示体验。
  • 最适合首次使用者或当您想要查看选项时。
  • 支持本地和云执行。

非交互模式 (CLI/无外设)

  • 基于命令行的完全自动化。
  • 最佳用于 CI/CD 管道和自动化。
  • 支持使用 --delegate cloud 标志的本地和云执行。

注释

可以将任何执行模式与任何交互方法组合在一起。 例如:

  • modernize →选择“升级”(交互式,本地)
  • modernize 选择“升级”→“委托到云代理”(交互式,云)
  • modernize upgrade "Java 21" --source ./repos.json (非交互式,本地)
  • modernize upgrade "Java 21" --source ./repos.json --delegate cloud (非交互式云)

批处理升级的工作原理

批处理升级工作流:

  1. 语言识别:从第一个存储库中自动识别项目语言(Java 或 .NET)。
  2. 计划创建:根据提示创建升级计划或使用最新的 LTS 版本。
  3. 执行:将升级应用到每个存储库。
  4. 验证:生成并验证每个存储库的更改。

运行批量升级

配置存储库并选择执行模式后,启动批处理升级。

交互模式(本地升级)

  1. 运行现代化工具:

    modernize
    
  2. 从主菜单中选择 “升级 ”。

    新式化 CLI 的屏幕截图,其中显示了终端中带有“升级”选项的主菜单。

  3. 选择如何指定目标存储库。 从配置文件中选择以使用repos.json文件。

    新式化 CLI 的屏幕截图,其中显示了终端中的源类型选择。

    小窍门

    还可以选择 “手动输入 ”以直接输入本地路径或远程 Git URL,或 选择“当前”文件夹 以升级当前目录中的项目。

  4. repos.json如果在默认位置检测到该文件,代理会自动填充该文件。 否则,请输入配置文件的路径,然后按 Enter

  5. 默认情况下,所有存储库均处于选中状态。 取消选择想要跳过的任何存储库,然后按 Enter 确认选择。

    • 使用箭头键 进行导航,然后按 空格 键切换单个存储库。

    新式化 CLI 的屏幕截图,其中显示了终端中的“选择存储库”列表。

  6. 选择执行模式。 选择 本地升级

    新式化 CLI 的屏幕截图,其中显示了终端中的“本地升级”菜单选项。

  7. 输入升级目标提示(例如,Java 21.NET 10),或按 Enter 接受默认版本(最新 LTS 版本)。

  8. 代理自动:

    • 根据请求创建升级计划。
    • 按顺序将计划应用于每个存储库。
    • 在更改后生成并验证每个存储库。
    • 显示每个存储库的进度和摘要。

    新式化 CLI 的屏幕截图,其中显示了终端中每个存储库的升级进度。

交互模式(委派给云编码代理)

先决条件:配置 MCP 服务器

在运行升级之前,请在每个存储库中配置GitHub Copilot现代化 MCP 服务器。

对于Java应用程序,请在存储库设置的云编码代理部分添加此配置:

{
  "mcpServers": {
    "app-modernization": {
      "type": "local",
      "command": "npx",
      "tools": [
        "*"
      ],
      "args": [
        "-y",
        "@microsoft/github-copilot-app-modernization-mcp-server"
      ]
    }
  }
}

screenshot of GitHub,其中显示了“存储库编码代理设置”窗格,其中突出显示了 MCP 配置部分.

步骤

  1. 运行现代化工具:

    modernize
    
  2. 从主菜单中选择 “升级 ”。

    新式化 CLI 的屏幕截图,其中显示了终端中带有“升级”选项的主菜单。

  3. 选择如何指定目标存储库。 从配置文件中选择

    新式化 CLI 的屏幕截图,其中显示了终端中的源类型选择。

  4. repos.json如果在默认位置检测到该文件,代理会自动填充该文件。 否则,请输入配置文件的路径,然后按 Enter

  5. 默认情况下,所有存储库均处于选中状态。 取消选择想要跳过的任何存储库,然后按 Enter 确认选择。 使用箭头键进行导航,然后按 空格 键切换单个存储库。

    新式化 CLI 的屏幕截图,其中显示了终端中的存储库列表。

  6. 选择执行模式。 选择 “委托到云代理”。

    新式化 CLI 的屏幕截图,其中显示了终端中“委托到云编码代理”菜单选项。

  7. 输入升级目标提示(例如,Java 21),或按 Enter 接受默认值。

  8. 代理自动:

    • 为每个存储库创建升级计划。

    • 为每个存储库提交一个云编码代理任务。

    • 在云中并行且独立地运行作业。

    • 显示每个存储库的作业 ID 和 PR URL。

      新式化 CLI 的屏幕截图,其中显示了将升级委派到终端中的云编码代理的进度。

    • 将任务委托给 AgentHQ 进行并行执行。

      GitHub 的屏幕截图,其中在代理窗格中显示升级任务已委托给 AgentHQ。

    • 实时跟踪每个任务进度。

      GitHub的截图,显示了代理窗格中单个云编码代理升级任务的进度跟踪。

    • 显示每个已完成任务的升级摘要。

      GitHub 的屏幕截图,显示“代理”窗格中各个 Cloud Coding Agent 任务的升级摘要。

非交互模式 (CLI)

对于自动化和 CI/CD 集成,请使用 modernize upgrade 以下命令:

使用存储库配置文件在本地升级:

modernize upgrade "Java 21" --source .github/modernize/repos.json

通过直接指定源来升级多个存储库:

modernize upgrade "Java 21" --source https://github.com/org/repo1 --source https://github.com/org/repo2

使用云编码代理进行升级:

modernize upgrade "Java 21" --source .github/modernize/repos.json --delegate cloud

注释

有关批量无外设执行和更多 CLI 选项,请参阅 CLI 命令参考中的 “多存储库配置 ”部分。

查看结果

批处理升级完成后:

  1. 检查终端中显示的聚合报表

  2. 查看各个存储库更改

    cd <repository-name>
    git status
    git diff
    
  3. 为成功升级创建拉取请求

    cd <repository-name>
    gh pr create --title "Upgrade to Java 21" --body "Automated upgrade by modernization agent"
    

批处理升级疑难解答

常见问题

存储库访问错误:

  • 使用 gh auth status 验证GitHub身份验证。
  • 请确保有权访问repos.json中的所有存储库。

语言不匹配错误:

  • 请确保 repos.json中的所有存储库使用相同的语言(Java或.NET)。
  • 为不同语言创建单独的批处理作。

克隆失败:

  • 验证存储库 repos.json URL 是否正确且可访问。
  • 请确保对所有存储库具有适当的访问权限。
  • 检查网络连接和 VPN 设置。

升级后构建失败:

  • 查看汇总报告中的构建错误消息。
  • 检查是否需要更新其他依赖项。
  • 验证第三方库与新版本的兼容性。

单个存储库故障:

  • 即使单个存储库失败,批处理也会继续。
  • 查看聚合报表以识别失败的存储库。
  • 检查错误日志中的特定错误消息。
  • 分别重试失败的存储库。

云编码代理失败:

  • 检查GitHub Actions权限和配额限制。
  • 对于 .NET Framework,请确保正确设置Windows运行程序配置。

后续步骤

完成批量升级后,可以:

继续改进:

了解详细信息:

提供反馈

我们重视你的输入! 如果您对批处理升级或现代化代理有任何反馈,请在 github-copilot-appmod 仓库中提出一个问题 或使用 GitHub Copilot 现代化反馈表单