首页 > 解决方案 > Azure DevOps 管道仅用于部署已更改的 arm 模板

问题描述

我们在 Azure DevOps 上有一个带有 repo 的项目,我们在其中存储基础架构的 ARM 模板。我们想要实现的是在 master 分支的每个提交上部署模板。

问题是:是否可以定义一个管道来触发仅部署随该提交而更改的 ARM 模板?让我们举个例子。我们在 repo 中有 3 个模板:

t1.json
t2.json
t3.json

最新的提交只更改了 t2.json。在这种情况下,我们希望管道仅将 t2.json 部署为 t1.json 并且 t3.json 在此提交中没有更改。

是否可以创建一个通用管道,或者我们应该为每个由特定文件提交触发的模板创建单独的管道?

标签: azure-devopsazure-pipelinesarm-template

解决方案


可以只定义一个管道来部署更改的模板。您需要添加脚本任务以在管道中获取更改的模板文件名。

使用 git 命令很容易获取更改的文件git diff-tree --no-commit-id --name-only -r commitId。当您获得更改后的文件名时,您需要使用表达式将其分配给变量##vso[task.setvariable variable=VariableName]value。然后您可以csmFile: '**\$(fileName)' 在 AzureResourceGroupDeployment 任务中像这样设置 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)'

定义多个管道也很容易实现只部署更改的模板。您只需要将路径触发器添加到每个管道中的特定模板文件。使更改后的模板文件只触发其对应的管道。

trigger: 
  paths:
    include: 
    - pathTo/template1.json
...

 - task: AzureResourceGroupDeployment@2
      inputs:
        ....
        templateLocation: 'Linked artifact'
        csmFile: '**\template1.json'

以上希望有帮助!


推荐阅读