如何用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
相关产品推荐
相关产品推荐

