Я получаю доступ к секретному значению, используя AzureKeyVault@2
на предыдущем этапе, а затем использую команду PowerShell@2
для выполнения сценария PowerShell. Я хочу выполнить этот шаг условно.
Вот переменная (ключ), которую я извлекаю из Key Vault. Это переменная, потому что она будет меняться в зависимости от окружающей среды.
variables:
DefaultConnection : 'dynamic-key-dev'
Я могу получить секрет, используя
- task: AzureKeyVault@2
inputs:
azureSubscription: 'Azure Key Vault Service Connection'
KeyVaultName: 'kv-example-kv'
SecretsFilter: ${{ variables.DefaultConnection }}
RunAsPreJob: false
Теперь я хочу условно выполнить следующий шаг при условии, что секрет содержит определенные ключевые слова.
- task: PowerShell@2
condition: contains("$env:MY_MAPPED_SEC"), 'must-contain')
continueOnError: true
inputs:
targetType: 'inline'
script: |
echo "Do Something with $env:MY_MAPPED_SEC"
env:
MY_MAPPED_SEC: $(${{ variables.DefaultConnection }})
condition
не принимает значение true. Без каких-либо условий я проверил, что $env:MY_MAPPED_SEC
правильно отображается и извлекается из KV.
Условия оцениваются, чтобы определить, начинать ли этап, работу или шаг. Следовательно, ничего, вычисленное во время выполнения внутри этой единицы работы, недоступно.
Другими словами, поскольку переменная среды MY_MAPPED_SEC
установлена внутри задачи PowerShell@2
, ее нельзя использовать в качестве условия для самой задачи.
Итак, вместо:
- task: PowerShell@2
condition: contains("$env:MY_MAPPED_SEC"), 'must-contain')
# ...
Попробуйте что-то вроде (не проверено):
- task: PowerShell@2
condition: contains(variables['${{ variables.DefaultConnection }}'], 'must-contain')
# ...
На основе вашего образца YAML оценка условия будет осуществляться до установки переменной среды задачи, поэтому переменную среды невозможно правильно прочитать в условии.
В дополнение к методу, которым поделился Руй Джаримба, я хотел бы поделиться еще одним методом.
Если вам нужно сопоставить секретную переменную с переменной среды Pipeline и выполнить следующие действия, вы можете добавить дополнительный шаг к использованию команды logging, чтобы установить переменную для сопоставления секретной переменной с переменной среды Pipeline.
Например:
- powershell: echo "##vso[task.setvariable variable=MY_MAPPED_SEC]$(${{ variables.DefaultConnection }})"
Вот пример YAML:
variables:
DefaultConnection : 'dynamic-key-dev'
steps:
- task: AzureKeyVault@2
inputs:
azureSubscription: 'Azure Key Vault Service Connection'
KeyVaultName: 'kv-example-kv'
SecretsFilter: ${{ variables.DefaultConnection }}
RunAsPreJob: false
- powershell: echo "##vso[task.setvariable variable=MY_MAPPED_SEC]$(${{ variables.DefaultConnection }})"
- task: PowerShell@2
inputs:
targetType: 'inline'
script: |
echo "Do Something with $env:MY_MAPPED_SEC"
condition: contains(variables['MY_MAPPED_SEC'], 'must-contain')
Результат:
В этом случае вы можете напрямую использовать сопоставленную переменную (например, $(MY_MAPPED_SEC)
) на следующих шагах, не добавляя ее в поле задачи env
.
Это сработало! Спасибо.