You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PyYAML提取ADO YAML文件中嵌套的AzureKeyVault@2任务

提取ADO YAML中任意位置的AzureKeyVault@2任务属性

当然可以做到。由于ADO DevOps YAML的任务可能嵌套在stages、jobs、steps等不同层级下,固定路径查询行不通,递归遍历所有YAML节点是可靠的解决方案。

原有代码问题分析

你之前的代码无法运行主要有两个原因:

  • ADO YAML的顶层结构通常是列表(而非字典),直接调用prime_service.keys()会抛出属性错误
  • 没有处理嵌套结构,无法定位到深层节点中的任务

解决方案代码

以下代码通过递归遍历所有节点,能精准捕获任意位置的AzureKeyVault@2任务:

import yaml

def find_azure_keyvault_tasks(node):
    """递归遍历YAML节点,收集所有AzureKeyVault@2任务"""
    tasks = []
    # 处理列表类型节点,遍历每个元素
    if isinstance(node, list):
        for item in node:
            tasks.extend(find_azure_keyvault_tasks(item))
    # 处理字典类型节点,检查是否为目标任务
    elif isinstance(node, dict):
        if node.get("task") == "AzureKeyVault@2":
            tasks.append(node)
        # 递归遍历字典的所有值
        for value in node.values():
            tasks.extend(find_azure_keyvault_tasks(value))
    return tasks

# 加载目标YAML文件
with open("example.yaml", "r") as stream:
    yaml_content = yaml.safe_load(stream)

# 收集所有符合条件的任务
keyvault_tasks = find_azure_keyvault_tasks(yaml_content)

# 输出任务属性(可按需调整输出格式)
for idx, task in enumerate(keyvault_tasks, 1):
    print(f"=== 第{idx}个AzureKeyVault@2任务 ===")
    print(f"显示名称: {task.get('displayName', '无')}")
    print("输入参数:")
    inputs = task.get("inputs", {})
    for param, value in inputs.items():
        print(f"  {param}: {value}")
    print()

代码说明

  • find_azure_keyvault_tasks函数会递归遍历YAML的所有节点,无论是列表还是字典,只要发现包含task: AzureKeyVault@2的字典,就加入结果列表
  • 不管任务嵌套在stages[*].jobs[*].steps[*]还是直接在顶层steps中,都能被捕获
  • 最后可根据需求提取任务的displayName、inputs等任意属性

内容的提问来源于stack exchange,提问作者gianniv71

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 13:42:17