如何使用 Azure DevOps REST API 覆盖列表变量?

How Can I Overwrite a List Variable Using Azure DevOps REST API?

如果我想使用带有覆盖变量的 AzureDevops 对构建进行排队,我必须传递一个参数字符串:

{   "definition" : { "id" : [BUILD_ID] },
    "parameters" : str(variables_to_overwrite) 
}

其中 variables_to_overwrite 是这样的字典:

variables_to_overwrite = {
       "list_1" : str( ['A', 'B', 'C'] )
       "list_2" : str( ['D', 'E'] )
    }

如果我不将这些列表转换为字符串,构建将不会排队。我在排队构建之前打印出参数,它们看起来正确:

{'definition': {'id': [BUILD_ID}, 
 'parameters': '{\'list_1\': "\'[\'A\', \'B\', \'C\']\'", \'list_2\': "\'[\'D\', \'E\']\'}'

但是当我让构建打印出它看到的参数时,它会打印:

'--list_1', "'['A", "B',", "'C"]'", '--list_2', "'['D", "E']'"

如您所见,单引号和双引号已经变得相当混乱,这意味着解析 args 的程序不会将其视为两个 args,而是七个!

我尝试用单引号强制替换所有双引号,但是当我这样做时,构建不会排队。我什至试过这样重写它:

{'definition': {'id': [BUILD_ID}, 
 'parameters': '{\'list_1\': \'[\'A\', \'B\', \'C\']\', \'list_2\': \'[\'D\', \'E\']\'}'

但是当我返回构建结果时,它做了同样的事情,添加了混合双引号和单引号(与前面描述的方式完全相同)。

如何防止 DevOps 破坏作为参数传递的列表和字典中的引号对?我已经尝试了我能想到的所有排列,包括手动换行它在引号中,替换引号,使用 json.dumps,等等。没有任何效果。让构建进入队列的唯一方法是传递一个字符串,无论它得到什么引号输入,无论是否转义,devOps 都会通过并用 single-quote, double-quote 模式替换所有引号。

经过长时间的反复试验,我确定 Azure DevOps 要求用于覆盖的列表具有以下格式:

'[]',
'"[\'A\', \'B\']"'

也就是single-quote, double-quote, bracket, escaped single quotes inside the list, bracket, double-quote, single-quote。引用样式不能互换,需要转义字符。任何偏差都会导致问题中描述的问题。

使用 str() 在 Python 中几乎不可能做到这一点。但是,可以使用 repr() 来完成。

定义 variables_to_overwrite 时,不要将任何列表转换为字符串(如问题所示)。相反,将它们保留为列表,然后执行以下类型的替换:

if variables_to_overwrite:
    for key in variables_to_overwrite:
        value = variables_to_overwrite[key]
        if type(value) == list:
            variables_to_overwrite[key] = '"' + repr(value) + '"'   # THIS FORMAT IS CRUCIAL

最后,定义您的参数:

params = {
    "definition": {
        "id": build_id
    },
    "parameters" : str(variables_to_overwrite)   # THIS IS THE ONLY PLACE TO USE STR()
}

这会将列表转换为 Azure DevOps 要求的奇怪字符串格式,并防止 DevOps 破坏引号。