用于仅部署更改的 arm 模板的 Azure DevOps 管道

Azure DevOps pipeline for deploying only changed arm templates

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

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

t1.json
t2.json
t3.json

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

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

开箱即用不支持您要求的内容。据我了解,您希望每个步骤或作业(取决于您组织管道的 hoq)都有触发器(基于文件更改)。但是,我不确定你是否需要这个。如果使用 use Create Or Update Resource Group doc here

部署未更改的 ARM 模板不会影响您的 Azure 资源

您也可以尝试手动检测更改了哪个文件(例如使用 powershell 和 git 命令),然后设置一个标志,稍后使用此 falg 来触发或不触发某些步骤。但对于你想要实现的目标来说,这看起来有点矫枉过正。

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

使用git 命令git diff-tree --no-commit-id --name-only -r commitId 可以很容易地获取更改的文件。当您获得更改后的文件名时,您需要使用表达式 ##vso[task.setvariable variable=VariableName]value assign it to a variable。然后你可以在 AzureResourceGroupDeployment task

中像这样设置 csmFile 参数 csmFile: '**$(fileName)'

您可以查看下面的 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'

希望以上内容对您有所帮助!