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

Python脚本转换CSV为Azure DevOps Pipeline YAML的问题求助

解决CSV转Azure DevOps Pipeline YAML的脚本问题

现有Python转换脚本

import csv
import yaml
in_file  = open(r'C:\Users\246742\Desktop\Book2.csv', "r")
out_file = open('yaml_file.yaml', "w")
items = []

def convert_to_yaml(line, counter):
    item = {
        'task': line[0],
        'displayName': line[1],
        'inputs': {
            'ConnectedServiceName' : line[2],
            'Action' :line[3], 
            'KeyVaultName' :line[4],
            'SecretName' :line[5],
            'Secret':line[6],
            'VariableName':line[7],
            'Overwrite' : line[8]
            }
    }
    items.append(item)

try:
    reader = csv.reader(in_file)
    next(reader) # skip headers
    for counter, line in enumerate(reader):
        convert_to_yaml(line, counter)
    out_file.write( yaml.dump(items, default_flow_style=False) )

finally:
    in_file.close()
    out_file.close()

当前生成的YAML输出

- displayName: 'Azure Key Vault: SetSecret adf-bookings'
  inputs:
    Action: abc_QA_SPN
    ConnectedServiceName: abc_QA_SPN
    KeyVaultName: SetSecret
    Overwrite: adf-booking
    Secret: adf-booking
    SecretName: $(QAkvabc)
    VariableName: $(booking)
  task: maikvandergaag.maikvandergaag-azurekeyvault.azurekeyvault.azurekeyvaultactions@2
- displayName: 'Azure Key Vault: SetSecret adf-booking'
  inputs:
    Action: abc_QA_SPN
    ConnectedServiceName: abc_QA_SPN
    KeyVaultName: SetSecret
    Overwrite: adf-booking
    Secret: adf-booking
    SecretName: $(QAkvabc)
    VariableName: $(booking)
  task: maikvandergaag.maikvandergaag-azurekeyvault.azurekeyvault.azurekeyvaultactions@2

期望的Azure DevOps Pipeline YAML输出

trigger:
- none

variables:
- group: Devportal

pool:
  name: Ubuntu 20.04

steps:
- task: maikvandergaag.maikvandergaag-azurekeyvault.azurekeyvault.azurekeyvaultactions@2
  displayName: 'Azure Key Vault: SetSecret adf-bookings'
  inputs:
    ConnectedServiceName: 'abc_QA_SPN'
    Action: SetSecret
    KeyVaultName: '$(QAkvabc)'
    SecretName: 'booking'
    Secret: '$(booking)'
    VariableName: 'booking'
    Overwrite: false
- task: maikvandergaag.maikvandergaag-azurekeyvault.azurekeyvault.azurekeyvaultactions@2
  displayName: 'Azure Key Vault: SetSecret adf-bookings'
  inputs:
    ConnectedServiceName: 'abc_QA_SPN'
    Action: SetSecret
    KeyVaultName: '$(QAkvabc)'
    SecretName: 'booking'
    Secret: '$(booking)'
    VariableName: 'booking'
    Overwrite: false

当前存在的问题

  • 字典键按字母排序,无法保持指定的顺序(比如task应该在displayName之前)
  • 输出值未自动添加引号,不符合期望格式
  • 缺少Azure DevOps Pipeline必需的固定结构:trigger、variables、pool

修改后的Python脚本

import csv
import yaml
from collections import OrderedDict

# 定义Pipeline固定结构
pipeline_structure = OrderedDict([
    ('trigger', ['none']),
    ('variables', [OrderedDict([('group', 'Devportal')])]),
    ('pool', OrderedDict([('name', 'Ubuntu 20.04')])),
    ('steps', [])
])

def convert_to_yaml(line):
    # 用OrderedDict保持键的顺序
    task_item = OrderedDict([
        ('task', line[0]),
        ('displayName', line[1]),
        ('inputs', OrderedDict([
            ('ConnectedServiceName', line[2]),
            ('Action', line[3]),
            ('KeyVaultName', line[4]),
            ('SecretName', line[5]),
            ('Secret', line[6]),
            ('VariableName', line[7]),
            ('Overwrite', line[8].lower() == 'true')  # 转换为布尔值
        ]))
    ])
    return task_item

try:
    with open(r'C:\Users\246742\Desktop\Book2.csv', "r") as in_file, open('yaml_file.yaml', "w") as out_file:
        reader = csv.reader(in_file)
        next(reader)  # 跳过表头
        for line in reader:
            pipeline_structure['steps'].append(convert_to_yaml(line))
        
        # 使用yaml.dump时指定sort_keys=False保持顺序,default_style='"'给字符串加引号
        yaml.dump(pipeline_structure, out_file, default_flow_style=False, sort_keys=False, default_style='"')

except Exception as e:
    print(f"转换出错: {e}")

修改说明

  1. 保持键顺序:使用collections.OrderedDict定义字典,同时在yaml.dump中设置sort_keys=False,确保输出的键顺序与定义一致
  2. 添加引号:在yaml.dump中设置default_style='"',让所有字符串值自动添加双引号
  3. 添加固定结构:预先定义trigger、variables、pool等Pipeline必需的结构,将转换后的task步骤添加到steps列表中
  4. 类型转换:将Overwrite字段转换为布尔值(根据CSV中的值自动转为true/false)
  5. 文件操作优化:使用with语句自动管理文件的打开和关闭,避免手动关闭可能出现的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:40:30