Невозможно прочитать секретную переменную конвейера выпуска Azure внутри задачи Marketplace

При попытке прочитать Секретные переменные, настроенные в конвейере выпуска Azure, я получил следующую ошибку.

Термин «SecretVariableName» не распознается как имя командлета, функции, файла сценария или работающей программы. ....

Я знаю, что переменная верна на 100%, но ни один из следующих способов не поможет ее прочитать. Другие несекретные переменные работают нормально.

$myvar1 = $(SecretVariableName)
$myvar2 = "$(SecretVariableName)"
$myvar3 = $Env:SecretVariableName

Все это НЕ работало. Где SecretVariableName - это секретная переменная внутри Release Pipeline.

В качестве примечания:

  1. Для несекретных переменных это работает нормально.
  2. Также работает встроенный скрипт в конвейере.

Проблема возникает при попытке чтения секретной переменной внутри задачи Marketplace, которая используется для создания файла vsix и загружается в торговая площадка visualstudio

Как я могу получить к нему доступ?

Спасибо,




Ответы (2)


Секретные переменные зашифрованы в состоянии покоя с помощью 2048-битного ключа RSA. Они автоматически маскируются из любого вывода журнала сборки или выпуска.

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

Каждая задача, которой необходимо использовать секрет в качестве переменной среды, выполняет переназначение. Если вы хотите использовать секретную переменную с именем mySecret из сценария, используйте раздел Environment входных переменных задачи сценария. Задайте имя переменной среды MYSECRET и установите значение $(mySecret).

Подробнее см. В этом официальном документ. Кроме того, вы можете обратиться к этому случае с аналогичной проблемой.

Обновление:

В следующем примере показано, как использовать секретную переменную с именем mySecret в сценарии PowerShell.

variables:
 GLOBAL_MYSECRET: $(mySecret) # this will not work because the variable needs to be mapped as env

steps:

- powershell: |
    # Using an input-macro:
    Write-Host "This works: $(mySecret)"

    # Using the mapped env var:
    Write-Host "This works: $env:MY_MAPPED_ENV_VAR"    # Recommended

  env:
    MY_MAPPED_ENV_VAR: $(mySecret) # right way to map to an env variable

Вы также можете отобразить секретные переменные, используя определение variables. В этом примере показано, как использовать секретные переменные $(vmsUser) и $(vmsAdminPass) в задаче копирования файлов Azure.

variables:
  VMS_USER: $(vmsUser)
  VMS_PASS: $(vmsAdminPass)    

steps:
- task: AzureFileCopy@4
  inputs:
    SourcePath: 'my/path'
    azureSubscription: 'my-subscription'
    Destination: 'AzureVMs'
    storage: 'my-storage'
    resourceGroup: 'my-rg'
    vmsAdminUserName: $(VMS_USER)
    vmsAdminPassword: $(VMS_PASS)

Примеры см. В это.

person Hugh Lin    schedule 08.06.2020
comment
Спасибо за ответ @ hugh-lin-msft. Задача слева - это Powershell, а не рыночная задача, которая пытается получить доступ к секретным переменным. ПРОБЛЕМА заключается в том, что я публикую файл vsix на торговой площадке, а затем все строки, которые пытаются прочитать секреты, терпят неудачу. См. Ошибку выше. Как я могу подойти к нему, чтобы получить к ним доступ? - person Koref Koref; 10.06.2020
comment
Задачи реализованы в виде кода, который выполняется на машине агента. Задачи только могут получить доступ к секретам, явно предоставленным им. Вы можете сослаться на Third-party build and release tasks часть в этом документе < / а>. - person Hugh Lin; 10.06.2020
comment
@ hugh-lin-msft Не могли бы вы привести мне пример? В документе они упомянули, что секреты должны быть сопоставлены, но они не показывают, где и как это сделать, чтобы сделать это доступным в сценарии. - person Koref Koref; 12.06.2020
comment
Спасибо @Hugn Lin -MSFT. Это все еще файл yaml. Вот как выглядит моя задача. github.com/microsoft/ vsts-extension-samples / tree / master / Посмотрите сценарий PS (MSBuild.ps1). Здесь я хотел бы получить доступ к секрету либо из переменных конвейера выпуска, либо из предыдущей задачи Azure KeyVault. Если вы видите элемент выполнения в task.json, это то место, куда будет загружен скрипт Powershell, и я не знаю, как здесь использовать yaml. Надеюсь, предоставленная ссылка даст вам больше контекста. - person Koref Koref; 17.06.2020
comment
тебе повезло с секретами? - person Eakan Gopalakrishnan; 13.06.2021

Нет документации, которую я мог бы найти полезной и потратить дни на то, чтобы разобраться в этом самостоятельно - безуспешно пробуя так много вещей и предложений. Я наконец-то решил это самостоятельно и, надеюсь, помогу кому-то другому не тратить впустую столько времени, как это сделал я.


# This gets ALL Task Variables that you can access (including Secret variables)
$allTaskVariablesIncludingSecrets = Get-VstsTaskVariableInfo

# Convert it to json it to see whats available during your debugging - this is just for you to see whats available for you to access.
$allTaskVariablesIncludingSecrets | ConvertTo-Json
#that will give you array of objects with three properties (Name, Secret and Value) in this format:
# [
#     {
#         "Name":  "SecretVariableName",
#         "Secret":  true,
#         "Value":  "***"
#     },
#     {
#         "Name":  "NotSecretVar",
#         "Secret":  false,
#         "Value":  "Some stuff here"
#     }
# ]

# Since our objective is to get a hold of Secret varibales, lets filter them
$secVariables = $allTaskVariablesIncludingSecrets | Where-Object {$_.Secret -eq $true}
# If one of your Secret Variable is called 'SecretVariableName', here is how you access it
$mySecretVarObject = $secVariables |  Where-Object {$_.Name -eq "SecretVariableName"}
$mySecret = $($mySecretVarObject.Value)
# This will give display *** for the value but Length will show you the actual length. So you are good to use $mySecret in your script. You don't NEED to SEE the actual value.
Write-Host "Value: $mySecret and Length: $($mySecret.Length)"

# Simply use $mySecret the way you would any local variable. No special treatment or husle needed

https://bitbucket.org/ZelalemW/how-to-access-secrets-in-ado/src/master/

person Koref Koref    schedule 12.07.2020
comment
Добро пожаловать в Stack Overflow! Хотя эта ссылка может дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. - person Rayan Ral; 12.07.2020
comment
Я действительно добавил вызов метода, но это имеет смысл @RayanRal и добавил фрагмент кода - person Koref Koref; 12.07.2020