1

尝试读取在 azure 发布管道中设置的Secret 变量时,出现以下错误。

术语“SecretVariableName”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。……

我知道该变量是 100% 正确的,但以下方法均无助于阅读它。其他非秘密变量工作得很好。

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

所有这些都不起作用。其中 SecretVariableName 是 Release Pipeline 中的一个秘密变量。

作为旁注:

  1. 对于非秘密变量,它工作得很好。
  2. 在管道中作为内联脚本运行也可以。

问题是在尝试读取用于创建 vsix 文件并上传到visualstudio 市场的市场任务中的秘密变量时

我怎样才能成功访问它?

谢谢,

4

2 回答 2

0

秘密变量使用 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定义映射秘密变量。此示例说明如何在 Azure 文件复制任务中$(vmsUser)使用机密变量。$(vmsAdminPass)

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)

例如,请参阅

于 2020-06-08T08:43:50.033 回答
0

没有任何我能找到有用文档,并花了几天时间自己解决这个问题——尝试了很多事情和建议,但没有成功。我终于自己解决了它,希望能帮助其他人不要像我一样浪费时间。


# 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/

于 2020-07-12T06:26:12.373 回答