【问题标题】:How to set datetime to value of variable using Powershell in VSTS builds?如何在 VSTS 构建中使用 Powershell 将日期时间设置为变量的值?
【发布时间】: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 构建提供了在构建名称中使用日期时间的选项,因此它始终是唯一的。问题就在这里。

  • VSTS 构建使用本地时间(我在 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 其中参数为:

-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


【解决方案1】:

您可以如下更改您的第一个 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) 变量以在后续任务中使用

【讨论】:

    【解决方案2】:

    如果您想在使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-18
      • 2017-01-28
      • 2013-01-07
      相关资源
      最近更新 更多