В моем проекте я могу без проблем получить значение переменной, определенной внутри группы переменных, например:
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
)?
Синтаксис макроса для доступа к переменной — $(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
Как ответил Руи Джаримба, вам нужно изменить формат 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
Результат:
И вы, и Руй Джаримба правы, спасибо! это решило проблему
и вы, и Кевин Лу-MSFT правы, спасибо!!