【问题标题】:Deploy a specific version of a NuGet package with Octopus使用 Octopus 部署特定版本的 NuGet 包
【发布时间】:2015-04-29 03:44:35
【问题描述】:

我们有一个基于 TFS 的自动构建,它在 Octopus 中创建一个版本,该版本自动部署到测试环境中。

作为此构建的一部分,我们提供了一个与我们的发布路线图一致的 --defaultpackageversion 值,例如4.1.1.1 - 此版本已在构建模板中分配,所有项目都以该版本正确进入 Octopus。

不过,作为此版本的一部分,我们的 NuGet 远程提要中有一个包不反映发布路线图版本,例如1.1.0.0.

因此,对于每个包,Octopus 部署4.1.1.1,但尝试为这个特定包解析4.1.1.1,其中仅存在1.1.0.0

octo.exe 有一个参数,允许我们为给定步骤提供版本,--package=StepName

要提供此步骤名称的版本,我需要:

  1. 获取 NuGet 包 ID
  2. 使用 NuGet 获取此包的最新版本
  3. 将此版本与步骤名称通过管道传递到octo.exe

这意味着必须指定(作为 TFS 构建模板的一部分)NuGet 包 ID 部署所述包的 Octopus 步骤。因此,如果更改步骤以部署不同的 NuGet 包,我必须在提供此参数的每个构建模板中反映该更改。

在我看来,我应该能够:

  1. 告诉 Octopus 部署特定版本的 NuGet 包,无需提供特定步骤。
  2. 告诉 Octopus 在给定步骤名称的情况下自动获取最新版本的 NuGet 包。

我看不到任何可以让我实现上述任一选项的论点。

有谁知道如何实现上述任一选项(或类似选项)?否则我可能不得不在构建模板中指定步骤名称和 NuGet 包 ID(不理想)。

【问题讨论】:

    标签: tfs octopus-deploy


    【解决方案1】:

    很抱歉回答了我自己的问题,但想为我们最终采用的解决方案添加更多细节。

    因此,我在构建模板“为步骤部署最新 NuGet 包”中添加了一个新参数。此参数包含以逗号分隔的 Octopus 步骤/NuGet 包对列表 - 这些由冒号分隔,例如

    "Deploy Web Site:Company.Common,Deploy Database:Company.Project.Database".
    

    构建活动将参数分成各自的对。它使用NuGet list 启动一个进程来识别每个包的最新版本。然后我们使用Regex 来确定最新版本:

    ....
    var output = p.StandardOutput.ReadToEnd();
    var pattern = string.Format(@"^{0}\s(?<version>\d+\.\d+\.\d+\.\d+)\r?$", package.NuGetPackageId);
    
    package.Version = Regex.Matches(output, pattern, RegexOptions.Multiline).
        OfType<Match>().
        Select(r => new Version(r.Groups["version"].Value)).
        Max();
    

    其中 p 是 NuGet 进程,包是具有步骤名称、NuGet 包 ID 和版本属性的 POCO。

    然后使用--package 参数将这个特定的步骤名称、版本对提供给章鱼,例如

    --package "Deploy Web Site:4.1.1.1,Deploy Database:1.1.0.0"
    

    希望这对将来的某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      • 1970-01-01
      • 2014-01-23
      • 1970-01-01
      • 2015-01-14
      相关资源
      最近更新 更多