【发布时间】:2017-07-09 20:34:59
【问题描述】:
案例:我有一个项目,我使用 nuget 包在组件之间共享小型库。我使用 CI 构建生成的 nuget 包,完成后我让拉取请求进入 master 分支,此构建将生成一个新的 nuget 包,该包将用于生产。
CI 构建创建的 Nuget 包具有以下属性:
- 版本号:X.Y.Z-CI-yyyyMMdd-HHmmss
- 也包含 pdb 文件
- 包含文档 xml 文件
由 Release 构建创建的 Nuget 包具有以下属性:
- 版本号:X.Y.Z
- 包含文档 xml 文件
VSTS 构建提供了在构建名称中使用日期时间的选项,因此它始终是唯一的。问题就在这里。
因此,我的构建和 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 其中参数为:
-dateTimeIdentifier"$(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 构建及其任务环境中解决这个问题?有解决方案吗?我的方法正确吗?
【问题讨论】:
-
如果更改account.visualstudio.com/_admin/_home/settings 中的时区怎么办?它将影响构建名称中的
-HHmmss。 -
@Marina-MSFT 我认为它会弄乱我帐户中所有与日期相关的信息,包括工作项目日期和所有内容。我不喜欢一切都在 UTC 中的想法,我必须始终跟踪我是在 UTC+1 还是 UTC+2(我们仍然在一年内更改两次时区)。
-
是的,它也会影响WIT和其他东西。如果您出于某种原因需要当前时区,PowerShell 任务会有所帮助。
标签: powershell azure-pipelines azure-pipelines-build-task