RepositoryBuild.targets 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <Project>
  2. <PropertyGroup>
  3. <!-- Experimental flag to run assemblies AND repos tests in parallel...if you dare. -->
  4. <TestReposInParallel>false</TestReposInParallel>
  5. <_NoBuildRepos>$(NoBuild)</_NoBuildRepos>
  6. <_BuildScriptToExecute Condition="'$(OS)'!='Windows_NT'">build.sh</_BuildScriptToExecute>
  7. <_BuildScriptToExecute Condition="'$(OS)'=='Windows_NT'">build.cmd</_BuildScriptToExecute>
  8. </PropertyGroup>
  9. <Target Name="GetRepoBatches" DependsOnTargets="GeneratePropsFiles;ComputeGraph">
  10. <ItemGroup>
  11. <RepositoryBuildOrder Condition="'%(RootPath)' == ''">
  12. <RootPath>$(SubmoduleRoot)%(Identity)\</RootPath>
  13. </RepositoryBuildOrder>
  14. <BatchedRepository Include="$(MSBuildProjectFullPath)">
  15. <BuildGroup>%(RepositoryBuildOrder.Order)</BuildGroup>
  16. <Repository>%(RepositoryBuildOrder.Identity)</Repository>
  17. <AdditionalProperties>
  18. RepositoryToBuild=%(RepositoryBuildOrder.Identity);
  19. BuildRepositoryRoot=$([MSBuild]::NormalizeDirectory(%(RepositoryBuildOrder.RootPath)))
  20. </AdditionalProperties>
  21. </BatchedRepository>
  22. </ItemGroup>
  23. </Target>
  24. <Target Name="_BuildRepositories" DependsOnTargets="GetRepoBatches" Condition=" @(RepositoryBuildOrder->Count()) != 0 ">
  25. <MSBuild
  26. Projects="@(BatchedRepository)"
  27. BuildInParallel="true"
  28. StopOnFirstFailure="true"
  29. Targets="_BuildRepository"
  30. Properties="BuildGroup=%(BatchedRepository.BuildGroup);VersionSuffix=$(VersionSuffix);BuildNumberSuffix=$(BuildNumberSuffix);IsFinalBuild=$(IsFinalBuild);Configuration=$(Configuration)" />
  31. <PropertyGroup>
  32. <_ReposWereBuilt>true</_ReposWereBuilt>
  33. <_NoBuildRepos>true</_NoBuildRepos>
  34. </PropertyGroup>
  35. </Target>
  36. <Target Name="_TestRepositories" DependsOnTargets="GetRepoBatches" Condition=" @(RepositoryBuildOrder->Count()) != 0 ">
  37. <!--
  38. Use the task to sort instead of batching (i.e. using %(BatchedRepository.BuildGroup))
  39. When batching, StopOnFirstFailure doesn't help because the MSBuild task would be invoked multiple times
  40. instead of invoking once with many projects.
  41. -->
  42. <RepoTasks.OrderBy Items="@(BatchedRepository)" Key="BuildGroup">
  43. <Output TaskParameter="Items" ItemName="_BatchedTestRepo" />
  44. </RepoTasks.OrderBy>
  45. <MSBuild
  46. Projects="@(_BatchedTestRepo)"
  47. BuildInParallel="$(TestProjectsInParallel)"
  48. StopOnFirstFailure="false"
  49. Targets="_TestRepository"
  50. Properties="VersionSuffix=$(VersionSuffix);BuildNumberSuffix=$(BuildNumberSuffix);IsFinalBuild=$(IsFinalBuild);Configuration=$(Configuration);_NoBuildRepos=$(_NoBuildRepos)"
  51. ContinueOnError="true">
  52. <Output TaskParameter="TargetOutputs" ItemName="_RepoTestResults" />
  53. </MSBuild>
  54. <Warning Text="No test results were found from running repos." Condition="@(_RepoTestResults->Count()) == 0"/>
  55. <Message Text="Tests passed for the following repos:%0A - @(_RepoTestResults->WithMetadataValue('Success', 'true'), '%0A - ')"
  56. Importance="High"
  57. Condition="@(_RepoTestResults->WithMetadataValue('Success', 'true')->Count()) != 0 " />
  58. <Error Text="Tests failed for the following repos:%0A - @(_RepoTestResults->WithMetadataValue('Success', 'false'), '%0A - ')"
  59. Condition="@(_RepoTestResults->WithMetadataValue('Success', 'false')->Count()) != 0 " />
  60. </Target>
  61. <!-- Inner build context -->
  62. <Target Name="GetRepoBuildProps">
  63. <PropertyGroup>
  64. <SkipTestsDueToMissingSharedFx Condition="'$(InstallSharedRuntimeFromPreviousBuild)' != 'true' And '$(TestsRequiredTheSharedRuntime)' == 'true' ">true</SkipTestsDueToMissingSharedFx>
  65. <RepositoryBuildArguments Condition="'$(CI)'== 'true'">$(RepositoryBuildArguments) -ci</RepositoryBuildArguments>
  66. <!-- Should reduce allowable package feeds to only nuget.org. -->
  67. <RepositoryBuildArguments>$(RepositoryBuildArguments) /p:AspNetUniverseBuildOffline=true</RepositoryBuildArguments>
  68. <RepositoryBuildArguments>$(RepositoryBuildArguments) /p:IsUniverseBuild=true</RepositoryBuildArguments>
  69. <!-- If there are duplicate properties, the properties which are defined later in the order would override the earlier ones -->
  70. <RepositoryBuildArguments>$(RepositoryBuildArguments) /p:DotNetRestoreSourcePropsPath=$(GeneratedRestoreSourcesPropsPath)</RepositoryBuildArguments>
  71. <RepositoryBuildArguments>$(RepositoryBuildArguments) /p:DotNetPackageVersionPropsPath=$(GeneratedPackageVersionPropsPath)</RepositoryBuildArguments>
  72. <!-- Unset 'SignType' because we collect all outputs from repo builds and sign them at the end. -->
  73. <RepositoryBuildArguments>$(RepositoryBuildArguments) /p:SignType=</RepositoryBuildArguments>
  74. <RepositoryBuildArguments>$(RepositoryBuildArguments) /p:VersionSuffix=$(VersionSuffix)</RepositoryBuildArguments>
  75. <RepositoryBuildArguments>$(RepositoryBuildArguments) /p:BuildNumberSuffix=$(BuildNumberSuffix)</RepositoryBuildArguments>
  76. <RepositoryBuildArguments>$(RepositoryBuildArguments) /p:Configuration=$(Configuration)</RepositoryBuildArguments>
  77. <RepositoryBuildArguments>$(RepositoryBuildArguments) /p:IsFinalBuild=$(IsFinalBuild)</RepositoryBuildArguments>
  78. <!-- Disable broken features of KoreBuild that we're planning to kill off anyways -->
  79. <RepositoryBuildArguments>$(RepositoryBuildArguments) /p:DisablePackageReferenceRestrictions=true</RepositoryBuildArguments>
  80. <!-- We collect all output and code sign at the end. We don't need to code sign when we build each submodule. -->
  81. <RepositoryBuildArguments>$(RepositoryBuildArguments) /p:DisableCodeSigning=true</RepositoryBuildArguments>
  82. <RepositoryBuildArguments>$(RepositoryBuildArguments) '/p:DotNetAssetRootAccessTokenSuffix=$(DotNetAssetRootAccessTokenSuffix)'</RepositoryBuildArguments>
  83. <RepositoryBuildArguments>$(RepositoryBuildArguments) '/p:DotNetAssetRootUrl=$(DotNetAssetRootUrl)'</RepositoryBuildArguments>
  84. <RepositoryBuildArguments Condition=" '$(SkipTestsDueToMissingSharedFx)' == 'true' ">$(RepositoryBuildArguments) /p:SkipAspNetCoreRuntimeInstall=true</RepositoryBuildArguments>
  85. </PropertyGroup>
  86. </Target>
  87. <Target Name="_BuildRepository" DependsOnTargets="GetRepoBuildProps">
  88. <PropertyGroup>
  89. <BuildArguments>/t:CleanArtifacts /t:Build /p:SkipTests=true $(RepositoryBuildArguments)</BuildArguments>
  90. <BuildArguments Condition="'$(ProduceRepoBinLog)' == 'true'">$(BuildArguments) /bl:$(LogOutputDir)$(RepositoryToBuild).build.binlog</BuildArguments>
  91. <RepositoryArtifactsMSBuildDirectory>$(BuildRepositoryRoot)artifacts\msbuild\</RepositoryArtifactsMSBuildDirectory>
  92. </PropertyGroup>
  93. <Message Text="============ Building $(RepositoryToBuild) ============" Importance="High" />
  94. <Exec
  95. Command="./$(_BuildScriptToExecute) -RepoRoot $(BuildRepositoryRoot) $(BuildArguments)"
  96. IgnoreStandardErrorWarningFormat="true"
  97. WorkingDirectory="$(RepositoryRoot)"
  98. IgnoreExitCode="true"
  99. ContinueOnError="WarnAndContinue">
  100. <Output TaskParameter="ExitCode" PropertyName="BuildExitCode" />
  101. </Exec>
  102. <!-- Fail if build.cmd didn't exit code 0 or process failed to start. -->
  103. <Error Text="Building $(RepositoryToBuild) failed: $(_BuildScriptToExecute) exited code $(BuildExitCode)" Condition=" '$(BuildExitCode)' != '0' " />
  104. <ItemGroup>
  105. <RepositoryMSBuildArtifacts Include="$(RepositoryArtifactsMSBuildDirectory)**\*" />
  106. </ItemGroup>
  107. <Move
  108. SourceFiles="@(RepositoryMSBuildArtifacts)"
  109. DestinationFolder="$(ArtifactsDir)msbuild\$(RepositoryToBuild)\%(RecursiveDir)" />
  110. <Message Text="============ Done building $(RepositoryToBuild) ============" Importance="High" />
  111. </Target>
  112. <Target Name="_TestRepository" DependsOnTargets="GetRepoBuildProps" Returns="@(RepositoryTestResult)">
  113. <PropertyGroup>
  114. <BuildArguments>/t:Test /p:NoBuild=$(_NoBuildRepos) $(RepositoryBuildArguments)</BuildArguments>
  115. </PropertyGroup>
  116. <ItemGroup>
  117. <RepositoryTestResult Include="$(RepositoryToBuild)" Success="false" />
  118. </ItemGroup>
  119. <!-- To enable this test, either publish the shared runtime to https://dotnetcli.blob.core.windows.net/dotnet, or override the install location by setting AspNetCoreFxFeed. -->
  120. <Warning Text="Skipping tests because InstallSharedRuntimeFromPreviousBuild != 'true'." Condition="'$(SkipTestsDueToMissingSharedFx)' == 'true' "/>
  121. <Message Text="============ Testing $(RepositoryToBuild) ============" Importance="High" />
  122. <Exec Condition="'$(SkipTestsDueToMissingSharedFx)' != 'true' "
  123. Command="./$(_BuildScriptToExecute) -RepoRoot $(BuildRepositoryRoot) $(BuildArguments)"
  124. IgnoreStandardErrorWarningFormat="true"
  125. WorkingDirectory="$(RepositoryRoot)"
  126. IgnoreExitCode="true">
  127. <Output TaskParameter="ExitCode" PropertyName="TestExitCode" />
  128. </Exec>
  129. <ItemGroup>
  130. <RepositoryTestResult Update="$(RepositoryToBuild)" Success="true" Condition="'$(TestExitCode)' == '0' OR '$(SkipTestsDueToMissingSharedFx)' == 'true' " />
  131. </ItemGroup>
  132. <Message Text="============ Done testing $(RepositoryToBuild) ============" Importance="High" />
  133. </Target>
  134. </Project>