Как перезаписать переменную списка с помощью API-интерфейса REST Azure DevOps? - PullRequest
2 голосов
/ 21 сентября 2019

Если я хочу поставить в очередь сборку с помощью AzureDevops с перезаписанными переменными, я должен передать строку параметров:

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

, где переменные_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\']\'}'

, но когда у меня естьbuild выводит на экран аргументы, которые он видит, он печатает:

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

Как вы можете видеть, одинарные и двойные кавычки смешались , что означает программы, которые разбирают args don 'Это не два аргумента, а семь!

Я попытался принудительно заменить все двойные кавычки одинарными, но когда я это сделаю, сборка не будет помещена в очередь.Я даже попытался переписать его так:

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

Но когда я вернул результат сборки, он сделал то же самое, добавив двойные кавычки, смешанные с одинарными кавычками (точно так же, какранее описано).

Как я могу предотвратить уничтожение DevOps парных котировок в таких вещах, как списки и дикты, которые передаются в качестве параметров? Я пробовал каждую перестановку, которую только мог придумать, в том числе и вручнуюупаковка в кавычки, замена кавычек, использование json.dumps и т. д. Ничего не работает.Единственный способ получить сборку в очередь - это передать строку, и независимо от того, какие входные данные для кавычек она получает, экранированные или нет, devOps проходит и заменяет все кавычки шаблоном single-quote, double-quote.

1 Ответ

0 голосов
/ 23 сентября 2019

После долгих проб и ошибок я определил, что для AzO 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 искажать кавычки.

...