从预定义变量列表中选择构建管道

时间:2020-01-14 19:40:51

标签: azure-devops azure-pipelines

我正在创建一个Azure Pipeline,它将具有一些复杂的变量,但是所有变量值都是四个可能值之一。在运行管道时,是否可以从列表中选择变量值,还是我需要创建一个扩展来完成此操作?

2 个答案:

答案 0 :(得分:1)

您可以先使用powershell脚本来拆分值。

例如,有一个变量名monsters.create() for monster in World.monsters: Game.Log(monster.name) ,其值为varonetwothree。在管道中,我只希望使用值four

第1步:

写一个one文件,其中包含以下脚本以拆分这些值。

ps1

注意:我根据Param( [string]$a ) [array]$b = $a.split('.') [string]$ma = $b[0] 拆分了变量。因此,我将值存储为.

enter image description here

第二步:

由于应首先分割值,因此请在顶部添加one.two.three.four任务,并按以下格式进行配置:

enter image description here

结果:

enter image description here

第3步:

根据您想要的方案成功将其拆分后,该值也应可用于下一个任务。

只需在Powershell文件中添加另一个脚本,即可设置变量,该变量将我们想要的值存储为输出变量

enter image description here

然后在split.ps1任务中配置引用名称

enter image description here


现在,所有接下来的任务都可以使用Powershell来调用该值。

答案 1 :(得分:1)

这似乎不可能,所以我使用了一种解决方法。

我在以config-team1.jsonconfig-team2.json等样式命名的项目旁边添加了配置文件。我创建了一个名为Config.Name的变量,可以在运行管道时对其进行编辑并将其默认到team1。然后,我为管道创建了一个PowerShell任务,该任务检查名称正确的配置文件并将其复制到config.json。例如,如果变量Config.Name设置为team84,则脚本将查找config-team84.json并将其复制到config.json

还使用了另外两个变量Config.SourceDirectoryConfig.DestinationDirectory。这些只是指定在何处查找配置文件以及将其复制到何处。

$SourceFile = "config-$env:CONFIG_NAME.json"
$SourcePath = "$env:CONFIG_SOURCEDIRECTORY\$SourceFile"
$DestinationPath = "$env:CONFIG_DESTINATIONDIRECTORY\config.json"

Write-Host "Verifying that config file $SourceFile exists"

$FileExists = Test-Path -Path $SourcePath -PathType leaf
if (!$FileExists) {
  throw "Config file does not exist at $SourcePath, cannot continue."
}

Write-Host "Copying config file"
Copy-Item "$SourcePath" -Destination "$DestinationPath"

这是特定于流水线的步骤的结束,其余只是我在实际项目中如何使用它的其他信息。


正在构建的项目是用.NET Core编写的,因此我使用了Microsoft.Extensions.Configuration.Json。配置文件示例为:

{
  "someKey": "someValue",
  "anotherKey": 4,
  "yetAnotherKey": true
}

您可以像这样获取配置数据:

var configuration = new ConfigurationBuilder()
    .AddJsonFile("config.json", false) // false means the file is not optional
    .Build();

在上面,configuration的类型为IConfigurationRoot

您可以直接使用此配置对象:

var someVal = configuration["someKey"];

或者,如果您将密钥放在父密钥中,则可以为配置创建一个强类型的类:

{
  "myConfig": {
    "someKey": "someValue",
    "anotherKey": 4,
    "yetAnotherKey": true
  }
}

C#类将如下所示:

public class TestConfiguration
{
    public string SomeKey { get; set; }
    public int AnotherKey { get; set; }
    public bool YetAnotherKey { get; set; }
}

实例化并使用这样的类:

var testConfig = configuration.GetSection("myConfig").Get<TestConfiguration>();
var someVal = testConfig.SomeKey;