如何在 VSTS 构建中使用 Powershell 将日期时间设置为变量值?

How to set datetime to value of variable using Powershell in VSTS builds?

案例:我有一个项目,我在其中使用 nuget 包在组件之间共享小型库。我使用由 CI 构建生成的 nuget 包,完成后我让拉取请求进入 master 分支,这个构建将生成一个新的 nuget 包,它将在生产中使用。

CI 构建创建的 Nuget 包具有以下属性:

发布版本创建的 Nuget 包具有以下属性:

VSTS 构建提供了在构建名称中使用日期时间的选项,因此它将始终是唯一的。问题就出在这里。

因此,我的构建和 nuget 包之间的一致性令人窒息:

NugetCommand和VSTS合作的另一个问题是,他们取的时间戳是不同时刻的,所以两个时间戳除了两个小时之外还有区别。这没什么大不了的,因为我不会每秒都在同一个构建分支上启动构建,但仍然...

NugetCommand 能够从 BuildNumber 中读取它将创建的包的版本号,这与 VSTS 将提供新工件相同。

所以,我想解决这个问题,直到他们使它更加一致。我已经向他们报告了一些请求。到目前为止我发现的是使用 PowerShell 填充带有时间戳的变量,它将被 VSTS 构建和 NugetCommand 任务使用。

我按照此处的示例进行操作,但它只处理字符串而不处理日期。

我编写了以下脚本,但它没有提供我想要的结果。

Powershell 任务 1:

Write-Host "Setting up the date time for build variable and nuget package identifiers"
Write-Host "##vso[task.setvariable variable=dateTimeIdentifier]Get-Date -format yyyyMMdd-Hmmss"
Write-Host "Get-Date -format yyyyMMdd-Hmmss"
Get-Date -format yyyyMMdd-Hmmss

Powershell 任务 2 其中参数为:

-dateTimeIdentitfier"$(dateTimeIdentifier)"

Write-Host "Checking: $(dateTimeIdentifier)"

结果是您可以看到 Powershell 命令是变量的值而不是格式化的日期时间。

Setting up the date time for build variable and nuget package identifiers
Get-Date -format yyyyMMdd-Hmmss
20170709-202457
Checking:  Get-Date -format yyyyMMdd-Hmmss

我知道如何在 bash 中解决此类问题,但我没有 bash 可用的构建代理。

Bash like 解决方案希望是这样的,这是不正确的,但是``之间的命令会先执行,结果会通过剩余的命令作为参数传递。

Write-Host "##vso[task.setvariable variable=dateTimeIdentifier]`Get-Date -format yyyyMMdd-Hmmss`"

我的问题是,如何在 VSTS 构建及其任务环境中解决这个问题?有解决办法吗?我的做法正确吗?

如果您想在使用 write-host 写入输出时显示日期时间,我强烈建议您改用 write-output,您可以执行以下操作:

$DateTime = Get-Date -format yyyyMMdd-Hmmss
Write-Host "Checking: $DateTime"

这将输出:

Checking: 20170710-64624

编辑:现在关于你的问题,抱歉我第一次错过了它,返回的 dateTimeIdentifier 看起来像是一个字符串 "Get-Date -format yyyyMMdd-Hmmss"

所以如果你想执行那个代码,你需要先做一个脚本块,然后执行那个脚本块。

$ScriptBlock = [ScriptBlock]::Create("Get-Date -format yyyyMMdd-Hmmss")
& $ScriptBlock

您可以更改您的第一个 PowerShell 任务(Powershell 任务 1),如下所示:

Write-Host "Setting up the date time for build variable and nuget package identifiers"
$date=$(Get-Date -format yyyyMMdd-Hmmss)
Write-Host "##vso[task.setvariable variable=dateTimeIdentifier]$date"
Write-Host "Get-Date -format yyyyMMdd-Hmmss"
Get-Date -format yyyyMMdd-Hmmss

在power shell脚本中添加一个变量,然后设置一个VSTS(Azure DevOps)变量在后续任务中使用