如何在VSTS版本中使用Powershell将datetime设置为变量值?

时间:2017-07-09 20:34:59

标签: powershell azure-pipelines azure-pipelines-build-task

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

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

  • 版本号: X.Y.Z-CI-yyyyMMdd-HHmmss
  • 也包含pdb文件
  • 包含文档xml文件

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

  • 版本号: X.Y.Z
  • 包含文档xml文件

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

  • VSTS构建使用localtime(我在GMT + 2中)
  • VSTS的NugetCommand任务使用only UTCbug ticket关于它

因此,我的构建和nuget包之间存在一种扼杀的一致性:

  • Nuget包: 1.0.0-CI-20170709-201010
  • 构建: BuildName-BranchName-20170709-181010

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之类的解决方案就像这样,这是不正确的,但``之间的命令将首先执行,结果将作为参数传递给剩余的命令。

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

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

2 个答案:

答案 0 :(得分:2)

您可以更改第一个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变量就可以了。

答案 1 :(得分:0)

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

Checking: 20170710-64624

这将输出:

$ScriptBlock = [ScriptBlock]::Create("Get-Date -format yyyyMMdd-Hmmss")
& $ScriptBlock
编辑:现在为你的问题,抱歉我第一次错过了,返回的dateTimeIdentifier看起来像是一个字符串" Get-Date -format yyyyMMdd-Hmmss"

因此,如果要执行该代码,首先需要创建脚本块,然后执行该脚本块。

width: 30vw