BuildParameters.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Runtime.InteropServices;
  5. using System.Text.RegularExpressions;
  6. using System.Xml.Linq;
  7. using Nuke.Common;
  8. using Nuke.Common.CI.AzurePipelines;
  9. using Nuke.Common.IO;
  10. using static Nuke.Common.IO.PathConstruction;
  11. public partial class Build
  12. {
  13. [Parameter(Name = "configuration")]
  14. public string Configuration { get; set; }
  15. [Parameter(Name = "skip-tests")]
  16. public bool SkipTests { get; set; }
  17. [Parameter(Name = "force-nuget-version")]
  18. public string ForceNugetVersion { get; set; }
  19. [Parameter(Name = "skip-previewer")]
  20. public bool SkipPreviewer { get; set; }
  21. [Parameter(Name = "api-baseline")]
  22. public string ApiValidationBaseline { get; set; }
  23. [Parameter(Name = "update-api-suppression")]
  24. public bool? UpdateApiValidationSuppression { get; set; }
  25. public class BuildParameters
  26. {
  27. public string Configuration { get; }
  28. public bool SkipTests { get; }
  29. public bool SkipPreviewer {get;}
  30. public string MainRepo { get; }
  31. public string MasterBranch { get; }
  32. public string RepositoryName { get; }
  33. public string RepositoryBranch { get; }
  34. public string ReleaseConfiguration { get; }
  35. public Regex ReleaseBranchRegex { get; }
  36. public string MSBuildSolution { get; }
  37. public bool IsLocalBuild { get; }
  38. public bool IsRunningOnUnix { get; }
  39. public bool IsRunningOnWindows { get; }
  40. public bool IsRunningOnAzure { get; }
  41. public bool IsPullRequest { get; }
  42. public bool IsMainRepo { get; }
  43. public bool IsMasterBranch { get; }
  44. public bool IsReleaseBranch { get; }
  45. public bool IsReleasable { get; }
  46. public bool IsMyGetRelease { get; }
  47. public bool IsNuGetRelease { get; }
  48. public bool PublishTestResults { get; }
  49. public string Version { get; }
  50. public AbsolutePath ArtifactsDir { get; }
  51. public AbsolutePath NugetIntermediateRoot { get; }
  52. public AbsolutePath NugetRoot { get; }
  53. public AbsolutePath ZipRoot { get; }
  54. public AbsolutePath TestResultsRoot { get; }
  55. public string DirSuffix { get; }
  56. public List<string> BuildDirs { get; }
  57. public string FileZipSuffix { get; }
  58. public AbsolutePath ZipCoreArtifacts { get; }
  59. public AbsolutePath ZipNuGetArtifacts { get; }
  60. public string ApiValidationBaseline { get; }
  61. public bool UpdateApiValidationSuppression { get; }
  62. public AbsolutePath ApiValidationSuppressionFiles { get; }
  63. public BuildParameters(Build b)
  64. {
  65. // ARGUMENTS
  66. Configuration = b.Configuration ?? "Release";
  67. SkipTests = b.SkipTests;
  68. SkipPreviewer = b.SkipPreviewer;
  69. // CONFIGURATION
  70. MainRepo = "https://github.com/AvaloniaUI/Avalonia";
  71. MasterBranch = "refs/heads/master";
  72. ReleaseBranchRegex = new("^refs/heads/release/(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$");
  73. ReleaseConfiguration = "Release";
  74. MSBuildSolution = RootDirectory / "dirs.proj";
  75. // PARAMETERS
  76. IsLocalBuild = NukeBuild.IsLocalBuild;
  77. IsRunningOnUnix = Environment.OSVersion.Platform == PlatformID.Unix ||
  78. Environment.OSVersion.Platform == PlatformID.MacOSX;
  79. IsRunningOnWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
  80. IsRunningOnAzure = Host is AzurePipelines ||
  81. Environment.GetEnvironmentVariable("LOGNAME") == "vsts";
  82. if (IsRunningOnAzure)
  83. {
  84. RepositoryName = AzurePipelines.Instance.RepositoryUri;
  85. RepositoryBranch = AzurePipelines.Instance.SourceBranch;
  86. IsPullRequest = AzurePipelines.Instance.PullRequestId.HasValue;
  87. IsMainRepo = StringComparer.OrdinalIgnoreCase.Equals(MainRepo, AzurePipelines.Instance.RepositoryUri);
  88. }
  89. IsMainRepo =
  90. StringComparer.OrdinalIgnoreCase.Equals(MainRepo,
  91. RepositoryName);
  92. IsMasterBranch = StringComparer.OrdinalIgnoreCase.Equals(MasterBranch,
  93. RepositoryBranch);
  94. IsReleaseBranch = RepositoryBranch is not null && ReleaseBranchRegex.IsMatch(RepositoryBranch);
  95. IsReleasable = StringComparer.OrdinalIgnoreCase.Equals(ReleaseConfiguration, Configuration);
  96. IsMyGetRelease = IsReleasable;
  97. IsNuGetRelease = IsMainRepo && IsReleasable && IsReleaseBranch;
  98. // VERSION
  99. Version = b.ForceNugetVersion ?? GetVersion();
  100. ApiValidationBaseline = b.ApiValidationBaseline ?? new Version(new Version(Version).Major, 0).ToString();
  101. UpdateApiValidationSuppression = b.UpdateApiValidationSuppression ?? IsLocalBuild;
  102. if (IsRunningOnAzure)
  103. {
  104. if (!IsNuGetRelease)
  105. {
  106. // Use AssemblyVersion with Build as version
  107. Version += "-cibuild" + int.Parse(Environment.GetEnvironmentVariable("BUILD_BUILDID")).ToString("0000000") + "-beta";
  108. }
  109. PublishTestResults = true;
  110. }
  111. // DIRECTORIES
  112. ArtifactsDir = RootDirectory / "artifacts";
  113. NugetRoot = ArtifactsDir / "nuget";
  114. NugetIntermediateRoot = RootDirectory / "build-intermediate" / "nuget";
  115. ZipRoot = ArtifactsDir / "zip";
  116. TestResultsRoot = ArtifactsDir / "test-results";
  117. BuildDirs = GlobDirectories(RootDirectory, "**bin").Concat(GlobDirectories(RootDirectory, "**obj")).ToList();
  118. DirSuffix = Configuration;
  119. FileZipSuffix = Version + ".zip";
  120. ZipCoreArtifacts = ZipRoot / ("Avalonia-" + FileZipSuffix);
  121. ZipNuGetArtifacts = ZipRoot / ("Avalonia-NuGet-" + FileZipSuffix);
  122. ApiValidationSuppressionFiles = RootDirectory / "api";
  123. }
  124. string GetVersion()
  125. {
  126. var xdoc = XDocument.Load(RootDirectory / "build/SharedVersion.props");
  127. return xdoc.Descendants().First(x => x.Name.LocalName == "Version").Value;
  128. }
  129. }
  130. }