你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用持续集成实现软件开发现代化

随着代码的开发、更新甚至删除,具有直观且安全的方法将这些更改集成到主代码分支中,开发人员可以提供价值。

作为开发人员,您可以进行小代码更改,将这些更改推送到代码存储库,并几乎即时获得有关质量、测试覆盖率和引入的 bug 的反馈。 此流程可让您更快、更自信地工作,同时减少风险。

持续集成(CI)是一种做法,其中源代码管理系统和软件部署管道已集成,为软件开发团队提供自动生成、测试和反馈机制。

当工程师创建 GitHub 拉取请求以向 CI 系统发出代码更改准备集成信号时,持续集成流程就会启动。 理想情况下,集成流程根据多个基线和测试验证代码。 然后,它向请求工程师提供有关这些测试状态的反馈。

如果基线检查和测试进展顺利,集成过程将生成并暂存将部署更新的软件的资产。 这些资产包括已编译的代码和容器映像。

持续集成可帮助您通过执行以下操作更快地交付高质量的软件:

  • 针对代码运行自动化测试,以提前检测中断性变更。
  • 运行代码分析以确保代码标准、质量和配置。
  • 运行符合性和安全检查,以确保软件没有已知的漏洞。
  • 运行验收或功能测试,以确保软件按预期运行。
  • 提供有关检测到的问题的快速反馈。
  • 在适用的情况下,生成包含更新代码的可部署资产或包。

自动实现与管道的持续集成

若要实现持续集成,请使用软件解决方案来管理、集成和自动化该过程。 一种常见做法是使用持续集成管道。

持续集成管道涉及提供以下功能的软件(通常是云托管的):

  • 用于运行自动测试的平台。
  • 合规性扫描。
  • 报告。
  • 构成持续集成过程的其他所有组件。

在大多数情况下,管道软件会与源代码管理系统集成,这样当创建拉取请求或将软件合并到特定分支时,持续集成管道就会被触发运行。 源代码管理集成还提供了直接提供有关拉取请求的 CI 反馈的机会。

许多解决方案(例如 Azure Pipelines 或 GitHub Actions)都提供持续集成管道的功能。

将管道与源代码管理集成

持续集成管道与源代码管理系统的集成是实现快速、自助式代码贡献的关键。

CI 管道在新创建的拉取请求上运行。 管道包括所有测试、安全评估和其他检查。 CI 测试结果直接显示在拉取请求中,以便对质量提供几乎实时的反馈。

另一种常用做法是生成可在源代码管理中呈现的小型报表或锁屏提醒,以使当前生成状态可见。

下图显示了 GitHub 和 Azure DevOps 管道之间的集成。 在此示例中,创建拉取请求会触发 Azure DevOps 管道。 管道状态显示在拉取请求中。

GitHub 存储库中 Azure DevOps 状态徽章的屏幕截图。

纳入自动测试

持续集成的一个关键元素是在开发人员贡献代码时持续生成和测试代码。 创建拉取请求时进行测试,可快速反馈,指出提交未引入破坏性变更。 优点是,持续集成管道中的测试可以是在测试驱动开发期间运行的相同测试。

以下代码片段显示了 Azure DevOps 管道中的测试步骤。 该步骤有两个任务:

  • 第一个任务使用常用的 Python 测试框架来运行 CI 测试。 这些测试与 Python 代码一起驻留在源代码管理中。 测试结果将转到名为 test-results.xml的文件。
  • 第二个任务使用测试结果,并将其作为集成报表发布到 Azure DevOps 管道。
- script: |
    pip3 install pytest
    pytest azure-vote/azure-vote/tests/ --junitxml=junit/test-results.xml
    continueOnError: true

- task: PublishTestResults@2
    displayName: 'Publish Test Results'
    inputs:
    testResultsFormat: 'JUnit'
    testResultsFiles: '**/test-results.xml'
    failTaskOnFailedTests: true
    testRunTitle: 'Python $(python.version)'

下图显示了显示在 Azure DevOps 门户中的测试结果。

Azure DevOps 门户中 Azure DevOps 管道测试的屏幕截图。

失败的测试

失败的测试应暂时阻止部署,并导致对所发生情况进行更深入的分析。 失败的测试还会导致测试的优化或改进导致测试失败的更改。

发布生成状态

许多开发人员通过在他们的存储库中显示状态徽章来证明其代码质量很高。 下图显示了 GitHub 中开源项目的自述文件上显示的 Azure Pipelines 徽章。

GitHub 中自述文件上 Azure Pipelines 徽章的屏幕截图。

优化生成时间

若要更快地完成构建过程,可以:

  • 选择满足性能要求的代理:通过选择正确的生成计算机来加快生成速度。 快速计算机可以在小时和分钟之间有所作为。 如果管道位于 Azure Pipelines 中,则可以使用 Microsoft 托管代理运行作业。 使用Microsoft托管代理时,会为你负责维护和升级。 有关详细信息,请参阅 Microsoft 托管的代理

  • 优化生成服务器位置:生成代码时,数据通过网络发送。 从源代码管理库和制品库提取构建所需的输入。 需要复制生成过程的输出,包括已编译的项目、测试报告、代码覆盖率结果和调试符号。 重要的是这些复制动作必须快速进行。 如果使用自己的生成服务器,请确保生成服务器位于源和目标位置附近。 快速上传和下载可以减少总体生成时间。

  • 横向扩展生成服务器:单个生成服务器可能足以满足小型产品的需求。 随着产品的大小和范围以及处理产品的团队数量增加,单个服务器可能不够。 达到限制时,将基础架构在多台计算机上进行水平扩展。 有关详细信息,请参阅 创建和管理代理池

  • 优化生成

    • 添加并行作业以加快生成过程。 有关详细信息,请参阅配置并行作业并为其付费

    • 启用并行测试套件运行,这通常会节省大量时间,尤其是在运行集成和 UI 测试时。 有关详细信息,请参阅 针对任何测试运行程序并行运行测试

    • 使用乘数的概念,可以通过多个构建代理横向扩展构建。 有关详细信息,请参阅 在管道中指定作业。

    • 请考虑将集成测试、UI测试和冒烟测试移到发布管道。 迁移到发布管道可提高生成速度和生成反馈循环的速度。

    • 将生成项目发布到包管理解决方案,例如 NuGet 或 Maven。 将构建生成的工件发布到包管理解决方案可以让您更轻松地重复使用它。

实现生成类型以适应工作流

组织可能会选择创建多种不同类型的生成来优化生成时间。 可能的构建包括:

  • 持续集成(CI)生成:此生成的目的是确保编译代码并运行单元测试。 每次提交时都会触发此构建。 它充当项目的检测信号,并向团队im_imagestely提供质量反馈。 有关详细信息,请参阅 指定会触发管道的事件

  • 夜间生成:夜间生成的目的不仅是编译代码,还要确保任何较大的测试套件在每次生成中都能按常规频率运行,以评估其效率。 通常,这些测试包括集成、UI 或冒烟测试。 有关详细信息,请参阅 配置管道的计划

  • 发布版本:除了编译和运行测试之外,此版本还编译 API 文档、符合性报告、代码签名以及每次生成代码时不需要的其他步骤。 此版本提供推送到发布管道的黄金副本,最终部署在生产环境中。

组织所需的生成类型取决于因素,包括团队的成熟度、你正在处理的产品类型以及部署策略。

了解如何使用 GitHub 或 Azure DevOps 创建持续集成管道:

了解如何在存储库中显示徽章: