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

时间:2015-02-26 16:43:37

标签: tfs octopus-deploy

我们在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.   
  3. 使用NuGet获取此软件包的最新版本
  4.   
  5. 将此版本的步骤名称导入octo.exe
  6.   

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

在我看来,我应该能够:

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

我无法看到任何允许我实现上述任一选项的论据。

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

1 个答案:

答案 0 :(得分:2)

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

所以,我在构建模板中添加了一个新参数"为步骤"部署最新的NuGet包。该参数包含一个以逗号分隔的八达通步/ 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"

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