如何在Azure DevOps YAML中为多阶段部署分离工件
Azure DevOps构建与部署流水线优化:工件分离+部署条件控制
一、实现分支对应的工件分离
要区分Dev和main分支生成的工件,核心是在构建阶段动态指定工件名称,确保不同分支的工件独立存储。
方案1:YAML构建流水线动态命名工件
直接在PublishBuildArtifacts任务中,通过分支变量判断生成对应名称的工件:
# 构建流水线YAML片段 steps: # 先完成代码编译、打包等前置步骤,将产物放到$(Build.ArtifactStagingDirectory) - task: PublishBuildArtifacts@1 inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)' # 根据分支名动态设置工件名称 ArtifactName: ${{ if eq(variables['Build.SourceBranchName'], 'main') }}: App-Prod ${{ else if eq(variables['Build.SourceBranchName'], 'Dev') }}: App-Dev publishLocation: 'Container'
方案2:用脚本动态设置工件名称变量
如果需要更复杂的分支判断逻辑,可先通过PowerShell设置变量,再引用变量发布工件:
steps: - powershell: | if ($env:BUILD_SOURCEBRANCHNAME -eq 'main') { Write-Host "##vso[task.setvariable variable=ArtifactName]App-Prod" } elseif ($env:BUILD_SOURCEBRANCHNAME -eq 'Dev') { Write-Host "##vso[task.setvariable variable=ArtifactName]App-Dev" } displayName: '设置工件名称变量' - task: PublishBuildArtifacts@1 inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)' ArtifactName: '$(ArtifactName)' publishLocation: 'Container'
二、为部署阶段设置执行条件
部署流水线可通过阶段条件、触发规则两种方式,控制不同环境的部署时机。
方式1:在部署流水线中设置阶段执行条件
针对不同环境的部署阶段,添加分支判断条件,确保只有对应分支的工件生成后才执行部署:
# 部署流水线YAML片段 stages: - stage: Deploy_Dev displayName: 部署开发环境 # 仅当触发部署的构建来自Dev分支时执行 condition: eq(variables['Build.SourceBranchName'], 'Dev') jobs: - job: Deploy steps: - task: DownloadBuildArtifacts@0 inputs: buildType: 'current' downloadType: 'single' artifactName: 'App-Dev' # 下载Dev分支对应的工件 downloadPath: '$(System.ArtifactsDirectory)' # 后续开发环境部署步骤(如Azure App Service部署、数据库迁移等) - stage: Deploy_Prod displayName: 部署生产环境 # 仅当触发部署的构建来自main分支时执行 condition: eq(variables['Build.SourceBranchName'], 'main') jobs: - job: Deploy steps: - task: DownloadBuildArtifacts@0 inputs: buildType: 'current' downloadType: 'single' artifactName: 'App-Prod' # 下载main分支对应的工件 downloadPath: '$(System.ArtifactsDirectory)' # 后续生产环境部署步骤
方式2:通过触发规则控制部署流水线的启动
如果需要更精准的触发控制,可在部署流水线中设置仅接收指定分支的构建触发:
# 部署流水线YAML头部触发配置 resources: pipelines: - pipeline: BuildPipeline source: '你的构建流水线名称' # 替换为实际的构建流水线名称 trigger: branches: include: - Dev # 仅Dev分支构建完成后,触发当前开发环境部署流水线 # 若为生产环境部署流水线,此处替换为main
经典编辑器操作参考(若未使用YAML)
- 构建流水线设置:在「发布工件」任务中,将「工件名称」设置为
App-$(Build.SourceBranchName),动态生成分支对应的工件名称。 - 部署流水线设置:
- 添加部署阶段后,进入阶段的「选项」页,设置「执行条件」为「自定义条件」,输入表达式如
eq(variables['Build.SourceBranchName'], 'Dev')。 - 在「下载工件」任务中,指定对应的工件名称(如
App-Dev或App-Prod)。
- 添加部署阶段后,进入阶段的「选项」页,设置「执行条件」为「自定义条件」,输入表达式如
内容的提问来源于stack exchange,提问作者Sudarshan Sharma
相关产品推荐
相关产品推荐

