优化与监控您的流水线
在我职业生涯的早期,搭建流水线并不是最大挑战——让流水线既快又可靠才是。一个优化良好的流水线不仅能加快构建速度,还能降低团队挫败感、减少部署风险并加速交付。
我将分享一些实用技巧与策略,帮助您让 Azure DevOps 流水线保持快捷、有序且可靠。
流水线缓存
安装依赖是常见瓶颈之一。无论使用 npm、.NET,还是其他包管理器,重复下载相同依赖都会浪费大量时间。在运行之间缓存依赖与制品,可大幅缩短执行时间。
以下是在 Azure Pipelines 中缓存依赖的方法。
首先,确定要缓存的包管理器,例如:
- Node.js(
node_modules) - NuGet 包
- Python(
pip包) - Maven/Gradle 依赖
Azure Pipelines 支持缓存机制,如 Cache@2 任务,可在各次运行之间缓存依赖。
以下以 Node.js 的简单缓存为例:
# This task is used to cache files to speed up your pipeline.
- task: Cache@2 # This is the task name for caching files in Azure Pipelines.
inputs:
# Key is used to identify the cache. It combines npm (package manager), operating system (OS), and package-lock.json files.
key: 'npm | "$(Agent.OS)" | package-lock.json'
# RestoreKeys is an optional value used when the specific cache key is not found. It helps to find a fallback cache.
restoreKeys: |
npm | "$(Agent.OS)"
# Path defines the location of files or folders to be cached.
# Here, we are caching the 'node_modules' directory to avoid reinstalling dependencies.
path: '$(Build.SourcesDirectory)/node_modules'
# CacheHitVar is a variable that stores whether the cache was successfully used (restored).
# This can be checked later in the pipeline to decide if tasks need to run.
cacheHitVar: 'NPM_CACHE_RESTORED'
随后您可以在缓存命中时有条件地跳过安装。这是在完成 npm 安装前的一个智能检查,是一种高效的基于条件的逻辑。
如下的简单示例:
# This step runs the command to install Node.js dependencies using npm.
- script: npm install # Installs packages listed in the package.json file.
# The condition checks whether the cache was restored successfully.
# This step will run if the cache is not restored ('NPM_CACHE_RESTORED' is not true).
condition: ne(variables.NPM_CACHE_RESTORED, 'true') # Run only if the cache is not restored.
此 Node.js 应用的简单缓存示例会使用 package-lock.json 作为键来保存 npm 缓存目录。当依赖未变化时,即可还原缓存,从而为每次构建节省数分钟。
我见过缓存将大型项目的构建时间大幅缩短,但前提是要合理设计缓存键。在我过去的一个项目中,Node.js 应用的构建时间因此减少了 55%。
监控流水线健康状况
一个成功的流水线不仅仅是“全绿”,还需要可见性和快速反馈。当出现故障时,您希望团队能第一时间知晓。以下是保持先知先觉的方法。
如何设置 Azure DevOps 仪表板
Azure DevOps 提供内置组件,用于展示流水线状态、最近运行、失败率与平均时长等。
- 首先,在项目下进入 Dashboards 。

- 接着点击 New Dashboard 或使用现有仪表板。

- 您可以添加以下组件: Build History、 Release Pipeline Overview、 Test Results Trend 等。

这些组件可用于跟踪通过/失败趋势、识别问题频发的环境等。
为失败的流水线配置告警
- 在项目左下角进入 Project Settings。

- 点击 Notifications。

- 然后点击 New Subscription。

举个场景:在 Category 部分选择 Build;在 Template 部分选择 “A build fails”,然后点击 Next。
您将看到如下界面:

- 最后点击 Finish。
- 在 Notifications 区域,您可以查看我们之前创建的 “A build fails” 的 Build 描述。

我曾因未设置告警而错过了一次关键的部署失败。从那以后,我始终为每次生产部署设置并配置团队告警。这样,我就不会错过任何构建故障或发布延迟。
分析流水线性能
我们知道,即使流水线能正常运行,也可能很慢,而缓慢会扼杀生产力。因此及早识别瓶颈能省去后患。
流水线度量可以揭示构建与部署的性能。以下是获取方法。
首先,您需要在 项目设置中启用 Analytics Views,并连接 Power BI 或通过内置图表探索。
监控流水线健康
- 在 Pipelines 区域进入 Analytics。
- 查看诸如流水线通过率、测试通过率与流水线时长等指标。

我们进一步看看分析中可监控的关键指标及其意义:
|
指标 |
重要性 |
|
构建时长趋势 |
便于轻松发现随时间推移的变慢。 |
|
按分支统计的失败率 |
有助于识别不稳定的特性分支。 |
|
排队等待时间 |
有助于发现代理资源不足。 |
几个月前,我为一位客户优化流水线,最引人注目的是“排队等待时间”。我发现我们团队把自托管代理池压垮了,40% 的流水线时间都花在等待可用运行器上。直到分析数据把问题赤裸裸地展现出来,大家才意识到。
我们的解决方案是新增两台自托管代理,并按作业类型分摊负载。效果立竿见影:流水线的平均构建时间大约下降了 35%。
使用日志进行监控
除了指标之外,时间线日志尤为宝贵,尤其对长时间运行的任务。多年来,我养成了在脚本关键步骤中加入自定义日志标记的习惯,以精准定位延迟点。
来看一个简单示例:
# This step prints a message to the console in the pipeline logs.
# It helps to mark the start of the dependency installation process.
echo "=== START: Dependency Install ===" # Display a message indicating the beginning of dependency installation.Azure Pipelines 最佳实践
现在我们已涵盖 Azure Pipelines 的核心服务以及更多内容,接下来看看如何通过以下最佳实践将其价值最大化。
我们把重心从性能转向结构,因为再快的流水线,如果难以维护,依然会拖累团队。
为团队组织流水线
当多个团队或环境共享流水线时,事情往往会变得混乱。您需要结构化管理。将开发、预发布、生产通通塞进一个“巨型流水线”,只会带来混沌。
要组织好流水线,您需要按环境进行拆分。下面看一个简单的结构示例。
|
环境 |
流水线文件名 |
触发方式 |
|
开发(Development) |
|
特性分支(每次提交运行) |
|
预发布(Staging) |
|
拉取请求 → 预发布(手动触发) |
|
生产(Production) |
|
手动或发布流水线(需审批) |
从这个简单结构中需要把握的要点:
- 每个文件都引用共享模板。
- 每个文件都使用环境专属变量。
- 每个文件都通过流水线权限控制访问。
根据经验,这种拆分更便于调试,也允许初级开发者在不影响生产环境的前提下部署到开发环境。
使用模板与可复用代码
DevOps 的目标是减少人工流程、提升整个软件开发过程的自动化程度。
YAML 代码若在项目之间复制粘贴,容易出错。Azure DevOps 支持通过 YAML 流水线模板实现 DRY(Don’t Repeat Yourself)化的设置。您可以在多个项目间复用 YAML 模板,保持流水线设计一致,甚至减少流水线处理时间。
下面以一个可复用的构建模板为例。
首先,定义您的构建模板 build-template.yml:
# Here we configure the platform and the build configuration.
parameters:
buildPlatform: 'Any CPU' # This specifies the build platform (e.g., Any CPU, x86, x64).
buildConfiguration: 'Release' # This specifies the build configuration (Release) to avoid warning.
# A pipeline is composed of steps (a series of tasks that will be executed)
steps:
- task: DotNetCoreCLI@2 # Task for running .NET Core commands in the pipeline.
inputs:
command: 'build' # This runs the 'build' command to compile the project(s).
projects: '**/*.csproj' # This specifies to build all .csproj files in the repository.
arguments: '--configuration ${{ parameters.buildConfiguration }}'
# This passes the build configuration parameter (e.g., Release or Debug) to the command.
在主流水线中使用该构建模板:
# A pipeline job is a group of tasks. Here, the job is named 'Build'.
jobs:
- job: Build # The job name where the build process occurs.
# Steps define the tasks or actions the pipeline will perform.
steps:
- template: templates/build-template.yml # Reference an external YAML template for reusable steps.
管理机密与变量
在项目协作中,我们常常需要使用敏感信息,如数据库连接串、API 密钥、密码或令牌。如果将这些机密硬编码在代码库中或暴露在日志里,就很容易被泄露。
我们来看如何使用 Azure Pipelines 的机密与变量组来安全管理机密与变量。
步骤 1:创建变量组
- 在左侧边栏点击 Pipelines 标签。
- 在 Pipelines 区域点击 Library。

- 创建变量组:
- 点击 Variable groups 标签。

- 点击 Add variable group 按钮。
- 为变量组命名(例如
MyAppSecrets)。

步骤 2:向变量组添加机密
- 添加变量:
- 在变量组中点击 Add 新增变量。

- 输入变量名称(例如
DB_CONNECTION_STRING)。 - 勾选 Keep this value secret,将其标记为机密。
- 输入变量值(例如数据库连接串)。

- 点击 Save 保存变量。

步骤 3:在流水线中使用机密
现在您已创建包含机密的变量组,可在 YAML 流水线文件中引用这些变量。
- 引用变量组: 将变量组添加到 YAML 流水线文件:
variables:
- group: MyAppSecrets
- 在步骤中使用机密: 您可以通过
$(VariableName)语法在流水线步骤中引用机密。下面是如何在脚本步骤中使用DB_CONNECTION_STRING的示例:
# This defines the trigger for the pipeline.
# The pipeline runs automatically whenever changes are pushed to the 'main' branch.
trigger:
- main # Trigger the pipeline on changes to the 'main' branch.
# The pool specifies the environment where the pipeline will run.
# 'ubuntu-latest' means the pipeline will use the latest Ubuntu operating system image.
pool:
vmImage: 'ubuntu-latest' # Use the latest Ubuntu image provided by Azure Pipelines.
# Variables section defines reusable values for the pipeline.
# 'group: MyAppSecrets' links to a variable group that stores sensitive information like secrets.
variables:
- group: MyAppSecrets # Load secrets, such as database credentials, from a variable group.
# Steps define the tasks that the pipeline will execute one by one.
steps:
- script: |
echo "Connecting to the database..." # Print a message indicating the start of database connection.
echo "Connection String: $(DB_CONNECTION_STRING)" # Display the database connection string from the variable group.
displayName: 'Connect to Database' # A simple name for this step that appears in the pipeline logs.
步骤 4:运行流水线
- 保存 YAML 文件后,前往 Pipelines 区域并点击 Run Pipeline。
- 流水线运行后,您可以查看日志。您会注意到机密值已被隐藏,从而保障敏感信息的安全。
结语
在本教程中,我们完整走了一遍使用 Azure Pipelines 的旅程——从创建第一个流水线,到构建、测试、部署、监控与优化。
部署阶段需要实践积累。从简单开始,持续改进,随着时间推移,您会在管理 CI/CD 工作流方面变得更自信、更熟练。Azure Pipelines 提供工具,而您带来迭代与学习。
通过持续努力,您可以精简开发流程,并自信地在规模化场景下交付高质量软件。
若想更深入地学习 Azure DevOps 与 Microsoft Azure,请查看以下资源:
- Azure DevOps Tutorial - 本教程将带您了解 Azure DevOps,让 CI/CD 前所未有的简单。
- Understanding Microsoft Azure – 打下 Microsoft Azure 的坚实基础,释放云计算的力量。
- Microsoft Azure Fundamentals (AZ-900) – 借助这条面向初学者的学习路径覆盖所有关键 Azure 基础,为考试做好准备。
- Understanding Microsoft Azure Architecture and Services – 了解 Azure 的架构与服务如何协同驱动云端解决方案。
常见问题
我可以将 Azure Pipelines 用于非 Azure 项目吗?
可以。Azure Pipelines 支持部署到本地环境以及 AWS、GCP 等多种云环境。
Azure Pipelines 支持哪些编程语言?
Azure Pipelines 支持多种编程语言,包括 Node.js、Python、Java、.NET 等。
Azure Pipelines 与 GitHub Actions 有何区别?
Azure Pipelines 与 Azure 生态的集成更深入,并提供强大的部署工具;而 GitHub Actions 则提供更轻量、原生于 GitHub 的 CI/CD 体验。两者均支持基于 YAML 的工作流与容器化部署。
我可以将 Azure Pipelines 与 Python 或 Java 等非微软技术一起使用吗?
可以。Azure Pipelines 支持所有主流平台与语言,包括 Python、Java、Node.js 等。您可以使用 YAML 为任意技术栈配置构建与部署。
Azure Pipelines 是否可以免费使用?
Azure Pipelines 提供免费层:公共项目每月 1,800 分钟,并对私有构建时间有限制。超出部分需要付费计划或自托管代理。
什么是 Azure DevOps 的 Service Connections?为什么重要?
Service Connections 可将 Azure Pipelines 与 Azure Web Apps 或 Kubernetes 集群等外部服务安全连接。它们是实现自动化部署与基础设施管理的关键。
Azure Pipelines 与 Jenkins 或 CircleCI 相比如何?
Azure Pipelines 为 Azure 用户提供更一体化的体验,并对微软服务有更好的支持。Jenkins 的可定制性更强,但需要更多配置;CircleCI 在速度与并行度方面表现突出。
Emmanuel Akor 是一名云与 DevOps 工程师,擅长利用云技术和 DevOps 工具推进有影响力的项目。他毕业于巴布科克大学计算机科学专业,获一等荣誉学位,曾担任 GDSC 云方向联合负责人,将卓越的学术背景与实战经验相结合。作为技术内容作者,他善于分享知识并与团队高效协作。

如果您的 CI/CD 流水线总是出错,或者运行缓慢又笨拙,您并不孤单。我也经历过构建失败、环境不一致,以及队友不小心覆盖我工作的情况。Azure Pipelines 通过云托管服务帮您摆脱这些烦恼,它几乎可以在任何平台上构建、测试并部署任何项目。
因此,在本教程中,我将向您展示如何:
让我们开始吧!
什么是 Azure Pipelines?
Azure Pipelines 是一项基于云的解决方案,可简化应用的开发、测试与部署。
它是 Azure DevOps 工具集的一个组件,覆盖整个软件开发生命周期。由于支持多种平台和编程语言,它对各类规模团队都十分灵活。它还能与 GitHub、Azure Repos 以及其他知名版本控制系统集成。
Azure Pipelines 的核心特性包括:
服务
用途
多平台支持
Azure Pipelines 可自动化构建与部署适用于 Linux、macOS 和 Windows 等多种操作系统的应用程序。
与版本控制集成
Azure Pipelines 可连接到您的代码仓库,例如 Azure Repos、GitHub 以及其他知名版本控制系统。
基于 YAML 的流水线配置
Azure Pipelines 允许我们以代码方式定义构建与部署流程,从而实现版本控制。
持续集成与持续部署(CI/CD)
Azure Pipelines 支持端到端的代码集成与应用部署流程。
根据我的经验,Azure Pipelines 对任何想在团队内建立规范 CI/CD 的人都很有帮助。它灵活、可扩展,并能与其他 Azure 服务良好集成。
Azure Pipelines 架构(来源:Microsoft)。
如果您希望在流水线之外更广泛地了解 Azure DevOps, 这篇 Azure DevOps 教程讲解了从头到尾的整个 CI/CD 生命周期。
设置您的第一个 Azure Pipeline
要在 Azure Pipelines 环境中开展工作,我们首先需要进行端到端的构建、测试与部署流程的基础设置。
先决条件
在开始创建第一个流水线之前,请确保您具备以下条件:
如果您需要先熟悉更广泛的 Azure 生态,建议查看 Understanding Microsoft Azure 课程。
创建新项目与仓库
现在您的 Azure DevOps 账户与组织已设置完成,我们来创建第一个项目与仓库。
在本教程中,我们将使用 Azure Repos 作为代码仓库。如果您刚开始或没有特定理由选择 TFVC,我建议选择 Git。
创建您的第一个流水线
现在是创建第一个流水线的时候了。按以下步骤操作:
选择 YAML 与 Classic 编辑器
Azure Pipelines 提供两种定义流水线的方式:
.yaml或.yml文件里,支持版本化与更好的协作。维度
YAML 流水线
Classic 编辑器
版本控制
YAML 流水线支持版本控制,并存放在源码仓库中。
Classic 编辑器不支持版本控制。它基于图形化界面(GUI)。
灵活性
YAML 流水线拥有高度灵活性。
Classic 编辑器的灵活性有限。
最适合
YAML 流水线更适合长期、复杂的工作流与自动化。
Classic 编辑器更适合快速搭建。
根据我的经验,YAML 流水线对遵循基础设施即代码(IaC)实践的团队更为灵活与合适。但对新手而言,Classic 编辑器以更直观的方式上手也很不错。
不过,从长期可扩展性看,推荐优先采用 YAML 流水线而非 Classic 编辑器。
使用 Azure Pipelines 进行构建
现在,我们来看看如何通过 Azure Pipelines 进行构建。
本节将指定 Azure Pipelines 构建您代码所需的步骤,例如安装依赖、编译与运行测试。我们会在源码仓库中用 YAML 编写一个配置文件来表达这些步骤,YAML 是一种简单、可读性强的“配方式”描述方式。
YAML 流水线语法
下面是一个简单的 YAML 流水线示例:
我们逐步拆解上述代码:
trigger:指定触发流水线的分支(如main)。pool:定义构建代理(如ubuntu-latest)。steps:列出要执行的任务,如安装依赖与运行构建脚本。配置构建步骤
要在 YAML 流水线中添加构建步骤,您需要在“steps”部分下定义“script”。
以简单的
Node.js应用为例,下面的azure-pipelines.yml文件包含 Azure DevOps 自动创建的代码。让我们看看上述 YAML 流水线中的构建
steps:NodeTool@0任务指定 Node.js 版本。npm install安装项目依赖。npm run build编译代码。运行流水线
我们的流水线可以手动触发,也可以设置为在分支推送等事件发生时自动运行。
main分支推送时自动触发流水线。示例:运行流水线后,您可以查看日志并排查问题。
要访问日志,请进入流水线运行摘要并选择具体的作业或任务。该步骤会显示对应日志;如图所示,您可以选择任一作业(Build、Push 或 Update)查看原始日志。
要排查常见问题,您可以检查流水线是否存在超时、资源受限或配置错误等常见故障。
为流水线添加测试
向流水线添加测试,可确保代码质量,并在开发早期发现问题。在 Azure Pipelines 中,您可以通过在流水线配置中添加步骤来集成单元测试、集成测试或其他测试。
配置测试步骤
在流水线中加入测试步骤以保证代码质量。您可以使用 Jest、Mocha 或 NUnit 等流行框架。以下是使用 Jest 添加单元测试的示例:
查看测试结果
Azure Pipelines 内置测试报告功能。您可以设置发布测试结果以便更易跟踪,并在流水线日志中查看测试结果。操作如下:
PublishTestResults@2任务来展示结果,便于整体跟踪。例如:使用 Azure Pipelines 部署
在 Azure 流水线 YAML 文件中的部署步骤里,您可以自动将应用部署到多个环境,如测试、预发布和生产。本节将回顾几种使用 Azure Pipelines 进行部署的方式。
部署到 Azure Web Apps
Azure Web Apps 是 Azure 门户中的一项服务,可帮助您大规模地开发、部署与管理 Web 应用。
要部署到 Azure Web Apps,您需要将两项服务进行关联。步骤如下:
下面是一个将简单
Node.js应用部署到 Azure App Service 的 YAML 部署流水线示例:我们来拆解以上代码,便于您按需调整:
your-azure-subscription替换为可访问您 Azure 订阅的服务连接名称。your-app-name替换为 Azure 中您的实际 Web 应用名称。$(Build.ArtifactStagingDirectory)替换为用于部署的 Web 应用包或文件所在目录。$(Build.ArtifactStagingDirectory)—— 该变量指向构建产物(您的应用文件)在构建后存放的文件夹。设置持续部署(CD)
当我们的代码通过所有测试与检查后,下一步就是设置持续部署。请按照以下步骤进行。
Azure 发布流水线部署模型(来源: Microsoft)
根据我的经验,这个阶段对于在高要求的开发环境中保持稳定性至关重要。审批与关卡提供了控制力,并确保只有高质量代码进入生产。
部署到 Kubernetes
Kubernetes 使运行可靠且可扩展的容器化应用变得更容易。使用 Azure Kubernetes Service(AKS)时,您将获得一个简化部署与运维的托管环境。本节我将演示如何使用 Azure Pipelines 将应用部署到 AKS。
准备 AKS 集群
您可以使用 Azure 门户或 CLI 创建 AKS 集群。下面是一个用于创建集群的基本 Bash CLI 命令:
我们来拆解上述命令:
--resource-group:指定创建 AKS 集群的 Azure 资源组。--name:集群名称。--node-count:集群中的节点数量(示例为 3)。--enable-addons monitoring:启用 Azure Monitor for Containers 的监控与分析。--generate-ssh-keys:如未提供,将自动生成用于安全访问节点的 SSH 密钥。别忘了将
<ResourceGroupName>与<AKSClusterName>替换为您的实际资源组与集群名称。在 AKS 集群设置完成后,需要配置 kubectl。这样可确保您的流水线代理或本地计算机能通过
kubectl与集群通信。您可以通过命令行工具加速 Azure 任务——这份 Azure CLI 速查表非常实用。
创建部署 YAML 文件
下面以将 Docker 镜像部署到 Kubernetes 的基础部署 YAML 文件为例:
使用 Azure Pipelines 部署
在您的 YAML 流水线中,加入一个部署到 AKS 的任务。
提交并推送该 YAML 文件以触发部署。
AKS 简化了容器编排,使扩缩容、更新与回滚更易管理。根据我的经验,它是现代云原生应用的必备之选。