2017-03-27 7 views
1

(古い)ビルド定義は、TFS 2015(およびカスタムアクションのヒープを持つ基底のTFSBuild.proj)でUpgradeTemplate.xamlを使用しています。そのため、ビルドを適切に近代化する作業には時間がかかるでしょう。ツール12.0でのビルド中のArgumentOutOfRangeException

私は、開発者を幸せにするために、ビルド定義を完全に書き直すことなく、C#6/VB14サポートを追加するためにUpgradeTemplateをハックしたいと思っています。

UpgradeTemplate.xamlを編集してTfsBuildにToolPathプロパティを追加しようとしました。しかし、これで私はほぼすべてのプロジェクトで次のようなエラーが発生しました。

ArgumentOutOfRangeException:インデックスと長さは、文字列内の場所を参照する必要があります。パラメータ名:

:vbproj上 Messageタスクによってプリントアウトセットとしてこれらの変数の

<MSBuild.ExtensionPack.VisualStudio.TfsVersion TaskAction="GetVersion" 
    BuildName="$(BuildDefinition)" TfsBuildNumber="$(BuildNumber)" 
    VersionFormat="DateTime" DateFormat="MMdd" Major="$(MajorVersion)" 
    Minor="$(MinorVersion)"> 

値:長さ調査に

、これらのプロジェクトのコードの行すべてがこのようになり

BuildDefinition:MyBuild-テスト
BuildNumberを:57902
のMajorVersion:43
MinorVersion:2

ビルドサーバーには、インストールされているMSBuild ExtensionPackにバージョン3.5.10が含まれています。

この問題を解決するにはどうすればよいですか?私はこのビルド定義を使ってこれをテストしています。このセットアップを行っている間に開発者が作業を続けることができるので、ExtensionPackを既存のビルドを破る可能性がある場合は(可能であれば)最新のリリースに置き換えたくありません。 。

アップグレードテンプレート特に

<Activity mc:Ignorable="sad" x:Class="TfsBuild.Process" xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mtbc="clr-namespace:Microsoft.TeamFoundation.Build.Client;assembly=Microsoft.TeamFoundation.Build.Client" xmlns:mtbw="clr-namespace:Microsoft.TeamFoundation.Build.Workflow;assembly=Microsoft.TeamFoundation.Build.Workflow" xmlns:mtbwa="clr-namespace:Microsoft.TeamFoundation.Build.Workflow.Activities;assembly=Microsoft.TeamFoundation.Build.Workflow" xmlns:mtbwt="clr-namespace:Microsoft.TeamFoundation.Build.Workflow.Tracking;assembly=Microsoft.TeamFoundation.Build.Workflow" xmlns:mtvc="clr-namespace:Microsoft.TeamFoundation.VersionControl.Client;assembly=Microsoft.TeamFoundation.VersionControl.Client" xmlns:mva="clr-namespace:Microsoft.VisualBasic.Activities;assembly=System.Activities" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:sad="http://schemas.microsoft.com/netfx/2009/xaml/activities/presentation" xmlns:sad1="clr-namespace:System.Activities.Debugger;assembly=System.Activities" xmlns:scg="clr-namespace:System.Collections.Generic;assembly=mscorlib" xmlns:this="clr-namespace:TfsBuild;" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <x:Members> 
    <x:Property Name="ConfigurationFolderPath" Type="InArgument(x:String)" /> 
    <x:Property Name="AgentSettings" Type="InArgument(mtbwa:AgentSettings)" /> 
    <x:Property Name="MSBuildArguments" Type="InArgument(x:String)" /> 
    <x:Property Name="MSBuildPlatform" Type="InArgument(mtbwa:ToolPlatform)" /> 
    <x:Property Name="DoNotDownloadBuildType" Type="InArgument(x:Boolean)" /> 
    <x:Property Name="LogFilePerProject" Type="InArgument(x:Boolean)" /> 
    <x:Property Name="SourcesSubdirectory" Type="InArgument(x:String)" /> 
    <x:Property Name="BinariesSubdirectory" Type="InArgument(x:String)" /> 
    <x:Property Name="TestResultsSubdirectory" Type="InArgument(x:String)" /> 
    <x:Property Name="RecursionType" Type="InArgument(mtvc:RecursionType)" /> 
    <x:Property Name="Verbosity" Type="InArgument(mtbw:BuildVerbosity)" /> 
    <x:Property Name="Metadata" Type="mtbw:ProcessParameterMetadataCollection" /> 
    <x:Property Name="SupportedReasons" Type="mtbc:BuildReason" /> 
    </x:Members> 
    <this:Process.ConfigurationFolderPath> 
    <InArgument x:TypeArguments="x:String" /> 
    </this:Process.ConfigurationFolderPath> 
    <this:Process.AgentSettings>[New Microsoft.TeamFoundation.Build.Workflow.Activities.AgentSettings() With {.MaxWaitTime = New System.TimeSpan(4, 0, 0), .MaxExecutionTime = New System.TimeSpan(0, 0, 0), .TagComparison = Microsoft.TeamFoundation.Build.Workflow.Activities.TagComparison.MatchExactly }]</this:Process.AgentSettings> 
    <this:Process.MSBuildArguments> 
    <InArgument x:TypeArguments="x:String" /> 
    </this:Process.MSBuildArguments> 
    <this:Process.MSBuildPlatform>[Microsoft.TeamFoundation.Build.Workflow.Activities.ToolPlatform.Auto]</this:Process.MSBuildPlatform> 
    <this:Process.DoNotDownloadBuildType>[False]</this:Process.DoNotDownloadBuildType> 
    <this:Process.LogFilePerProject>[False]</this:Process.LogFilePerProject> 
    <this:Process.SourcesSubdirectory> 
    <InArgument x:TypeArguments="x:String" /> 
    </this:Process.SourcesSubdirectory> 
    <this:Process.BinariesSubdirectory> 
    <InArgument x:TypeArguments="x:String" /> 
    </this:Process.BinariesSubdirectory> 
    <this:Process.TestResultsSubdirectory> 
    <InArgument x:TypeArguments="x:String" /> 
    </this:Process.TestResultsSubdirectory> 
    <this:Process.RecursionType>[Microsoft.TeamFoundation.VersionControl.Client.RecursionType.OneLevel]</this:Process.RecursionType> 
    <this:Process.Verbosity>[Microsoft.TeamFoundation.Build.Workflow.BuildVerbosity.Normal]</this:Process.Verbosity> 
    <this:Process.Metadata> 
    <mtbw:ProcessParameterMetadataCollection /> 
    </this:Process.Metadata> 
    <this:Process.SupportedReasons>All</this:Process.SupportedReasons> 
    <mva:VisualBasic.Settings>Assembly references and imported namespaces serialized as XML namespaces</mva:VisualBasic.Settings> 
    <Sequence mtbwt:BuildTrackingParticipant.Importance="None"> 
    <Sequence.Variables> 
     <Variable x:TypeArguments="mtbc:IBuildDetail" Name="BuildDetail" /> 
    </Sequence.Variables> 
    <mtbwa:GetBuildDetail DisplayName="Get the Build" Result="[BuildDetail]" /> 
    <mtbwa:InvokeForReason DisplayName="Update Build Number for Triggered Builds" Reason="Triggered"> 
     <mtbwa:UpdateBuildNumber BuildNumberFormat="[&quot;$(BuildDefinitionName)_$(Date:yyyyMMdd)$(Rev:.r)&quot;]" DisplayName="Update Build Number" /> 
    </mtbwa:InvokeForReason> 
    <mtbwa:AgentScope DisplayName="Run On Agent" MaxExecutionTime="[AgentSettings.MaxExecutionTime]" MaxWaitTime="[AgentSettings.MaxWaitTime]" ReservationSpec="[AgentSettings.GetAgentReservationSpec()]"> 
     <mtbwa:AgentScope.Variables> 
     <Variable x:TypeArguments="x:String" Name="buildDirectory" /> 
     </mtbwa:AgentScope.Variables> 
     <mtbwa:GetBuildDirectory DisplayName="Get the Build Directory" Result="[buildDirectory]" /> 
     <If Condition="[Not String.IsNullOrEmpty(ConfigurationFolderPath)]" DisplayName="If Not String.IsNullOrEmpty(ConfigurationFolderPath)"> 
     <If.Then> 
      <mtbwa:TfsBuild BinariesSubdirectory="[BinariesSubdirectory]" BuildDirectory="[buildDirectory]" CommandLineArguments="[MSBuildArguments]" ConfigurationFolderPath="[ConfigurationFolderPath]" DisplayName="Run TfsBuild for Configuration Folder" DoNotDownloadBuildType="[DoNotDownloadBuildType]" LogFilePerProject="[LogFilePerProject]" RecursionType="[RecursionType]" SourcesSubdirectory="[SourcesSubdirectory]" TestResultsSubdirectory="[TestResultsSubdirectory]" ToolPath="C:\Program Files (x86)\MSBuild\12.0\Bin\" ToolPlatform="[MSBuildPlatform]" Verbosity="[Verbosity]" /> 
     </If.Then> 
     </If> 
     <If Condition="[BuildDetail.CompilationStatus = Microsoft.TeamFoundation.Build.Client.BuildPhaseStatus.Unknown]" DisplayName="If CompilationStatus = Unknown"> 
     <If.Then> 
      <mtbwa:SetBuildProperties CompilationStatus="[Microsoft.TeamFoundation.Build.Client.BuildPhaseStatus.Succeeded]" DisplayName="Set CompilationStatus to Succeeded" PropertiesToSet="CompilationStatus" /> 
     </If.Then> 
     </If> 
     <If Condition="[BuildDetail.TestStatus = Microsoft.TeamFoundation.Build.Client.BuildPhaseStatus.Unknown]" DisplayName="If TestStatus = Unknown"> 
     <If.Then> 
      <mtbwa:SetBuildProperties DisplayName="Set TestStatus to Succeeded" PropertiesToSet="TestStatus" TestStatus="[Microsoft.TeamFoundation.Build.Client.BuildPhaseStatus.Succeeded]" /> 
     </If.Then> 
     </If> 
    </mtbwa:AgentScope> 
    <mtbwa:InvokeForReason Reason="CheckInShelveset"> 
     <mtbwa:CheckInGatedChanges DisplayName="Check In Gated Changes" /> 
    </mtbwa:InvokeForReason> 
    </Sequence> 
</Activity> 

、私は58

TFSBuild.proj

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="DesktopBuild" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> 

    <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TeamBuild\Microsoft.TeamFoundation.Build.targets" /> 
    <Import Project="$(MSBuildExtensionsPath)\Microsoft\SDC\Microsoft.Sdc.Common.tasks" /> 
    <Import Project="$(MSBuildExtensionsPath)\ExtensionPack\MSBuild.ExtensionPack.tasks"/> 

    <ProjectExtensions> 
    <!-- Team Foundation Build Version - DO NOT CHANGE --> 
    <ProjectFileVersion>2</ProjectFileVersion> 
    </ProjectExtensions> 

    <PropertyGroup> 
    <RunCodeAnalysis>Never</RunCodeAnalysis> 
    <UpdateAssociatedWorkItems>false</UpdateAssociatedWorkItems> 
    <AdditionalVCOverrides></AdditionalVCOverrides> 
    <CustomPropertiesForClean></CustomPropertiesForClean> 
    <CustomPropertiesForBuild></CustomPropertiesForBuild> 
    <SkipGetChangesetsAndUpdateWorkItems>False</SkipGetChangesetsAndUpdateWorkItems> 
    <SkipWorkItemCreation>true</SkipWorkItemCreation> 
    <BuildConfigurationsInParallel>true</BuildConfigurationsInParallel> 
    <SkipDropBuild>false</SkipDropBuild> 
    </PropertyGroup> 

    <ItemGroup> 
     <SolutionToBuild Include="$(BuildProjectFolderPath)/SolutionsToBuild/Common.sln"> 
     <Targets></Targets> 
     <Properties></Properties> 
    </SolutionToBuild> 
    </ItemGroup> 
    <ItemGroup> 
    <ConfigurationToBuild Include="Release|Any CPU"> 
     <FlavorToBuild>Release</FlavorToBuild> 
     <PlatformToBuild>Any CPU</PlatformToBuild> 
    </ConfigurationToBuild> 
    </ItemGroup> 


    <PropertyGroup> 
    <SkipClean>false</SkipClean> 
    <SkipInitializeWorkspace>true</SkipInitializeWorkspace> 
    <ForceGet>true</ForceGet> 
    <IncrementalBuild>false</IncrementalBuild> 
    </PropertyGroup> 
</Project> 

更新

行目に ToolPath="C:\Program Files (x86)\MSBuild\12.0\Bin\"を追加しました

個人的なビルド(Latest + Shelveset)の実行と関係していると思います。通常のビルドを実行すると、の変数がBuildNumberになります。これは正常に動作しているようです。

+0

テスト用にビルドテンプレートを共有してください。 "length"という名前のパラメータがありますか? –

+0

@ Tingting0929-MSFTそれは難しいかもしれません。 UpgradeTemplateはTFSBuild.projを呼び出します.TFSBuild.projは内部使用目的に大きくカスタマイズされています。会社のためにサニタイズするとかなりの労力がかかります。私は同じエラーで単純化されたバージョンを生成できるかどうかを見てみましょう。変数の値を更新しました。長さは私たちが使用する変数ではありません。 –

+0

@ Tingting0929-MSFT xaml/projファイルの内容を追加しました。この単純化されたバージョンでも、まだ破損しているように見えます。 –

答えて

0

この問題は、プライベートとパブリックのビルドの違いによるものです。パブリックビルドでは、ビルドは直ちにBuildName_DateFormat.BuildNumberと番号が付けられます。ただし、非公開ビルドは数字だけです(上記の57902など)。拡張子で

コードは以下のん:

string buildstring = this.TfsBuildNumber.Replace(string.Concat(this.BuildName, "_"), 
           string.Empty); 
char[] chrArray = new char[] { '.' }; 
string[] buildParts = buildstring.Split(chrArray, StringSplitOptions.RemoveEmptyEntries); 
DateTime t = new DateTime(Convert.ToInt32(buildParts[0].Substring(0, 4), 
              CultureInfo.CurrentCulture), 
          Convert.ToInt32(buildParts[0].Substring(4, 2), 
              CultureInfo.CurrentCulture), 
          Convert.ToInt32(buildParts[0].Substring(6, 2), 
              CultureInfo.InvariantCulture)); 

は、あなたがそれは日付コンポーネント(20170328)にまで除去されていますと仮定すると、ビルド名にそのsubstringingを見ることができています。私的ビルドはこれほど長くはないので失敗します。

このビルドはパブリックビルドとして実行するとうまく動作します。基本的に、この定義のプライベートビルドはアップグレードが行われるまで利用できません。

+0

共有してくれてありがとうございました。回答を回答としてマークすると、コミュニティの他の人にも役立ちます。 –

関連する問題