我有一个git分支策略,如下所示:
分支机构:
experimental-feature integrates to develop
develop integrates to master
在每个分支中,我都有一个名为azure-pipelines.yaml的文件,其中包含用于管道构建的规则,每个分支之间的规则各不相同,因为每个文件的属性名称trigger
都与之匹配分支名称。
I.E:master分支具有azure-pipelines.yml,该触发器具有名为“ master”的触发属性,因为对于master分支上的每次更改,都会触发管道。开发和实验功能相同。 到目前为止一切顺利。
现在,我不明白为什么当我创建从develop
到master
的拉取请求时git不知何故无法识别每个azure-pipeline.yaml
(开发和母版)之间的变化。很好,因为开发中的azure-pipeline.yml
总是会覆盖master azure-pipeline.yaml
,而我不希望那样。
但是,当我通过请求合并请求时,从experimental-feature
到develop
git的更改可以识别不需要的文件之间的更改。
有人可以在这里启发我吗?我也无法在Microsoft文档中找到这是如何工作的。
答案 0 :(得分:1)
您可以使用阶段的触发器和条件来仅针对特定分支运行特定阶段。
我建议为所有分支机构和所有环境使用单个管道文件azure-pipeline.yml
。然后,您可以为Jobs创建模板,例如,Build Job,Deploy to Non-prod job等。
赞:
管道:
trigger:
- master
- dev
pr:
branches:
include:
- master
- dev
variables:
- name: vmImage
value: 'ubuntu-latest'
stages:
- stage: Build
displayName: Build stage
jobs:
- job: BuildJob
pool:
vmImage: $(vmImage)
steps:
- template: Jobs/build.yml
- stage: NonProd
displayName: Deploy non prod stage
condition: and(succeeded(), in(variables['build.sourceBranch'], 'refs/heads/master', 'refs/heads/dev'))
jobs:
- deployment: DeploymentJob1
pool:
vmImage: $(vmImage)
environment: non-prod
variables:
- template: Variables/non-prod.yml
strategy:
runOnce:
deploy:
steps:
- template: Jobs/deploy.yml
- stage: Prod
displayName: Deploy prod stage
condition: and(succeeded(), eq(variables['build.sourceBranch'], 'refs/heads/master'))
jobs:
- deployment: DeploymentJob2
pool:
vmImage: $(vmImage)
environment: prod
variables:
- template: Variables/prod.yml
strategy:
runOnce:
deploy:
steps:
- template: Jobs/deploy.yml
触发器
trigger:
- master
- dev
pr:
branches:
include:
- master
- dev
条件
condition: and(succeeded(), in(variables['build.sourceBranch'], 'refs/heads/master', 'refs/heads/dev'))
condition: and(succeeded(), eq(variables['build.sourceBranch'], 'refs/heads/master'))
类似地,您可以混合和匹配事物以更好地满足您的目的。
请查看存储库以供参考: https://github.com/iqans/azure-pipeline-demo