代码之家  ›  专栏  ›  技术社区  ›  Rui Jarimba

在多个发布任务中设置和使用环境变量

  •  0
  • Rui Jarimba  · 技术社区  · 7 年前

    问题

    如何将值从发布管道传递到测试程序集和控制台应用程序(.exe)?在这种特殊情况下,我需要传递测试程序集和控制台应用程序都使用的个人访问令牌(pat),如下所示:

    string token = Environment.GetEnvironmentVariable("appSettings_personalAccessToken");
    

    我一直试图在一个特定任务中设置一个环境变量,但在其他任务中无法使用它。

    细节

    我配置了一个发布管道,它运行一些集成测试并运行执行控制台应用程序的PowerShell脚本:

    Release pipeline tasks

    集成测试和控制台应用程序都使用个人访问令牌(PAT)访问Azure DevOps REST API。我正在从名为 appSettings_personalAccessToken ,应在释放管道中设置。

    Set token release task

    我试图在第一个任务(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"
    
    4 回复  |  直到 7 年前
        1
  •  2
  •   Daniel Mann    7 年前

    你用不着拍这个。使用 $(System.AccessToken) . 您可以授予对系统提供的OAuth令牌的生成或发布访问权,然后在需要auth令牌的实例中引用该令牌。

    请注意,您需要 grant access to the OAuth token ,否则将不起作用。

        2
  •  0
  •   Theo    7 年前

    这里的问题是,Windows不会在创建/更改或删除时自动刷新环境变量。 只有在重新启动 explorer.exe 处理或手动设置变量
    我的电脑属性高级环境变量 .

    然后资源管理器广播 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 价值。

    希望有帮助。

        3
  •  0
  •   henrycarteruk    7 年前

    使用此命令时:

    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将看到 # 并对这一行的其余部分进行评论

        4
  •  0
  •   Rui Jarimba    7 年前

    我将在这里发布我的解决方案,希望它对其他可能有相同问题的人有用。谢谢@matt和@theo指点我的方向。

    我对发布变量的工作方式有一个错误的理解。我以为这些只能在任务级别上使用,不能用于从发布管道执行的任何应用程序或测试程序集——这就是我试图使用PowerShell设置它们的原因。

    因此,解决方案非常简单-我删除了试图设置环境变量的PowerShell任务,并按如下所示设置该变量:

    Release definition variables