Как распаковать или извлечь значение вложенной переменной, хранящейся в группе Azure DevOps Build Piplines 'Variables? - PullRequest
3 голосов
/ 09 января 2020

Можно ли использовать переменную внутри переменной в скрипте Powershell с Azure Переменными конвейера?

SCENARIO

  1. Две переменные установить в Azure Трубопроводы Группа переменных - DeploymentCredentials

    a. DeployUATApiPassword = "123456"

    б. DeployPRODApiPassword = "789654"

  2. Другая переменная устанавливается в разделе Переменные конвейера как DeploymentEnvironment

  3. Во время выполнения значение * Переменная 1025 * имеет значение UAT или PROD

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

    # setting the value of the variable to UAT
    Write-Host "##vso[task.setvariable variable=DeploymentEnvironment]UAT" 
    
  5. Теперь переменная DevelopmentEnvironment имеет значение UAT. На следующем шаге я хочу получить пароль для Среда развертывания UAT, известная только во время выполнения.

    # I want to get the Password 
    # The following works! but not useful for me, UAT is hard-coded!!
    $deployPwd = $(DeployUATApiPassword) # works! but not useful for me, UAT is hard-coded!!
    
    # I want to get the Password
    # the following doesn't work, I only know the environment at runtime
    # Replaces the inner variable to `DeployUATApiPassword`
    # Raises an error, DeployUATApiPassword : The term 'DeployUATApiPassword' is not recognized as the name of a cmdlet...
    $deployPwd = $(Deploy$(DeploymentEnvironment)ApiPassword) 
    
    # All the following didn't work either, but no error...
    Write-Host $('Deploy$(DeploymentEnvironment)ApiPassword')     # Output: DeployUATApiPassword
    Write-Host $($("Deploy$(DeploymentEnvironment)ApiPassword"))  # Output: DeployUATApiPassword
    Write-Host { 'Deploy$(DeploymentEnvironment)ApiPassword' }    # Output: 'DeployUATApiPassword'
    Write-Host { Deploy$(DeploymentEnvironment)ApiPassword }      # Output: DeployUATApiPassword
    Write-Host { $(Deploy$(DeploymentEnvironment)ApiPassword) }   # Output: $(DeployUATApiPassword) 
    

Точно так же я пытался получить pwd несколькими способами, но ничего не получалось. Например, одним из способов было создание другой переменной DeployApiPassword, и я установил значение переменной Deploy$(DeploymentEnvironment)ApiPassword. Не повезло и в этом ...

$deployPwd = $(DeployApiPassword) # Output: DeployUATApiPassword

DESIRED OUTPUT

Я хочу получить пароль от одной из переменных, которая установлена ​​в группе переменных. Имя переменной пароля содержит среду развертывания. Среда развертывания устанавливается только во время выполнения.

    # I know something is wrong with the following, but that's how I want to run.
    $deployPwd = $(Deploy$(DeploymentEnvironment)ApiPassword) 

    Write-Host $deployPwd # output: *** (of course, the pwd is hidden, but at least it fetches)

Ответы [ 2 ]

0 голосов
/ 10 января 2020

Я заметил, что значение, возвращаемое 'Deploy$(DeploymentEnvironment)ApiPassword', является строковым типом, однако $() принимает переменную, а не строку.

В официальном документе секретные переменные говорится на секрет нельзя ссылаться напрямую, как на обычную переменную. Вы должны вручную явно отобразить их, используя раздел Environment .

Вам нужно будет использовать if statement. А в разделах Переменные среды Сопоставьте секретные переменные с переменными UATpassword и PRODpassword, а затем обратитесь к ним в сценариях, используя $env:UATpassword

enter image description here

Из журнала видно, что пароль получен из скрипта.

enter image description here

0 голосов
/ 10 января 2020

Переменные, заданные в Azure Группа переменных конвейеров будет использоваться в качестве переменных среды в задаче PowerShell. Итак, в основном вам нужно получить значение как:

$environment = $env:DeploymentEnvironment
$deployPwd = $env:DeployUATApiPassword

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

$environment= $env:DeploymentEnvironment

Write-Host "Deployment Environment is " $environment

$realName = $("Deploy${environment}ApiPassword")
$pwd = [Environment]::GetEnvironmentVariable($realName)

#I used UAT password, check it here
Write-Host $pwd.Equals("123456")

Выход:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...