OpenRewrite Recipe示例:匹配特定模板时为YAML添加键值对
按特定模板匹配为YAML添加参数的解决方案
需求明确
批量处理多个YAML文件,仅当stages序列中某个项的template字段值为templates/my-java-service-v1.yaml@codeway时,在其对应的parameters节点下追加openJdkVersion: 17参数;现有工具仅支持sequencePath匹配,无法区分同路径下的不同模板项,需通过模板值过滤实现精准修改。
具体实现方案
方案1:使用yq工具批量处理(通用场景)
yq是一款强大的YAML处理工具,支持条件筛选与节点修改,适合批量文件处理:
- 单文件处理命令:
yq eval ' (.stages[] | select(.template == "templates/my-java-service-v1.yaml@codeway") | .parameters) += {"openJdkVersion": 17} ' target-file.yaml
- 多文件批量处理(遍历当前目录所有YAML文件):
for file in *.yaml; do yq eval -i ' (.stages[] | select(.template == "templates/my-java-service-v1.yaml@codeway") | .parameters) += {"openJdkVersion": 17} ' "$file" done
命令说明:
.stages[]:遍历stages下的所有子项select(.template == "..."):精准筛选出模板匹配的项.parameters += {...}:为匹配项的parameters节点追加指定参数
方案2:CI/CD Pipeline Recipe环境下的适配(以Azure DevOps为例)
如果是在仅支持sequencePath的Pipeline Recipe中,可通过模板条件判断实现:
stages: - ${{ each stage in stages }}: - ${{ if eq(stage.template, 'templates/my-java-service-v1.yaml@codeway') }}: - template: ${{ stage.template }} parameters: ${{ stage.parameters }} openJdkVersion: 17 - ${{ else }}: - template: ${{ stage.template }} parameters: ${{ stage.parameters }}
通过遍历原有stages,对每个stage做模板值判断,仅为匹配项追加参数,其余项保持原样。
核心思路
不管用哪种工具,核心都是先通过模板值做条件筛选,定位到需要修改的特定项后,再对其parameters节点进行修改,避免同sequencePath下的其他无关项被误操作。
内容的提问来源于stack exchange,提问作者manish kumar
相关产品推荐
相关产品推荐

