使用 Octopus 部署特定版本的 NuGet 包

Deploy a specific version of a NuGet package with Octopus

我们在 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. Get the NuGet package ID
  2. Use NuGet to get the latest version for this package
  3. Pipe this version with the step name into octo.exe

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

在我看来,我应该可以:

  1. Tell Octopus to deploy a specific version of a NuGet package, without providing a particular step.
  2. Tell Octopus to automatically get the latest version of a NuGet package given a step name.

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

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

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

因此,我向构建模板添加了一个新参数 "Deploy Latest NuGet Packages for Steps"。此参数包含一个以逗号分隔的 Octopus step/NuGet 包对列表 - 这些由冒号分隔,例如

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

构建 activity 将参数拆分成各自的对。它使用 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 进程,package 是具有步骤名称、NuGet 包 ID 和版本属性的 POCO。

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

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

希望这对以后的人有所帮助。