RepositoryBuild.targets 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  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. <BatchedRepository Include="$(MSBuildProjectFullPath)">
  12. <BuildGroup>%(RepositoryBuildOrder.Order)</BuildGroup>
  13. <Repository>%(RepositoryBuildOrder.Identity)</Repository>
  14. <AdditionalProperties>
  15. RepositoryToBuild=%(RepositoryBuildOrder.Identity);
  16. BuildRepositoryRoot=$([MSBuild]::NormalizeDirectory(%(RepositoryBuildOrder.RootPath)))
  17. </AdditionalProperties>
  18. </BatchedRepository>
  19. </ItemGroup>
  20. </Target>
  21. <Target Name="_BuildRepositories" DependsOnTargets="GetRepoBatches">
  22. <MSBuild
  23. Projects="@(BatchedRepository)"
  24. BuildInParallel="true"
  25. StopOnFirstFailure="true"
  26. Targets="_BuildRepository"
  27. Properties="BuildGroup=%(BatchedRepository.BuildGroup);BuildNumber=$(BuildNumber);IsFinalBuild=$(IsFinalBuild);Configuration=$(Configuration)" />
  28. <PropertyGroup>
  29. <_NoBuildRepos>true</_NoBuildRepos>
  30. </PropertyGroup>
  31. </Target>
  32. <Target Name="_TestRepositories" DependsOnTargets="GetRepoBatches">
  33. <!--
  34. Use the task to sort instead of batching (i.e. using %(BatchedRepository.BuildGroup))
  35. When batching, StopOnFirstFailure doesn't help because the MSBuild task would be invoked multiple times
  36. instead of invoking once with many projects.
  37. -->
  38. <RepoTasks.OrderBy Items="@(BatchedRepository)" Key="BuildGroup">
  39. <Output TaskParameter="Items" ItemName="_BatchedTestRepo" />
  40. </RepoTasks.OrderBy>
  41. <MSBuild
  42. Projects="@(_BatchedTestRepo)"
  43. BuildInParallel="$(TestProjectsInParallel)"
  44. StopOnFirstFailure="false"
  45. Targets="_TestRepository"
  46. Properties="BuildNumber=$(BuildNumber);IsFinalBuild=$(IsFinalBuild);Configuration=$(Configuration);_NoBuildRepos=$(_NoBuildRepos)"
  47. ContinueOnError="true">
  48. <Output TaskParameter="TargetOutputs" ItemName="_RepoTestResults" />
  49. </MSBuild>
  50. <Warning Text="No test results were found from running repos." Condition="@(_RepoTestResults->Count()) == 0"/>
  51. <Message Text="Tests passed for the following repos:%0A - @(_RepoTestResults->WithMetadataValue('Success', 'true'), '%0A - ')"
  52. Importance="High"
  53. Condition="@(_RepoTestResults->WithMetadataValue('Success', 'true')->Count()) != 0 " />
  54. <Error Text="Tests failed for the following repos:%0A - @(_RepoTestResults->WithMetadataValue('Success', 'false'), '%0A - ')"
  55. Condition="@(_RepoTestResults->WithMetadataValue('Success', 'false')->Count()) != 0 " />
  56. </Target>
  57. <!-- Inner build context -->
  58. <Target Name="GetRepoBuildProps">
  59. <PropertyGroup>
  60. <!-- Should reduce allowable package feeds to only nuget.org. -->
  61. <RepositoryBuildArguments>$(RepositoryBuildArguments) /p:AspNetUniverseBuildOffline=true</RepositoryBuildArguments>
  62. <!-- If there are duplicate properties, the properties which are defined later in the order would override the earlier ones -->
  63. <RepositoryBuildArguments>$(RepositoryBuildArguments) /p:DotNetRestoreSourcePropsPath=$(GeneratedRestoreSourcesPropsPath)</RepositoryBuildArguments>
  64. <RepositoryBuildArguments>$(RepositoryBuildArguments) /p:DotNetPackageVersionPropsPath=$(GeneratedPackageVersionPropsPath)</RepositoryBuildArguments>
  65. <RepositoryBuildArguments>$(RepositoryBuildArguments) /p:BuildNumber=$(BuildNumber)</RepositoryBuildArguments>
  66. <RepositoryBuildArguments>$(RepositoryBuildArguments) /p:Configuration=$(Configuration)</RepositoryBuildArguments>
  67. <RepositoryBuildArguments>$(RepositoryBuildArguments) /p:IsFinalBuild=$(IsFinalBuild)</RepositoryBuildArguments>
  68. <RepositoryBuildArguments>$(RepositoryBuildArguments) /noconsolelogger '/l:RepoTasks.FlowLogger,$(MSBuildThisFileDirectory)tasks\bin\publish\RepoTasks.dll;Summary;FlowId=$(RepositoryToBuild)'</RepositoryBuildArguments>
  69. <SourceLockFile>$(RepositoryRoot)korebuild-lock.txt</SourceLockFile>
  70. <RepoLockFile>$(BuildRepositoryRoot)korebuild-lock.txt</RepoLockFile>
  71. <BackupRepoLockFile>$(IntermediateDir)$(RepositoryToBuild)-korebuild-lock.txt</BackupRepoLockFile>
  72. </PropertyGroup>
  73. </Target>
  74. <Target Name="_UpdateRepoLockFile">
  75. <!-- Copy Korebuild lock file to individual repos to align version if the repo doesn't already have one -->
  76. <Message Text="Copying KoreBuild lockfile from Universe to repository $(BuildRepositoryRoot)"/>
  77. <Move SourceFiles="$(RepoLockFile)" DestinationFiles="$(BackupRepoLockFile)" Condition="Exists($(RepoLockFile))" />
  78. <Copy SourceFiles="$(SourceLockFile)" DestinationFiles="$(RepoLockFile)" />
  79. </Target>
  80. <Target Name="_RestoreOriginalRepoLockFile">
  81. <!-- Restore original Korebuild lock file -->
  82. <Delete Files="$(RepoLockFile)" ContinueOnError="true" />
  83. <Move SourceFiles="$(BackupRepoLockFile)" DestinationFiles="$(RepoLockFile)" Condition="Exists($(BackupRepoLockFile))" />
  84. </Target>
  85. <Target Name="_BuildRepository" DependsOnTargets="GetRepoBuildProps;_UpdateRepoLockFile">
  86. <PropertyGroup>
  87. <BuildArguments>/t:CleanArtifacts /t:Build /p:SkipTests=true $(RepositoryBuildArguments)</BuildArguments>
  88. <RepositoryArtifactsRoot>$(BuildRepositoryRoot)artifacts</RepositoryArtifactsRoot>
  89. <RepositoryArtifactsBuildDirectory>$(RepositoryArtifactsRoot)\build\</RepositoryArtifactsBuildDirectory>
  90. <RepositoryArtifactsMSBuildDirectory>$(RepositoryArtifactsRoot)\msbuild\</RepositoryArtifactsMSBuildDirectory>
  91. </PropertyGroup>
  92. <Message Text="============ Building $(RepositoryToBuild) ============" Importance="High" />
  93. <Exec
  94. Command="./$(_BuildScriptToExecute) -Path $(BuildRepositoryRoot) $(BuildArguments)"
  95. IgnoreStandardErrorWarningFormat="true"
  96. WorkingDirectory="$(RepositoryRoot)"
  97. IgnoreExitCode="true"
  98. ContinueOnError="WarnAndContinue">
  99. <Output TaskParameter="ExitCode" PropertyName="BuildExitCode" />
  100. </Exec>
  101. <CallTarget Targets="_RestoreOriginalRepoLockFile" />
  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. <RepositoryArtifacts Include="$(RepositoryArtifactsBuildDirectory)*" />
  106. <RepositoryMSBuildArtifacts Include="$(RepositoryArtifactsMSBuildDirectory)**\*" />
  107. </ItemGroup>
  108. <Copy
  109. SourceFiles="@(RepositoryArtifacts)"
  110. DestinationFolder="$(BuildDir)" />
  111. <Move
  112. SourceFiles="@(RepositoryMSBuildArtifacts)"
  113. DestinationFolder="$(ArtifactsDir)msbuild\$(RepositoryToBuild)\%(RecursiveDir)" />
  114. <Message Text="============ Done building $(RepositoryToBuild) ============" Importance="High" />
  115. </Target>
  116. <Target Name="_TestRepository" DependsOnTargets="GetRepoBuildProps;_UpdateRepoLockFile" Returns="@(RepositoryTestResult)">
  117. <PropertyGroup>
  118. <BuildArguments>/t:Test /p:NoBuild=$(_NoBuildRepos) $(RepositoryBuildArguments)</BuildArguments>
  119. </PropertyGroup>
  120. <ItemGroup>
  121. <RepositoryTestResult Include="$(RepositoryToBuild)" Success="false" />
  122. </ItemGroup>
  123. <Message Text="============ Testing $(RepositoryToBuild) ============" Importance="High" />
  124. <Exec
  125. Command="./$(_BuildScriptToExecute) -Path $(BuildRepositoryRoot) $(BuildArguments)"
  126. IgnoreStandardErrorWarningFormat="true"
  127. WorkingDirectory="$(RepositoryRoot)"
  128. IgnoreExitCode="true">
  129. <Output TaskParameter="ExitCode" PropertyName="TestExitCode" />
  130. </Exec>
  131. <CallTarget Targets="_RestoreOriginalRepoLockFile" />
  132. <ItemGroup>
  133. <RepositoryTestResult Update="$(RepositoryToBuild)" Success="true" Condition="'$(TestExitCode)' == '0'" />
  134. </ItemGroup>
  135. <Message Text="============ Done testing $(RepositoryToBuild) ============" Importance="High" />
  136. </Target>
  137. </Project>