Azure DevOps CI/CD 流水线配置
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 资源,需创建服务连接:
- 项目左下角 Project settings → Service connections。
- 新建服务连接,选择 Azure Resource Manager,授权方式推荐使用 Service principal (automatic) 或手动提供凭证。
- 为连接命名,如
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(库) 的变量组中。
- Pipelines → Library → + Variable group。
- 输入变量名(如
DATABASE_URL)及值,可标记为 secret。 - 在 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