azure-devops - 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 在此提交中没有更改。
是否可以创建一个通用管道,或者我们应该为每个由特定文件提交触发的模板创建单独的管道?
解决方案
可以只定义一个管道来部署更改的模板。您需要添加脚本任务以在管道中获取更改的模板文件名。
使用 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'
以上希望有帮助!
推荐阅读
- ruby-on-rails - 在 Rails 中使用 HAML 设置表单样式
- google-cloud-platform - Cloud Foundry cli i/o 超时
- spring-integration - 如何在java中实现集成路由器
- javascript - React + immutable.js:将 Map 合并到 Map 列表中以更新状态
- c++ - 用于验证 Visual Studio 一致性开关对生成代码的影响的工具
- r - 谷歌表格上的 R 脚本
- mysql - 我的 SQL 语句有问题
- android - 过滤数据后如何重新绑定 SwipeMenuListView onMenuItemClick 项目?
- rx-java - 如何在 RxJava Iterable Observable 中重复一个但继续其他的
- julia - Julia 导入包存储为变量