Конвейеры ADO YAML | Как получить секретную переменную из группы переменных на основе значения другой переменной

В моем проекте я могу без проблем получить значение переменной, определенной внутри группы переменных, например:

steps:
      - checkout: none
      - bash: |
          echo $(shared-smtp-user)

Но затем, позже в коде, мне нужно поместить в файлы значения некоторых переменных из группы переменных, и я делаю что-то вроде этого

parameters:
    # The targetVariables to put inside secrets/, for example
    # targetVariables:
    # - shared-azure-devops-pat
    # - shared-ldap-password
    # - shared-ldap-user
    # - shared-smtp-user
  - name: targetVariables
    type: object

jobs:
  - job: echo_secret_files
    displayName: 🗣️ Echo secret files
    steps:
      - checkout: none
      - bash: |
          echo "Echoing targetVariables into secrets/"
          echo "using targetVariables ${{ convertToJson(parameters.targetVariables) }}"
          mkdir -p ./secrets/
          echo $(shared-smtp-user) # THIS WORKS !!!
        displayName: Display information about the secrets being used
      - ${{ each variableName in parameters.targetVariables }}:
          - bash: |
              echo $SECRET_VALUE > ./secrets/${variableName}.txt
            env:
              SECRET_VALUE: "$( ${{ variableName }} )" # THIS IS NOT WORKING!!!
            displayName: Generate file for ${{ variableName }}
      - bash: tree secrets/ -a
        displayName: Display the generated secrets

По какой-то странной причине я не могу присвоить значение SECRET_VALUE, используя этот синтаксис "$( ${{ variableName }} )"

Что я пытаюсь сделать: для каждого элемента внутри parameters.targetVariables установить значение SECRET_VALUE на $(variableName), а затем повторить $SECRET_VALUE в файл.

Есть ли способ сделать $(myVariableNameHere), но без жесткого кодирования myVariableNameHere, а вместо этого использовать переменную из цикла each (называемую variableName)?

Стоит ли изучать 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
78
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Синтаксис макроса для доступа к переменной — $(var) (без пробелов), а не $( var ).

Итак, вместо:

SECRET_VALUE: "$( ${{ variableName }} )"

Пытаться:

SECRET_VALUE: $(${{ variableName }})

Пример

Запуск некоторых тестов с использованием агента сборки Linux:

trigger: none

pool:
  vmImage: 'ubuntu-latest'

parameters:
  - name: variables
    displayName: Name of variables
    type: object
    default:
      - foo

variables:
  - name: foo
    value: Foo Value

jobs:
  - job: A
    displayName: Job A
    steps:
      - checkout: none

      - ${{ each variable in parameters.variables }}:
          - script: echo "${{ variable }}=$CURRENT_VAR" # Output: foo=$( foo )
            displayName: 'Echo ${{ variable }}'
            env:
              CURRENT_VAR: $( ${{ variable }} )  # <--------------- WITH SPACES

          - script: echo "${{ variable }}=$CURRENT_VAR" # Output: foo=Foo Value
            displayName: 'Echo ${{ variable }}'
            env:
              CURRENT_VAR: $(${{ variable }})    # <--------------- WITHOUT SPACES

и вы, и Кевин Лу-MSFT правы, спасибо!!

Krapp 26.06.2024 14:26
Ответ принят как подходящий

Как ответил Руи Джаримба, вам нужно изменить формат env на ENV_VALUE: $(${{ variableName }}), чтобы получить секретную переменную в группе переменных на основе значения параметра.

Кроме того, для достижения цели вам необходимо внести следующие изменения в YAML.

1. Вам необходимо изменить bash-скрипт:

От:

echo $SECRET_VALUE > ./secrets/${variableName}.txt

К

echo $SECRET_VALUE > ./secrets/${{variableName}}.txt

Затем он сгенерирует текстовый файл на основе имени переменной.

2. Вам необходимо изменить ключевое слово SECRET в переменной среды в задаче bash.

Например:

SECRET_VALUE -> MAPPED_VALUE

Согласно моему тесту, если переменная env содержит ключевое слово SECRET, она вернет пустое значение.

Вот полный образец yaml:

pool:
  vmimage: ubuntu-latest
parameters:
  - name: targetVariables
    type: object
    default:
     - shared-smtp-user
     - shared-ldap-password

variables:
- group:  variablegroupname



jobs:
  - job: echo_secret_files
    displayName: 🗣️ Echo secret files
    steps:
      - checkout: none
      - bash: |
          echo "Echoing targetVariables into secrets/"
          echo "using targetVariables ${{ convertToJson(parameters.targetVariables) }}"
          mkdir -p ./secrets/
          echo $(shared-smtp-user)
        displayName: Display information about the secrets being used
      - ${{ each variableName in parameters.targetVariables }}:
          - bash: |
              echo $MAPPED_VALUE > ./secrets/${{variableName}}.txt
            env:
               MAPPED_VALUE: $(${{ variableName }}) 
            displayName: Generate file for ${{ variableName }}
   
      - bash: tree secrets/ -a
        displayName: Display the generated secrets

Результат:

И вы, и Руй Джаримба правы, спасибо! это решило проблему

Krapp 26.06.2024 14:26

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

Похожие вопросы

Аутентификация с использованием Azure CLI поддерживается только для пользователя (а не для субъекта-службы)
Почему Azure Pipelines устанавливает неправильную версию .NET SDK (согласно global.json)
Необходимо ли после миграции переходить с размещенного XML на модель процесса наследования?
Как получить доступ к артефакту из расширения Azure?
Azure DevOps — ошибка JFrogNuget — произошла ошибка при выполнении задачи: ошибка: команда не выполнена
Динамическое заполнение DependsOn в задании Yaml Azure DevOps
Ошибка при развертывании приложений в локальном кластере K8 с использованием конвейера Azure Devops CI/CD
Команда Git Fetch не получает последние изменения из репозитория Azure DevOps
Конвейер Azure DevOps yaml: использование выходных переменных в условиях оценивается неправильно
Запуск конвейера выпуска Azure DevOps из приложения логики и получение выходных данных переменной среды из конвейера