0

我正在试用 Octopus Deploy (3.4.12) 并希望自动使用 MS Build 名称中的内部版本号作为我的 NuGet 包名称。例如,如果我最新的 MSBuild 放置名称是'MyApp Build_20161019.2'并且我的应用程序名称是MyApp,那么我希望我的包被称为MyApp.20161019.2.0.nupkg

这样做的原因是应用程序的程序集版本没有改变(历史原因,非否定),所以除非我每次手动将内部版本号作为构建参数传递给 OctoPack(这使自动打包 IMO 失去了光泽),我无法将包加载到 Octopus 库中。

我正在使用老式的 TFS XAML 构建定义顺便说一句。

我应该指出,我发现一个博客说要创建一个自定义构建模板并更改 Run MSBuild 项,以便参数是

String.Format("/p:SkipInvalidConfigurations=true {0} /p:OctoPackPackageVersion={1}", AdvancedBuildSettings.GetValue(Of String)("MSBuildArguments", String.Empty), BuildDetail.BuildNumber.Split(CChar("_"))(1))

并按照步骤操作,但无法构建并给出以下错误:

验证错误:活动“1:DynamicActivity”的私有实现具有以下验证错误:编译器错误遇到处理表达式“String.Format(”/p:SkipInvalidConfigurations=true {0}/p:OctoPackPackageVersion={1} ", AdvancedBuildSettings.GetValue(Of String)("MSBuildArguments", String.Empty), BuildDetail.BuildNumber.Split(CChar("_"))(1))"。在此上下文中无法访问“Microsoft.TeamFoundation.Build.Client.BuildDetail”,因为它是“朋友”。

4

1 回答 1

1

好的,我在与 Git 构建相关的类似问题的帮助下发现了如何做到这一点:在 GitTemplate.12.xaml 中添加 BuildNumber

警告!!AFAIK,您将需要 VS2013。你不能在VS2015中做到这一点。

为了完整起见,我列出了我必须跳过的所有火焰箍步骤。

第一次尝试:

我尝试通过提供以下 MSBuild 参数,使用 TF_BUILD 环境变量 TF_BUILD_BUILDNUMBER 简单地设置 OctoPack 包号

/p:RunOctoPack=true /p:OctoPackPackageVersion=”$(TF_BUILD_BUILDNUMBER)”</p>

但是 TF_BUILD_BUILDNUMBER 包括文本(我认为的应用程序的名称)以及数字,例如CIBuild_20130613.6导致 NuGet 错误,因为 NuGet 只能使用数字。另外我真的只想要20130613.6部分。

第二次尝试:

研究表明我必须创建一个定制的构建过程模板。作为起点,我通过编辑现有的构建过程定义(使用默认模板)并单击下载链接来下载默认模板的副本。

在此处输入图像描述

接下来,我将模板重命名为OctoPackBuild.xaml并将其添加到 TFS 中。我把它放在一个名为 BuildProcessTemplates 的文件夹中,与我想要构建的项目分开,因为这个模板可以用于任何项目。

从技术上讲,您应该创建一个工作流活动库项目并将模板添加到项目中,然后将该项目签入 TFS,但我发现这没有必要。如果您想全力以赴,请参阅msdn 文章。

xaml 文件在 TFS 中后,您需要在 Visual Studio 中对其进行编辑以获取对内部版本号的引用。以下步骤来自这个 msdn question的答案。

a) 检查 OctoPackBuild.xaml 文件并在 Visual Studio 2013 中打开它。

b) 单击 xaml 编辑器底部的 Imports 选项卡,然后添加对 Microsoft.TeamFoundation.Build.Activities.Extensions 的引用。

在此处输入图像描述

c) 在 xaml 编辑器中单击“整体构建过程”容器,然后单击底部的变量选项卡。添加一个名为 BuildDetail 的变量,并将其类型设置为 IBuildDetail

在此处输入图像描述

d) 从工具箱中,将GetEnvironmentVariable活动拖到Update Build Number活动之后,并将类型设置为IBuildDetail。编辑活动属性;将 Name 属性设置为WellKnownEnvironmentVariables.BuildDetail,将 Display Name 设置为“Get Build Details”(或任何浮动的内容),并将 Result 设置为BuildDetail <- 这是您创建的变量的名称。

在此处输入图像描述

e) 现在您可以访问 BuildDetail 对象,您可以将 BuildNumber 属性传递给 MSBuild。通过编辑“运行 MSBuild”活动的 CommandLineArguments 属性并将值设置为

String.Format("/p:SkipInvalidConfigurations=true {0} /p:OctoPackPackageVersion={1}", AdvancedBuildSettings.GetValue(Of String)("MSBuildArguments", String.Empty), BuildDetail.BuildNumber.Split(CChar("_"))(1))

您应该注意,BuildDetail现在指的是您的变量,而不是“Microsoft.TeamFoundation.Build.Client.BuildDetail”。

此外,重要的是要了解 BuildNumber 的格式为 [text]_[numbers] 的假设。因此,Split 函数正在删除文本部分,只将数字传递给 OctoPack。如果您没有拆分 BuildNumber,则会导致我在第一次尝试中提到的 NuGet 问题。这也意味着如果您在构建名称中添加一个额外的下划线,那么您将不得不选择元素#2,而不是#1。

f) 将您的自定义构建模板 (OctoPackBuild.xaml) 检查回 TFS。

g) 接下来,您需要编辑您的构建过程以使用自定义模板而不是默认模板。

您不能在本练习中使用 VS2015 的原因是 UI 不允许您从 TFS 中选择 xaml 文件。看起来 MS 的预算已经用完了,UI 的那部分也被破坏了。

VS2010 也不起作用,因为它不能与 TFS 2013 模板一起使用。

我让它工作的唯一方法是使用 VS2013 并从那里编辑构建过程。VS2013 将允许您指定一个新模板并在 TFS 中导航以找到您的 OctoPackBuild.xaml 文件。

h) 然后您在构建过程中所要做的就是将 /p:RunOctoPack=true 添加到 MSBuild 参数中,然后您就完成了。

在此处输入图像描述

希望这对某人有帮助!

于 2016-10-19T03:44:49.113 回答