【问题标题】:How to configure environment variables in Azure DevOps pipeline?如何在 Azure DevOps 管道中配置环境变量?
【发布时间】:2019-10-09 22:33:15
【问题描述】:

我有一个配置为从 JSON 文件和环境变量读取应用程序设置的 Azure 函数 (.NET Core):

var configurationBuilder = new ConfigurationBuilder()
                                .SetBasePath(_baseConfigurationPath)
                                .AddJsonFile("appsettings.json", optional: true)
                                .AddEnvironmentVariables()
                                .Build();

BuildAgentMonitorConfiguration configuration = configurationBuilder.Get<BuildAgentMonitorConfiguration>();

appsettings.json 具有以下结构:

{
  "ProjectBaseUrl": "https://my-project.visualstudio.com/",
  "ProjectName": "my-project",
  "AzureDevOpsPac": ".....",
  "SubscriptionId": "...",
  "AgentPool": {
    "PoolId": 38,
    "PoolName": "MyPool",
    "MinimumAgentCount": 2,
    "MaximumAgentCount": 10
  },
  "ContainerRegistry": {
    "Username": "mycontainer",
    "LoginServer": "mycontainer.azurecr.io",
    "Password": "..."
  },
  "ActiveDirectory": {
    "ClientId": "...",
    "TenantId": "...",
    "ClientSecret": "..."
  }
}

其中一些设置在 Azure 函数中配置为环境变量。一切都按预期工作:

现在的问题是在构建管道中配置其中一些变量,这些变量用于单元和集成测试。我尝试如下添加变量组并将其链接到管道:

但是没有设置环境变量并且测试失败了。我在这里错过了什么?

【问题讨论】:

  • 那些是秘密值吗?如果是,我认为您需要将它们明确映射到任务
  • @4c74356b41 是的,这些都是秘密。我不确定我是否理解“将它们显式映射到任务”是什么意思,请您详细说明一下吗?
  • 检查这个答案:stackoverflow.com/questions/53962581/… 第二个代码块显示了如何将秘密变量映射到给定任务的环境变量
  • 谢谢@4c74356b41 - 如果我理解正确,这些秘密变量没有设置为环境变量,我需要使用 bash 或 powershell 设置它们吗?
  • 我不知道如何使用 bash 或 powershell 访问它们,但是您可以将第二个代码块分配给任何任务并且它会工作,即使用 yaml,我不知道如何要使用那些没有 yaml 的人,应该有办法,但我至少在去年才使用 yaml,不记得常规管道,请随意支持该答案;)

标签: .net-core azure-devops environment-variables azure-functions azure-pipelines


【解决方案1】:

我也有相同的用例,我希望使用 azure 构建管道设置一些环境变量,以便测试用例可以访问该环境变量以通过测试。 使用 EXPORT,ENV 命令直接设置环境变量不适用于后续任务,因此要为后续任务设置环境变量,请遵循https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch 中提到的语法 即 带有脚本标签的task.set变量

使用构建管道设置 ENV 变量的正确方法

- script: |
    echo '##vso[task.setvariable variable=LD_LIBRARY_PATH]$(Build.SourcesDirectory)/src/Projectname/bin/Release/netcoreapp2.0/x64'
  displayName: set environment variable for subsequent steps

请注意空格,因为它是 yaml。上述脚本标签将变量 LD_LIBRARY_PATH(在 Linux 中用于定义 .so 文件的路径)设置到定义的目录。

这种设置环境变量的方式也适用于后续任务,但是如果我们像下面提到的那样设置环境变量,环境变量将被设置为特定的shell实例,并且不适用于后续任务

设置环境变量的方法错误:

- script: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(Build.SourcesDirectory)/src/CorrectionLoop.HttpApi/bin/Release/netcoreapp2.0/x64
  displayName: Set environment variable

您可以使用类似的语法来设置您的环境变量。

【讨论】:

  • 感谢分享。不幸的是,我没有使用 yaml,但希望这对其他有同样问题的人有用。
  • 好的,但我想知道您是否不使用 yaml,如何在 azure 中设置构建管道。甚至 azure build pipeline 的 GUI 也映射到 azure-pipeline.yml 文件。
  • @RuiJarimba 您可以将此标记为答案,以便对其他人有所帮助。似乎人们更喜欢它而不是其他答案。
  • 我很高兴它对其他人有帮助,但我不能将其标记为我的问题的答案 - 正如我在第一条评论中提到的那样,我正在寻找一种解决方案使用 yaml。
  • 我没有找到任何官方文档解释这个“##vso[task.setvariable variable”任务。只是好奇为什么微软不记录这个
【解决方案2】:

我在从构建任务生成 EF SQL 脚本时也遇到了这个问题。根据docs,您在“变量”选项卡中定义的变量也作为环境变量提供给进程。

请注意,变量也可以通过环境变量提供给脚本。使用这些环境变量的语法取决于脚本语言。名称为大写,.替换为_,并自动插入到进程环境中

以我为例,我只需要加载一个连接字符串,但要处理 json 文件和环境之间的键的大小写差异:

var config = new ConfigurationBuilder()
              .AddJsonFile("appsettings.json", true, true)
              .AddEnvironmentVariables()
              .Build();

var connectionString = config["connectionString"] ?? config["CONNECTIONSTRING"];

【讨论】:

  • 感谢分享,我早晚试试看。
  • 如果变量是机密,则应手动导出。
  • @ArielMoraes 你能举个例子吗?
【解决方案3】:

如果您使用的是 bash,那么他们的示例不起作用,因为他们错误地引用了 documentation 中的变量。相反,它应该是:

存储秘密

#!/bin/bash
echo "##vso[task.setvariable variable=sauce]crushed tomatoes"
echo "##vso[task.setvariable variable=secret.Sauce;issecret=true]crushed tomatoes with garlic"

检索秘密

错误:他们的例子

#!/bin/bash
echo "No problem reading $1 or $SAUCE"
echo "But I cannot read $SECRET_SAUCE"
echo "But I can read $2 (but the log is redacted so I do not spoil the secret)"

右:

#!/bin/bash
echo "No problem reading $(sauce)"
echo "But I cannot read $(secret.Sauce)"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 2023-02-04
    • 2020-06-22
    • 2021-07-20
    • 2022-10-17
    相关资源
    最近更新 更多