Переменные среды как параметр объекта типа в конвейерах Azure DevOps

Я работаю над конвейером 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 и передать его в сценарий. Будем очень признательны за любые рекомендации или улучшения этой установки!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
85
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вместо того, чтобы передавать эти переменные среды как одну строку, я хочу передать их как объект для лучшей управляемости.

Чтобы удовлетворить ваши требования, вы можете использовать следующий формат параметров для определения значения 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 ... }} для перебора свойств параметра или, в качестве альтернативы, по массиву пользовательских объектов.

Пример 1

Перебор всех свойств параметра, например словаря (типа), и доступ к ключу (имени свойства) и соответствующему значению:

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 }}

Пример 2

Перебор массива пользовательских объектов:

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 }}

Привет, Руи. Это именно то, что я искал, большое спасибо!

wzdmeister 02.07.2024 15:54

Другие вопросы по теме