Я работаю над конвейером Azure DevOps, где мне нужно передать переменные среды в шаблон задания. Вместо того, чтобы передавать эти переменные среды как одну строку, я хочу передать их как объект для лучшей управляемости.
В виде строки (текущий подход - работает, но хакерски):
parameters:
- name: envVars
type: string
default: ""
...
- script |
${{ parameters.envVars}} <rest of command>
...
В качестве объекта:
parameters:
- name: envVars
type: object
default: { ENV_VAR: "value_example" }
- script |
<rest of command>
env:
${{ parameters.envVars }}
Во втором случае я надеюсь, что Azure DevOps правильно развернет объект envVars и это будет эквивалентно использованию
env:
ENV_VAR: "value_example"
ENV_VAR_B: "other_value"
...
# can still have other environment variables here that are not present in envVars
Однако я не нашел никакой подходящей документации по этому поводу в Azure DevOps и не совсем уверен, как лучше всего развернуть объект envVars и передать его в сценарий. Будем очень признательны за любые рекомендации или улучшения этой установки!
Вместо того, чтобы передавать эти переменные среды как одну строку, я хочу передать их как объект для лучшей управляемости.
Чтобы удовлетворить ваши требования, вы можете использовать следующий формат параметров для определения значения env объекта.
parameters:
- name: envVars
type: object
default:
ENV_VAR: "value_example"
ENV_VAR_B: "other_value"
steps:
- script: |
echo $ENV_VAR
echo $ENV_VAR_B
env:
${{ parameters.envVars }}
Но если вы используете параметры в поле env
, добавление дополнительных значений env не поддерживается.
Например:
- script: |
echo $ENV_VAR
echo $ENV_VAR_B
env:
${{ parameters.envVars }}
test: test1
Ниже будет показана ошибка:
В качестве обходного пути вы можете определить переменные в конвейере YAML, и переменная будет автоматически сопоставлена с переменной среды.
Например:
variables:
test: test1
parameters:
- name: envVars
type: object
default:
ENV_VAR: "value_example"
ENV_VAR_B: "other_value"
steps:
- script: |
echo $ENV_VAR
echo $ENV_VAR_B
echo $test
env:
${{ parameters.envVars }}
Результат:
В качестве альтернативы ответу Кевина вы можете использовать цикл ${{ each ... }}
для перебора свойств параметра или, в качестве альтернативы, по массиву пользовательских объектов.
Перебор всех свойств параметра, например словаря (типа), и доступ к ключу (имени свойства) и соответствующему значению:
parameters:
- name: envVars
type: object
default:
foo: foo value
bar: bar value
trigger: none
steps:
- checkout: none
- script: |
echo "$foo"
echo "$bar"
echo "$anotherVariable"
displayName: Display environment variables
env:
anotherVariable: anotherValue
${{ each variable in parameters.envVars }}:
${{ variable.Key }}: ${{ variable.Value }}
Перебор массива пользовательских объектов:
parameters:
- name: envVars
type: object
default:
- name: foo
value: foo value
- name: bar
value: bar value
trigger: none
steps:
- checkout: none
- script: |
echo "$foo"
echo "$bar"
echo "$anotherVariable"
displayName: Display environment variables
env:
anotherVariable: anotherValue
${{ each variable in parameters.envVars }}:
${{ variable.name }}: ${{ variable.value }}
Привет, Руи. Это именно то, что я искал, большое спасибо!