Azure DevOps CI/CD 流水线配置

FreeGuideOnline 最新 2026-07-09

yaml

azure-pipelines.yml

trigger:

  • main

pool: vmImage: ubuntu-latest

steps:

  • task: NodeTool@0 inputs: versionSpec: '18.x' displayName: 'Install Node.js'

  • script: | npm install npm run build displayName: 'npm install and build'

  • task: ArchiveFiles@2 inputs: rootFolderOrFile: '$(Build.BinariesDirectory)' includeRootFolder: false archiveType: 'zip' archiveFile: '$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip' replaceExistingArchive: true displayName: 'Zip build output'

  • task: PublishBuildArtifacts@1 inputs: pathToPublish: '$(Build.ArtifactStagingDirectory)' artifactName: 'drop' displayName: 'Publish artifact'


保存并运行。首条流水线会克隆代码、安装 Node.js、构建项目并将产物打包成构件。

---

## 深入理解流水线结构

### 触发器(Triggers)

`trigger` 指定哪些分支的变更会自动触发流水线。常见配置:

- 单一分支:`trigger: - main`
- 多分支:`trigger: - main - develop`
- 路径过滤:按文件夹排除/包含
- 计划触发:`schedules` 字段定义 cron 表达式

### 代理池(Pool)

`pool` 定义运行任务的虚拟机。微软托管代理提供多种镜像,如 `ubuntu-latest`、`windows-latest`、`macOS-latest`。自托管代理则需要自行安装配置。

### 步骤(Steps)与任务(Tasks)

流水线由多个步骤组成,每个步骤可以是一个内置任务或脚本命令。

- **任务(Task)**:由名称和版本号引用,如 `NodeTool@0`,需要传入 `inputs` 参数。
- **脚本(Script)**:直接在当前 shell 中运行命令。

常用内置任务:
- `DotNetCoreCLI@2`:构建 .NET 项目
- `Maven@3`:Java 项目
- `Docker@2`:构建并推送 Docker 镜像
- `AzureCLI@2`:执行 Azure 命令行操作

### 变量与表达式

流水线中可使用变量动态传递值:

- **系统预定义变量**:如 `$(Build.BuildId)`、`$(Build.SourcesDirectory)`
- **自定义变量**:在 YAML 顶层 `variables` 块或 UI 中定义
- **秘密变量**:通过 Azure DevOps 变量组存储敏感信息,如连接字符串

示例:定义构建配置环境

```yaml
variables:
  buildConfiguration: 'Release'
  appServiceName: 'my-app-demo'

使用:$(buildConfiguration)


配置持续部署(CD)到 Azure App Service

在完成构建并生成构件(Artifact)后,我们添加发布阶段,将应用自动部署到 App Service。

添加服务连接(Service Connection)

要让流水线访问 Azure 资源,需创建服务连接:

  1. 项目左下角 Project settingsService connections
  2. 新建服务连接,选择 Azure Resource Manager,授权方式推荐使用 Service principal (automatic) 或手动提供凭证。
  3. 为连接命名,如 AzureServiceConnection

扩展 YAML 添加部署阶段

在之前的构建 YAML 后追加一个新的 stage

stages:
- stage: Build
  displayName: Build stage
  jobs:
  - job: BuildJob
    steps:
      # 之前的构建步骤...
      - task: PublishBuildArtifacts@1
        inputs:
          pathToPublish: '$(Build.ArtifactStagingDirectory)'
          artifactName: 'drop'
        displayName: 'Publish artifact'

- stage: Deploy
  displayName: Deploy stage
  dependsOn: Build
  condition: succeeded()
  jobs:
  - deployment: DeployWeb
    displayName: Deploy Web App
    environment: 'production'
    strategy:
      runOnce:
        deploy:
          steps:
          - task: AzureWebApp@1
            inputs:
              azureSubscription: 'AzureServiceConnection'   # 你的服务连接名
              appType: 'webAppLinux'                       # 或 webApp
              appName: '$(appServiceName)'
              package: '$(Pipeline.Workspace)/drop/$(Build.BuildId).zip'
              runtimeStack: 'NODE|18-lts'

多阶段与审批

你可以为不同环境创建多个阶段(如 Dev、Staging、Production),并设置审批机制:

  • 在环境(Environment)中配置 Approvals and checks,要求部署前必须经指定人员批准。
  • 在 YAML 中使用 dependsOn 控制阶段先后顺序。

使用变量组与库管理敏感配置

将数据库连接字符串、API 密钥等敏感信息存储在 Library(库) 的变量组中。

  1. PipelinesLibrary+ Variable group
  2. 输入变量名(如 DATABASE_URL)及值,可标记为 secret。
  3. 在 YAML 中引用变量组:
variables:
- group: 'MyApp-Release'

即可在后续步骤直接使用 $(DATABASE_URL)


实用技巧与常见问题

流水线模板化

将重复步骤抽象为模板,实现复用。在仓库中创建 templates/build.yml,然后在主流水线中引用:

steps:
- template: templates/build.yml

缓存依赖项

对于 Node.js,使用 Cache@2 任务缓存 node_modules,大幅加速构建:

- task: Cache@2
  inputs:
    key: 'npm | "$(Agent.OS)" | package-lock.json'
    restoreKeys: |
            npm | "$(Agent.OS)"
    path: $(Pipeline.Workspace)/.npm
  displayName: Cache npm packages