正如你们中的一些人所知,在 Azure Pipelines 中,我们可以在作业和阶段上包含“dependsOn”子句以及“condition”,以便我们可以根据运行中的某些值或变量动态运行阶段和作业管道。
但是我们也可以设置模板表达式来完成几乎相同的事情。
这是一个使用模板表达式设置舞台的示例。
stages:
- ${{ if eq(variables['Build.SourceBranchName'], 'development') }}:
- stage: Deploy
dependsOn: Build
displayName: "Deploying to development environment."
jobs:
- deployment:
environment: MyEnvironment
strategy:
runOnce:
deploy:
steps:
- task: AzureRmWebAppDeployment@4
inputs:
ConnectionType: "AzureRM"
azureSubscription: "MySubscription"
appType: webAppContainer
WebAppName: $(environmentName)
DockerNamespace: $(ContainerRegistry)
DockerRepository: appRepo
DockerImageTag: development-$(Build.BuildId)
这是在某种条件下运行的阶段的示例:
- stage: DeployHomolog
dependsOn: Build
condition: and(succeeded(), eq(variables['Build.SourceBranchName'], 'dev'))
displayName: "Deploying to Homolog Environment"
jobs:
- deployment:
environment: MyEnvironment
strategy:
runOnce:
deploy:
steps:
- task: AzureRmWebAppDeployment@4
inputs:
ConnectionType: "AzureRM"
azureSubscription: "MySubscription"
appType: webAppContainer
WebAppName: WebApp
DockerNamespace: $(acr)
DockerRepository: appRepo
DockerImageTag: dev-$(Build.BuildId)
问题是:它们各自的优点和缺点是什么?您更喜欢在管道上使用其中哪一个?
@加布里埃尔·安东尼奥
这取决于使用案例和复杂性,如果上面是单个管道文件(azure-pipeline.yml)实现,则可以直接使用。
在更复杂的实现中,使用模块化模板(让管道调用不同的模板化管道),模板表达式可以帮助构建动态、可重用且灵活的模板。
模板表达式和条件之间有一个重要的区别:
考虑到这一点,这并不总是一个偏好问题 - 一些例子:
Build.SourceBranchName
在模板中可用,但
变量 Build.TriggeredBy.DefinitionName
不是,所以你必须使用
它在条件下(请参阅文档中的“在模板中可用?”栏)关于可以同时使用两者的场景,我个人更喜欢模板表达式。当我运行构建时,我不希望看到一堆跳过的阶段/作业/步骤。