在多个发布任务中设置和使用环境变量
Setting and using an environment variable in multiple release tasks
问题
如何将值从发布管道传递到测试程序集和控制台应用程序 (.exe)?在这种特殊情况下,我需要传递测试程序集和控制台应用程序都使用的个人访问令牌 (PAT),如下所示:
string token = Environment.GetEnvironmentVariable("appSettings_personalAccessToken");
我一直在尝试在一个特定任务中设置环境变量,但我无法在其他任务中使用它。
详情
我已经配置了一个发布管道,它运行一些集成测试并运行一个执行控制台应用程序的 powershell 脚本:
集成测试和控制台应用程序都使用个人访问令牌 (PAT) 来访问 Azure DevOps REST API。我正在从名为 appSettings_personalAccessToken
的环境变量中读取此值,该变量应在发布管道中设置。
我试图在第一个任务(Powershell 任务 - 内联脚本)中设置 PAT,但它似乎在其他任务中被忽略了,我做错了什么?
我试过像这样在 powershell 任务中设置 PAT:
Write-Host ##vso[task.setvariable variable=appSettings_personalAccessToken;isSecret=false;isOutput=true;]$personalAccessToken
或者像这样:
[Environment]::SetEnvironmentVariable('appSettings_personalAccessToken', $personalAccessToken, 'User')
[Environment]::SetEnvironmentVariable('appSettings_personalAccessToken', $personalAccessToken, 'Machine')
但是这个值在其他任务中似乎被忽略了。我在这里错过了什么?
编辑 1
即使尝试设置在 powershell 任务中硬编码的 PAT 也不起作用:
Write-Host "##vso[task.setvariable variable=appSettings_personalAccessToken;isSecret=false;isOutput=true;]MY_TOKEN_VALUE"
当您使用此命令时:
Write-Host ##vso[task.setvariable variable=appSettings_personalAccessToken;isSecret=false;isOutput=true;]$personalAccessToken
您需要对数据进行引号:
Write-Host "##vso[task.setvariable variable=appSettings_personalAccessToken;isSecret=false;isOutput=true;]$personalAccessToken"
否则 PowerShell 会看到 #
并注释该行的其余部分
这里的问题是 Windows 不会自动刷新 create/change 上的环境变量或删除。
这只会在 explorer.exe
进程重启后或您在
中手动设置变量时发生
我的电脑 |属性 |进阶 |环境变量。
Explorer 然后向所有 windows 广播 WM_SETTINGCHANGE
消息以通知他们更改。
但是,即使手动执行此操作,已经 运行 的进程也可能无法获取更改,除非它们处理设置更改消息。
如果重启资源管理器没有问题,您可以尝试:
[Environment]::SetEnvironmentVariable('appSettings_personalAccessToken', $personalAccessToken, 'User')
[Environment]::SetEnvironmentVariable('appSettings_personalAccessToken', $personalAccessToken, 'Machine')
Stop-Process -ProcessName explorer
explorer.exe 进程应该会自动重新启动。这是由注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
AutoRestartShell
值控制的。
希望对您有所帮助。
您不需要为此使用 PAT。使用 $(System.AccessToken)
。您可以授予您对系统提供的 OAuth 令牌的构建或发布访问权限,然后在需要授权令牌的情况下参考它。
请注意,您需要grant access to the OAuth token,否则将无法正常工作。
我将 post 我的解决方案放在这里,希望它对可能遇到相同问题的其他人有用。感谢@Matt 和@Theo 为我指明了正确的方向。
我对发布变量的工作原理有错误的理解。我认为这些仅在任务级别可用,不适用于从发布管道执行的任何应用程序或测试程序集 - 这就是我尝试使用 Powershell 设置它们的原因。
所以解决方案非常简单——我删除了尝试设置环境变量的 powershell 任务并按如下方式设置变量:
问题
如何将值从发布管道传递到测试程序集和控制台应用程序 (.exe)?在这种特殊情况下,我需要传递测试程序集和控制台应用程序都使用的个人访问令牌 (PAT),如下所示:
string token = Environment.GetEnvironmentVariable("appSettings_personalAccessToken");
我一直在尝试在一个特定任务中设置环境变量,但我无法在其他任务中使用它。
详情
我已经配置了一个发布管道,它运行一些集成测试并运行一个执行控制台应用程序的 powershell 脚本:
集成测试和控制台应用程序都使用个人访问令牌 (PAT) 来访问 Azure DevOps REST API。我正在从名为 appSettings_personalAccessToken
的环境变量中读取此值,该变量应在发布管道中设置。
我试图在第一个任务(Powershell 任务 - 内联脚本)中设置 PAT,但它似乎在其他任务中被忽略了,我做错了什么?
我试过像这样在 powershell 任务中设置 PAT:
Write-Host ##vso[task.setvariable variable=appSettings_personalAccessToken;isSecret=false;isOutput=true;]$personalAccessToken
或者像这样:
[Environment]::SetEnvironmentVariable('appSettings_personalAccessToken', $personalAccessToken, 'User')
[Environment]::SetEnvironmentVariable('appSettings_personalAccessToken', $personalAccessToken, 'Machine')
但是这个值在其他任务中似乎被忽略了。我在这里错过了什么?
编辑 1
即使尝试设置在 powershell 任务中硬编码的 PAT 也不起作用:
Write-Host "##vso[task.setvariable variable=appSettings_personalAccessToken;isSecret=false;isOutput=true;]MY_TOKEN_VALUE"
当您使用此命令时:
Write-Host ##vso[task.setvariable variable=appSettings_personalAccessToken;isSecret=false;isOutput=true;]$personalAccessToken
您需要对数据进行引号:
Write-Host "##vso[task.setvariable variable=appSettings_personalAccessToken;isSecret=false;isOutput=true;]$personalAccessToken"
否则 PowerShell 会看到 #
并注释该行的其余部分
这里的问题是 Windows 不会自动刷新 create/change 上的环境变量或删除。
这只会在 explorer.exe
进程重启后或您在
中手动设置变量时发生
我的电脑 |属性 |进阶 |环境变量。
Explorer 然后向所有 windows 广播 WM_SETTINGCHANGE
消息以通知他们更改。
但是,即使手动执行此操作,已经 运行 的进程也可能无法获取更改,除非它们处理设置更改消息。
如果重启资源管理器没有问题,您可以尝试:
[Environment]::SetEnvironmentVariable('appSettings_personalAccessToken', $personalAccessToken, 'User')
[Environment]::SetEnvironmentVariable('appSettings_personalAccessToken', $personalAccessToken, 'Machine')
Stop-Process -ProcessName explorer
explorer.exe 进程应该会自动重新启动。这是由注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
AutoRestartShell
值控制的。
希望对您有所帮助。
您不需要为此使用 PAT。使用 $(System.AccessToken)
。您可以授予您对系统提供的 OAuth 令牌的构建或发布访问权限,然后在需要授权令牌的情况下参考它。
请注意,您需要grant access to the OAuth token,否则将无法正常工作。
我将 post 我的解决方案放在这里,希望它对可能遇到相同问题的其他人有用。感谢@Matt 和@Theo 为我指明了正确的方向。
我对发布变量的工作原理有错误的理解。我认为这些仅在任务级别可用,不适用于从发布管道执行的任何应用程序或测试程序集 - 这就是我尝试使用 Powershell 设置它们的原因。
所以解决方案非常简单——我删除了尝试设置环境变量的 powershell 任务并按如下方式设置变量: