我正在试用Octopus Deploy(3.4.12)并希望自动使用MS Build名称中的内部版本号作为我的NuGet包名称。例如,如果我的最新MSBuild代码名称为 'MyApp Build_20161019.2' ,而我的应用名称为 MyApp ,然后我希望我的包被称为 MyApp.20161019.2.0.nupkg
这样做的原因是应用程序的程序集版本没有变化(历史原因,非负面),所以除非我每次手动将内部版本号作为构建参数传递给OctoPack(这需要自动打包闪亮IMO),我无法将包加载到Octopus库中。
我正在使用老式的TFS XAML构建定义btw。
我应该指出,我找到了一个博客,说创建自定义构建模板并更改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” 在这种情况下,因为它是'朋友'。
答案 0 :(得分:1)
好的,我在与Git版本相关的类似问题的帮助下找到了如何做到这一点:Add BuildNumber in GitTemplate.12.xaml
警告!! AFAIK您将需要VS2013。你不能在VS2015中做到这一点。
为了完整起见,我列出了跳跃所经历的所有燃烧箍步骤。
第一次尝试:
我尝试使用TF_BUILD环境变量TF_BUILD_BUILDNUMBER通过提供以下MSBuild参数来设置OctoPack包编号
/ P:RunOctoPack =真 / P:OctoPackPackageVersion =” $(TF_BUILD_BUILDNUMBER)”
但TF_BUILD_BUILDNUMBER包含文字(我认为的应用名称)以及数字,例如 CIBuild_20130613.6 导致NuGet错误,因为NuGet只能处理数字。另外,我真的只想要 20130613.6 部分。
第二次尝试:
研究表明我必须创建一个自定义的构建过程模板。作为起点,我通过编辑现有的构建过程定义(使用默认模板)并单击下载链接来下载默认模板的副本。
接下来,我将模板重命名为 OctoPackBuild.xaml ,并将其添加到TFS中。我把它放在一个名为BuildProcessTemplates的文件夹中,与我想要构建的项目分开,因为这个模板可以用于任何项目。
从技术上讲,您应该创建一个Workflow Activity Library项目并将模板添加到项目中,然后将项目检入TFS,但我发现这是不必要的。如果你想要全身心投入,请参见msdn article。
在xaml文件位于TFS之后,您需要在Visual Studio中对其进行编辑以获取对内部版本号的引用。以下步骤来自this msdn question的答案。
a)查看OctoPackBuild.xaml文件并在Visual Studio 2013中打开它。
b)单击xaml编辑器底部的Imports选项卡,然后添加对Microsoft.TeamFoundation.Build.Activities.Extensions的引用。
c)点击' 整体构建流程 '在xaml编辑器中的容器,然后单击底部的“变量”选项卡。添加一个名为BuildDetail的变量,并将其类型设置为IBuildDetail
d)从工具箱中,将 GetEnvironmentVariable 活动拖到更新内部版本号活动之后,并将类型设置为 IBuildDetail 。编辑活动属性;将Name属性设置为 WellKnownEnvironmentVariables.BuildDetail ,将显示名称设置为 '获取构建详细信息' (或任何浮动你的船),结果 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并从那里编辑Build Process。 VS2013将允许您指定新模板并在TFS中导航以查找您的OctoPackBuild.xaml文件。
h)然后你在构建过程中所要做的就是在MSBuild参数中添加/ p:RunOctoPack = true并且你已经完成了。
希望这有助于某人!