如何在Azure DevOps Pipeline中设置和读取用户环境变量?

时间:2018-09-20 20:26:36

标签: azure continuous-integration azure-devops azure-pipelines azure-pipelines-build-task

我有一些测试自动化代码,可以从本地计算机上存储的环境变量中读取一些值,如下所示:

Environment.GetEnvironmentVariable("SAUCE_USERNAME", EnvironmentVariableTarget.User);

我正在尝试使用Azure Pipelines在管道执行期间创建此变量,然后在我的测试自动化代码中读取它。使用YAML文件。

我正在Azure管道的VS测试步骤中读取此变量。因此,如果我设置该变量,则必须在Azure Pipeline的整个生命周期内使用。

我尝试使用文档here,但未成功。

也尝试了以下代码,但由于以下错误而失败:

  

azure-pipelines.yml(行:39,列:1,Idx:1252)-(行:39,列:1,   Idx:1252):在扫描简单密钥时,找不到预期的':'。

# Create a secret variable
- powershell: |
Write-Host '##vso[task.setvariable variable=sauce.userName;issecret=true]abc'

# Attempt to output the value in various ways
- powershell: |
# Using an input-macro:
Write-Host "This works: $(sauce.userName)"

# Using the env var directly:
Write-Host "This does not work: $env:SAUCE_USERNAME"

# Using the mapped env var:
Write-Host "This works: $env:SAUCE_USERNAME"
env:
SAUCE_USERNAME: $(sauce.userName)

4 个答案:

答案 0 :(得分:3)

有可能有其他的方法可以做到这一点,但是这是我能够做到这一点:

  1. 在Azure中的DevOps管道创建变量,提供这些变量的值。
  2. 创建一个PowerShell脚本,你会在一开始设置你的信封变量运行。 This is我什么辣妹的样子。
  3. 首先在CI管道中单独运行此Posh,这将为用于运行管道的VM设置环境变量。

这是另一个detailed article,可以帮助您解决这个问题。

答案 1 :(得分:3)

我尝试使用以上答案中建议的以下两种语法,但是当尝试在管道中更远的任务中使用环境变量时(例如在构建过程中或在运行测试期间),环境变量始终为空。

[Environment]::SetEnvironmentVariable("SAUCE_USERNAME", "$(sauceUserName)", "User")

variables:
  sauceUserName: '$(sauceUserName)'

对我有用的是使用语法在嵌入式PowerShell脚本任务中编写Azure DevOps变量:

- task: PowerShell@2
  displayName: Add the username as an environment variable so the tests can find it.
  inputs:
    targetType: 'inline'
    script: |
      Write-Host "Making the sauceUsername available as an environment variable."
      Write-Host "##vso[task.setvariable variable=SAUCE_USERNAME;]$(sauceUserName)"

然后,我的构建任务便能够找到环境变量,并且我还可以在PowerShell脚本任务中通过以下代码在管道中进一步访问它:

- task: PowerShell@2
  displayName: Display the environment variable value for debugging purposes.
  inputs:
    targetType: 'inline'
    script: |
      [string] $username= $Env:SAUCE_USERNAME
      Write-Host "The SAUCE_USERNAME environment variable value is '$username'."

答案 2 :(得分:2)

设置管道变量,然后在yaml文件中尝试以下映射:

# ASP.NET Core (.NET Framework)
# Build and test ASP.NET Core projects targeting the full .NET Framework.
# Add steps that publish symbols, save build artifacts, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/dotnet-core

pool:
  vmImage: 'VS2017-Win2016'

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'
  yourEnvVar: '$(yourPipelineVariable)'
  yourOtherEnvVar: '$(yourOtherPipelineVariable)'

答案 3 :(得分:1)

我们为此争论了几个小时,认为这是因为无法设置环境变量,但最终与此无关。

以下是我们尝试为 Azure DevOps 解决这个问题的一些笔记:

  • 管道变量是环境变量,在流程的第一步被注入管道。您可以通过查看列出所有环境变量的 Initialize job 任务的日志来确认这一点。
  • 为了证明管道变量在系统中,您可以添加一个powershell任务并内联:
Write-Host "Pipeline Variable: $(FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD)"
Write-Host "Environment Variable: $Env:FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD"
  • 如果您想在某处使用管道变量,管道变量周围的 ()关键 - 例如$(myVar)

与用户问题无关,但可能对那些尝试使用双因素身份验证 (2FA) 上传到 AppStore 的人有所帮助。这是我们关注的 documentation

  • 我们必须设置 FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORDFASTLANE_SESSION 才能绕过 2FA。我们认为会话 1 允许我们登录 AppStoreConnect,但使用特定于应用程序的密码进行上传。尽管您从未看到使用的会话变量,但日志有点暗示这就是正在发生的事情。