如何在 VSTS 构建中使用 Powershell 将日期时间设置为变量值?
How to set datetime to value of variable using Powershell in VSTS builds?
案例:我有一个项目,我在其中使用 nuget 包在组件之间共享小型库。我使用由 CI 构建生成的 nuget 包,完成后我让拉取请求进入 master 分支,这个构建将生成一个新的 nuget 包,它将在生产中使用。
CI 构建创建的 Nuget 包具有以下属性:
- 版本号:X.Y.Z-CI-yyyyMMdd-HHmmss
- 也包含 pdb 文件
- 包含文档 xml 文件
发布版本创建的 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 其中参数为:
-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)变量在后续任务中使用
案例:我有一个项目,我在其中使用 nuget 包在组件之间共享小型库。我使用由 CI 构建生成的 nuget 包,完成后我让拉取请求进入 master 分支,这个构建将生成一个新的 nuget 包,它将在生产中使用。
CI 构建创建的 Nuget 包具有以下属性:
- 版本号:X.Y.Z-CI-yyyyMMdd-HHmmss
- 也包含 pdb 文件
- 包含文档 xml 文件
发布版本创建的 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 其中参数为:
-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)变量在后续任务中使用