用于仅部署更改的 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'
希望以上内容对您有所帮助!
我们在 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
您也可以尝试手动检测更改了哪个文件(例如使用 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: '**$(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'
希望以上内容对您有所帮助!