如何使用 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 破坏引号。
如果我想使用带有覆盖变量的 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 破坏引号。