案例:我有一个项目,我使用nuget包在组件之间共享小型库。我使用CI构建生成的nuget包,一旦完成,我就让pull请求进入master分支,这个构建将产生一个新的nuget包,将用于生产。
CI build创建的Nuget包具有以下属性:
发布版本创建的Nuget包具有以下属性:
VSTS构建提供了在构建名称中使用datetime的选项,因此它始终是唯一的。问题出在这里。
因此,我的构建和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之类的解决方案就像这样,这是不正确的,但``之间的命令将首先执行,结果将作为参数传递给剩余的命令。
Write-Host "##vso[task.setvariable variable=dateTimeIdentifier]`Get-Date -format yyyyMMdd-Hmmss`"
我的问题是,如何在VSTS构建及其任务环境中解决这个问题?这有解决方案吗?我的方法是否正确?
答案 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