Build.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Runtime.InteropServices;
  7. using System.Threading;
  8. using System.Xml.Linq;
  9. using Nuke.Common;
  10. using Nuke.Common.Git;
  11. using Nuke.Common.ProjectModel;
  12. using Nuke.Common.Tooling;
  13. using Nuke.Common.Tools.DotNet;
  14. using Nuke.Common.Tools.MSBuild;
  15. using Nuke.Common.Utilities;
  16. using static Nuke.Common.EnvironmentInfo;
  17. using static Nuke.Common.IO.FileSystemTasks;
  18. using static Nuke.Common.IO.PathConstruction;
  19. using static Nuke.Common.Tools.MSBuild.MSBuildTasks;
  20. using static Nuke.Common.Tools.DotNet.DotNetTasks;
  21. using static Nuke.Common.Tools.Xunit.XunitTasks;
  22. /*
  23. Before editing this file, install support plugin for your IDE,
  24. running and debugging a particular target (optionally without deps) would be way easier
  25. ReSharper/Rider - https://plugins.jetbrains.com/plugin/10803-nuke-support
  26. VSCode - https://marketplace.visualstudio.com/items?itemName=nuke.support
  27. */
  28. partial class Build : NukeBuild
  29. {
  30. BuildParameters Parameters { get; set; }
  31. protected override void OnBuildInitialized()
  32. {
  33. Parameters = new BuildParameters(this);
  34. Information("Building version {0} of Avalonia ({1}) using version {2} of Nuke.",
  35. Parameters.Version,
  36. Parameters.Configuration,
  37. typeof(NukeBuild).Assembly.GetName().Version.ToString());
  38. if (Parameters.IsLocalBuild)
  39. {
  40. Information("Repository Name: " + Parameters.RepositoryName);
  41. Information("Repository Branch: " + Parameters.RepositoryBranch);
  42. }
  43. Information("Configuration: " + Parameters.Configuration);
  44. Information("IsLocalBuild: " + Parameters.IsLocalBuild);
  45. Information("IsRunningOnUnix: " + Parameters.IsRunningOnUnix);
  46. Information("IsRunningOnWindows: " + Parameters.IsRunningOnWindows);
  47. Information("IsRunningOnAzure:" + Parameters.IsRunningOnAzure);
  48. Information("IsPullRequest: " + Parameters.IsPullRequest);
  49. Information("IsMainRepo: " + Parameters.IsMainRepo);
  50. Information("IsMasterBranch: " + Parameters.IsMasterBranch);
  51. Information("IsReleaseBranch: " + Parameters.IsReleaseBranch);
  52. Information("IsReleasable: " + Parameters.IsReleasable);
  53. Information("IsMyGetRelease: " + Parameters.IsMyGetRelease);
  54. Information("IsNuGetRelease: " + Parameters.IsNuGetRelease);
  55. }
  56. Target Clean => _ => _.Executes(() =>
  57. {
  58. DeleteDirectories(Parameters.BuildDirs);
  59. EnsureCleanDirectories(Parameters.BuildDirs);
  60. EnsureCleanDirectory(Parameters.ArtifactsDir);
  61. EnsureCleanDirectory(Parameters.NugetIntermediateRoot);
  62. EnsureCleanDirectory(Parameters.NugetRoot);
  63. EnsureCleanDirectory(Parameters.ZipRoot);
  64. EnsureCleanDirectory(Parameters.TestResultsRoot);
  65. });
  66. Target Compile => _ => _
  67. .DependsOn(Clean)
  68. .Executes(() =>
  69. {
  70. if (Parameters.IsRunningOnWindows)
  71. MSBuild(Parameters.MSBuildSolution, c => c
  72. .SetArgumentConfigurator(a => a.Add("/r"))
  73. .SetConfiguration(Parameters.Configuration)
  74. .SetVerbosity(MSBuildVerbosity.Minimal)
  75. .AddProperty("PackageVersion", Parameters.Version)
  76. .AddProperty("iOSRoslynPathHackRequired", "true")
  77. .SetToolsVersion(MSBuildToolsVersion._15_0)
  78. .AddTargets("Build")
  79. );
  80. else
  81. DotNetBuild(Parameters.MSBuildSolution, c => c
  82. .AddProperty("PackageVersion", Parameters.Version)
  83. .SetConfiguration(Parameters.Configuration)
  84. );
  85. });
  86. void RunCoreTest(string project)
  87. {
  88. if(!project.EndsWith(".csproj"))
  89. project = System.IO.Path.Combine(project, System.IO.Path.GetFileName(project)+".csproj");
  90. Information("Running tests from " + project);
  91. XDocument xdoc;
  92. using (var s = File.OpenRead(project))
  93. xdoc = XDocument.Load(s);
  94. List<string> frameworks = null;
  95. var targets = xdoc.Root.Descendants("TargetFrameworks").FirstOrDefault();
  96. if (targets != null)
  97. frameworks = targets.Value.Split(';').Where(f => !string.IsNullOrWhiteSpace(f)).ToList();
  98. else
  99. frameworks = new List<string> {xdoc.Root.Descendants("TargetFramework").First().Value};
  100. foreach(var fw in frameworks)
  101. {
  102. Information("Running for " + fw);
  103. DotNetTest(c =>
  104. {
  105. c = c
  106. .SetProjectFile(project)
  107. .SetConfiguration(Parameters.Configuration)
  108. .SetFramework(fw)
  109. .EnableNoBuild()
  110. .EnableNoRestore();
  111. // NOTE: I can see that we could maybe add another extension method "Switch" or "If" to make this more convenient
  112. if (Parameters.PublishTestResults)
  113. c = c.SetLogger("trx").SetResultsDirectory(Parameters.TestResultsRoot);
  114. return c;
  115. });
  116. }
  117. }
  118. Target RunCoreLibsTests => _ => _
  119. .OnlyWhen(() => !Parameters.SkipTests)
  120. .DependsOn(Compile)
  121. .Executes(() =>
  122. {
  123. RunCoreTest("./tests/Avalonia.Animation.UnitTests");
  124. RunCoreTest("./tests/Avalonia.Base.UnitTests");
  125. RunCoreTest("./tests/Avalonia.Controls.UnitTests");
  126. RunCoreTest("./tests/Avalonia.Input.UnitTests");
  127. RunCoreTest("./tests/Avalonia.Interactivity.UnitTests");
  128. RunCoreTest("./tests/Avalonia.Layout.UnitTests");
  129. RunCoreTest("./tests/Avalonia.Markup.UnitTests");
  130. RunCoreTest("./tests/Avalonia.Markup.Xaml.UnitTests");
  131. RunCoreTest("./tests/Avalonia.Styling.UnitTests");
  132. RunCoreTest("./tests/Avalonia.Visuals.UnitTests");
  133. RunCoreTest("./tests/Avalonia.Skia.UnitTests");
  134. RunCoreTest("./tests/Avalonia.ReactiveUI.UnitTests");
  135. });
  136. Target RunRenderTests => _ => _
  137. .OnlyWhen(() => !Parameters.SkipTests)
  138. .DependsOn(Compile)
  139. .Executes(() =>
  140. {
  141. RunCoreTest("./tests/Avalonia.Skia.RenderTests/Avalonia.Skia.RenderTests.csproj");
  142. if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
  143. RunCoreTest("./tests/Avalonia.Direct2D1.RenderTests/Avalonia.Direct2D1.RenderTests.csproj");
  144. });
  145. Target RunDesignerTests => _ => _
  146. .OnlyWhen(() => !Parameters.SkipTests && Parameters.IsRunningOnWindows)
  147. .DependsOn(Compile)
  148. .Executes(() =>
  149. {
  150. RunCoreTest("./tests/Avalonia.DesignerSupport.Tests");
  151. });
  152. [PackageExecutable("JetBrains.dotMemoryUnit", "dotMemoryUnit.exe")] readonly Tool DotMemoryUnit;
  153. Target RunLeakTests => _ => _
  154. .OnlyWhen(() => !Parameters.SkipTests && Parameters.IsRunningOnWindows)
  155. .DependsOn(Compile)
  156. .Executes(() =>
  157. {
  158. var testAssembly = "tests\\Avalonia.LeakTests\\bin\\Release\\net461\\Avalonia.LeakTests.dll";
  159. DotMemoryUnit(
  160. $"{XunitPath.DoubleQuoteIfNeeded()} --propagate-exit-code -- {testAssembly}",
  161. timeout: 120_000);
  162. });
  163. Target ZipFiles => _ => _
  164. .After(CreateNugetPackages, Compile, RunCoreLibsTests, Package)
  165. .Executes(() =>
  166. {
  167. var data = Parameters;
  168. Zip(data.ZipCoreArtifacts, data.BinRoot);
  169. Zip(data.ZipNuGetArtifacts, data.NugetRoot);
  170. Zip(data.ZipTargetControlCatalogDesktopDir,
  171. GlobFiles(data.ZipSourceControlCatalogDesktopDir, "*.dll").Concat(
  172. GlobFiles(data.ZipSourceControlCatalogDesktopDir, "*.config")).Concat(
  173. GlobFiles(data.ZipSourceControlCatalogDesktopDir, "*.so")).Concat(
  174. GlobFiles(data.ZipSourceControlCatalogDesktopDir, "*.dylib")).Concat(
  175. GlobFiles(data.ZipSourceControlCatalogDesktopDir, "*.exe")));
  176. });
  177. Target CreateIntermediateNugetPackages => _ => _
  178. .DependsOn(Compile)
  179. .After(RunTests)
  180. .Executes(() =>
  181. {
  182. if (Parameters.IsRunningOnWindows)
  183. MSBuild(Parameters.MSBuildSolution, c => c
  184. .SetConfiguration(Parameters.Configuration)
  185. .SetVerbosity(MSBuildVerbosity.Minimal)
  186. .AddProperty("PackageVersion", Parameters.Version)
  187. .AddProperty("iOSRoslynPathHackRequired", "true")
  188. .SetToolsVersion(MSBuildToolsVersion._15_0)
  189. .AddTargets("Pack"));
  190. else
  191. DotNetPack(Parameters.MSBuildSolution, c =>
  192. c.SetConfiguration(Parameters.Configuration)
  193. .AddProperty("PackageVersion", Parameters.Version));
  194. });
  195. Target CreateNugetPackages => _ => _
  196. .DependsOn(CreateIntermediateNugetPackages)
  197. .Executes(() =>
  198. {
  199. var config = Numerge.MergeConfiguration.LoadFile(RootDirectory / "nukebuild" / "numerge.config");
  200. EnsureCleanDirectory(Parameters.NugetRoot);
  201. if(!Numerge.NugetPackageMerger.Merge(Parameters.NugetIntermediateRoot, Parameters.NugetRoot, config,
  202. new NumergeNukeLogger()))
  203. throw new Exception("Package merge failed");
  204. });
  205. Target RunTests => _ => _
  206. .DependsOn(RunCoreLibsTests)
  207. .DependsOn(RunRenderTests)
  208. .DependsOn(RunDesignerTests)
  209. .DependsOn(RunLeakTests);
  210. Target Package => _ => _
  211. .DependsOn(RunTests)
  212. .DependsOn(CreateNugetPackages);
  213. Target CiAzureLinux => _ => _
  214. .DependsOn(RunTests);
  215. Target CiAzureOSX => _ => _
  216. .DependsOn(Package)
  217. .DependsOn(ZipFiles);
  218. Target CiAzureWindows => _ => _
  219. .DependsOn(Package)
  220. .DependsOn(ZipFiles);
  221. public static int Main() =>
  222. RuntimeInformation.IsOSPlatform(OSPlatform.Windows)
  223. ? Execute<Build>(x => x.Package)
  224. : Execute<Build>(x => x.RunTests);
  225. }