如何在Azure Pipeline中为不同分支配置不同YAML构建文件?
单条Azure DevOps流水线实现多分支不同代理池配置
你可以通过Azure Pipelines的条件表达式和内置分支变量,把两个YAML合并成一个,在单条流水线里实现不同分支自动匹配对应代理池的需求,不用维护两条流水线或者重复YAML内容。
实现思路
核心就是利用内置变量Build.SourceBranchName获取当前触发流水线的分支名,通过条件判断动态渲染pool配置,其余步骤完全复用,只需要维护一份YAML。
完整合并后的YAML示例
# ASP.NET Core # Build and test ASP.NET Core projects targeting .NET Core. trigger: - master - iis # 动态选择代理池:master用Azure托管代理,iis用自定义池 pool: ${{ if eq(variables['Build.SourceBranchName'], 'master') }}: vmImage: 'ubuntu-latest' ${{ if eq(variables['Build.SourceBranchName'], 'iis') }}: name: 'Default' vmImage: 'ubuntu-latest' variables: buildConfiguration: 'Release' steps: - task: AzureKeyVault@1 inputs: azureSubscription: 'MySubscription' KeyVaultName: 'MyKeyVault' SecretsFilter: '*' - task: UseDotNet@2 displayName: 'Install .NET Core SDK' inputs: packageType: 'sdk' version: '6.x' - task: NodeTool@0 displayName: 'Install npm' inputs: versionSource: 'spec' versionSpec: '18.x' - task: Bash@3 displayName: 'Install Cake.Tool' inputs: targetType: 'inline' script: 'dotnet tool install --global Cake.Tool | echo "Already installed"' workingDirectory: 'src/App/Build' - task: Bash@3 displayName: 'Execute dotnet cake command' inputs: targetType: 'inline' script: 'dotnet cake --dockerRegistry="$(dockerRegistry)" --dockerRegistryUsername="$(dockerRegistryUsername)" --dockerRegistryPassword="$(dockerRegistryPassword)"' workingDirectory: 'src/App/Build' - task: PublishBuildArtifacts@1 displayName: 'Publish Build Artifacts' inputs: PathtoPublish: 'artifacts' ArtifactName: 'Artifact' publishLocation: 'Container'
关键说明
- 触发分支配置:
trigger字段同时包含master和iis,两个分支的提交都会触发这条流水线。 - 动态代理池:通过
${{ if eq(...) }}条件表达式,判断当前分支是master还是iis,分别加载对应的代理池配置:- master分支:使用Azure托管的
ubuntu-latest代理 - iis分支:使用自定义的
Default代理池
- master分支:使用Azure托管的
- 复用步骤:所有构建步骤完全保留,只修改了代理池的动态逻辑,后续维护只需要改这一份YAML即可。
如果以后需要新增其他分支的特殊配置,只需要在pool块里添加对应的条件判断就行,扩展性很强。
内容的提问来源于stack exchange,提问作者Hoang Minh
相关产品推荐
相关产品推荐

