如果我想使用带有覆盖变量的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']'"
如您所见,单引号和双引号变得非常混杂,这意味着解析arg的程序不会将其视为两个arg,而是七个!
我尝试用单引号强制替换所有双引号,但是当我这样做时,构建将不会排队。我什至尝试像这样重写它:
{'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
。引用样式不能互换,并且必须使用转义符。任何偏差都会导致问题中描述的问题。
在Python中使用,这几乎是不可能的str()
。但是,可以使用来完成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破坏引号。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句