我们有一个关于Azure DevOps的仓库的项目,我们在其中存储基础架构的ARM模板。我们想要实现的是在master分支的每次提交上部署模板。
问题是:是否可以定义一个仅触发该提交更改的ARM模板的部署的管道?让我们来看一个例子。我们在回购中提供了3个模板:
t1.json
t2.json
t3.json
最新提交仅更改了t2.json。在这种情况下,我们希望管道仅将t2.json部署为t1.json,并且在此提交中未更改t3.json。
是否可以创建一个通用管道,或者我们应该为由特定文件的提交触发的每个模板创建单独的管道?
答案 0 :(得分:2)
可以仅定义一个管道来部署更改的模板。您需要添加脚本任务以在管道中获取更改的模板文件名。
使用git命令git diff-tree --no-commit-id --name-only -r commitId
很容易获得更改的文件。获得更改的文件名后,需要使用表达式##vso[task.setvariable variable=VariableName]value
assign it to a variable。然后,您可以在AzureResourceGroupDeployment任务中像这样csmFile: '**\$(fileName)'
设置csmFile参数
例如,您可以在yaml管道下面查看:
- powershell: |
#get the changed template
$a = git diff-tree --no-commit-id --name-only -r $(Build.SourceVersion)
#assign the filename to a variable
echo "##vso[task.setvariable variable=fileName]$a"
- task: AzureResourceGroupDeployment@2
inputs:
....
templateLocation: 'Linked artifact'
csmFile: '**\$(fileName)'
定义多个管道以仅部署更改的模板也很容易。您只需要将paths trigger添加到每个管道中的特定模板文件中。这样更改后的模板文件只会触发其相应的管道。
trigger:
paths:
include:
- pathTo/template1.json
...
- task: AzureResourceGroupDeployment@2
inputs:
....
templateLocation: 'Linked artifact'
csmFile: '**\template1.json'
希望上面有帮助!
答案 1 :(得分:0)
开箱即用不支持您的要求。据我了解,您希望每个步骤或每个工作都有触发器(基于文件更改)(取决于组织管道的方式)。但是,我不确定您是否需要这个。如果使用Create Or Update Resource Group
doc here
您还可以尝试手动检测更改了哪个文件(例如使用powershell和git命令),然后设置一个标志,以后再使用此falg触发或不执行某些步骤。但这对于您想要实现的目标来说似乎有些过分。