diff --git a/GitReleaseManager.yaml b/GitReleaseManager.yaml new file mode 100644 index 000000000..dce464b57 --- /dev/null +++ b/GitReleaseManager.yaml @@ -0,0 +1,61 @@ +## Configuration values used when creating new releases +#create: +# include-footer: true +# footer-heading: Where to get it +# footer-content: >- +# You can download this release from +# +# [chocolatey](https://chocolatey.org/packages/chocolateyGUI/{milestone}) +# footer-includes-milestone: false +# milestone-replace-text: '{milestone}' +# include-sha-section: false +# sha-section-heading: SHA256 Hashes of the release artifacts +# sha-section-line-format: '- `{1} {0}`' +# allow-update-to-published: false +## Configuration values used when exporting release notes +#export: +# include-created-date-in-title: false +# created-date-string-format: MMMM dd, yyyy +# perform-regex-removal: false +# regex-text: '### Where to get it(\r\n)*You can .*\.' +# multiline-regex: false +## Configuration values used when closing a milestone +#close: +## Whether to add comments to issues closed and with the published milestone release. +# use-issue-comments: false +# issue-comment: |- +# :tada: This issue has been resolved in version {milestone} :tada: +# +# The release is available on: +# +# - [NuGet package(@{milestone})](https://nuget.org/packages/{repository}/{milestone}) +# - [GitHub release](https://github.com/{owner}/{repository}/releases/tag/{milestone}) +# +# Your **[GitReleaseManager](https://github.com/GitTools/GitReleaseManager)** bot :package::rocket: +## The labels that will be used to include issues in release notes. +issue-labels-include: +- Feature +- Enhancement +- Bug +- Build +#- Duplicate +#- Help Wanted +#- Improvement +#- Invalid +#- Question +#- WontFix +## The labels that will NOT be used when including issues in release notes. +#issue-labels-exclude: +#- Internal Refactoring +## Overrides default pluralization and header names for specific labels. +issue-labels-alias: +- name: Build + header: Build + plural: Build +#- name: Documentation +# header: Documentation +# plural: Documentation +## The labels that will NOT be used when including issues in release notes. +#issue-labels-exclude: +#- Internal Refactoring +# \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml index 7a8081175..fb7cb8e8e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -19,3 +19,5 @@ environment: secure: aDsu1U+umVYFVybjkBVtVQsatSj3QKbD7VkGQci9mNF3493g9Giao/GABISIaHjT GITHUB_PASSWORD: secure: 2eNz23Eb1L40g2LPmlPqog== + GITHUB_ACCESS_TOKEN: + secure: pxZJzzwCBB46Ey3tRoJI90RC10KnK1pgucafZagYsLL8JNJz6RwcHf0DIH01nWnL diff --git a/build.cake b/build.cake index 3dd0ffecb..68f27acc0 100644 --- a/build.cake +++ b/build.cake @@ -1,5 +1,6 @@ #tool nuget:?package=NUnit.ConsoleRunner&version=3.10.0 #tool nuget:?package=GitVersion.CommandLine&version=5.0.0 +#tool nuget:?package=GitReleaseManager&version=0.11.0 #tool "nuget:https://api.nuget.org/v3/index.json?package=nuget.commandline&version=5.3.1" #tool nuget:?package=Wyam&version=2.2.9 @@ -116,8 +117,8 @@ Task("UpdateAssemblyInfo") .Does((parameters) => { var major = new Version(parameters.AssemblyVersion).Major; - parameters.Versions.PatchAssemblyInfo("src/CommonAssemblyInfo.cs"); - parameters.Versions.PatchAssemblyInfo("src/TestEngine/CommonEngineAssemblyInfo.cs"); + parameters.BuildVersion.PatchAssemblyInfo("src/CommonAssemblyInfo.cs"); + parameters.BuildVersion.PatchAssemblyInfo("src/TestEngine/CommonEngineAssemblyInfo.cs"); }); ////////////////////////////////////////////////////////////////////// @@ -295,6 +296,7 @@ Task("TestNuGetPackage") Task("BuildChocolateyPackage") .IsDependentOn("CreateImage") + .WithCriteria(IsRunningOnWindows()) .Does((parameters) => { Information("Creating package " + parameters.ChocolateyPackageName); @@ -340,6 +342,7 @@ Task("BuildChocolateyPackage") Task("TestChocolateyPackage") .IsDependentOn("BuildChocolateyPackage") + .WithCriteria(IsRunningOnWindows()) .Does((parameters) => { new ChocolateyPackageTester(parameters).RunAllTests(); @@ -400,6 +403,56 @@ Task("PublishPackages") Information("Nothing to publish from this run."); }); +////////////////////////////////////////////////////////////////////// +// CREATE A DRAFT RELEASE +////////////////////////////////////////////////////////////////////// + +Task("CreateDraftRelease") + .IsDependentOn("BuildPackages") + .WithCriteria((context, parameters) => parameters.IsReleaseBranch) + .Does((parameters) => + { + // Exit if any PackageTests failed + CheckTestErrors(ref ErrorDetail); + + string releaseName = $"TestCentric {parameters.BuildVersion.SemVer}"; + string milestone = GetMilestoneFromBranchName(parameters.BranchName); + string assets = IsRunningOnWindows() + ? $"\"{parameters.ZipPackage},{parameters.NuGetPackage},{parameters.ChocolateyPackage},{parameters.MetadataPackage}\"" + : $"\"{parameters.ZipPackage},{parameters.NuGetPackage}\""; + + Information($"Creating draft release {releaseName} from milestone {milestone}"); + + GitReleaseManagerCreate(parameters.GitHubAccessToken, "TestCentric", "testcentric-gui", new GitReleaseManagerCreateSettings() + { + Name = releaseName, + Milestone = milestone, + Assets = assets + }); + }); + + private static string GetMilestoneFromBranchName(string branchName) + { + Version versionFromBranch; + if (!Version.TryParse(branchName.Substring(8), out versionFromBranch)) + { string msg = $"Branch name {branchName} incorporates an invalid version format. "; + if (branchName.IndexOf("-") >0) + msg += "Note that pre-release versions are not yet supported for release branches."; + throw new InvalidOperationException(msg); + } + + if (versionFromBranch.Build < 0) + throw new InvalidOperationException("Release branch must specify three version components."); + + string milestone = versionFromBranch.Build <= 0 + ? versionFromBranch.ToString(2) + : versionFromBranch.ToString(3); + // if (_parameters.IsPreRelease) + // milestone += $"-{_parameters.BuildVersion.PreReleaseSuffix}"; + + return milestone; + } + ////////////////////////////////////////////////////////////////////// // INTERACTIVE TESTS FOR USE IN DEVELOPMENT ////////////////////////////////////////////////////////////////////// @@ -454,13 +507,19 @@ Task("Test") .IsDependentOn("TestEngine") .IsDependentOn("TestGui"); -Task("Package") +Task("BuildPackages") .IsDependentOn("CheckTestErrors") - .IsDependentOn("PackageZip") - .IsDependentOn("PackageNuget") - .IsDependentOn("PackageChocolatey") + .IsDependentOn("BuildZipPackage") + .IsDependentOn("BuildNuGetPackage") + .IsDependentOn("BuildChocolateyPackage") .IsDependentOn("BuildMetadataPackage"); +Task("TestPackages") + .IsDependentOn("BuildPackages") + .IsDependentOn("TestZipPackage") + .IsDependentOn("TestNuGetPackage") + .IsDependentOn("TestChocolateyPackage"); + Task("PackageZip") .IsDependentOn("BuildZipPackage") .IsDependentOn("TestZipPackage"); @@ -473,16 +532,15 @@ Task("PackageChocolatey") .IsDependentOn("BuildChocolateyPackage") .IsDependentOn("TestChocolateyPackage"); -Task("Publish") - .IsDependentOn("PublishPackages") - .IsDependentOn("UpdateWebsite"); - Task("AppVeyor") .IsDependentOn("DumpSettings") .IsDependentOn("Build") .IsDependentOn("Test") - .IsDependentOn("Package") - .IsDependentOn("Publish"); + .IsDependentOn("BuildPackages") + .IsDependentOn("TestPackages") + .IsDependentOn("PublishPackages") + .IsDependentOn("CreateDraftRelease") + .IsDependentOn("UpdateWebsite"); Task("Travis") .IsDependentOn("Build") @@ -492,7 +550,8 @@ Task("All") .IsDependentOn("DumpSettings") .IsDependentOn("Build") .IsDependentOn("Test") - .IsDependentOn("Package"); + .IsDependentOn("BuildPackages") + .IsDependentOn("TestPackages"); Task("Default") .IsDependentOn("Test"); diff --git a/build/parameters.cake b/build/parameters.cake index f428bc92b..ad2363ba7 100644 --- a/build/parameters.cake +++ b/build/parameters.cake @@ -18,9 +18,9 @@ public class BuildParameters // Environment Variable names holding GitHub identity of user // These are only used to publish the website when running locally - // private const string GITHUB_USER_ID = "GITHUB_USER_ID"; - // private const string GITHUB_USER_EMAIL = "GITHUB_USER_EMAIL"; private const string GITHUB_PASSWORD = "GITHUB_PASSWORD"; + // Access token is used by GitReleaseManager + private const string GITHUB_ACCESS_TOKEN = "GITHUB_ACCESS_TOKEN"; // Pre-release labels that we publish private static readonly string[] LABELS_WE_PUBLISH_ON_MYGET = { "dev", "pre" }; @@ -49,13 +49,23 @@ public class BuildParameters Configuration = context.Argument("configuration", DEFAULT_CONFIGURATION); ProjectDirectory = context.Environment.WorkingDirectory.FullPath + "/"; - Versions = new BuildVersion(context, this); + MyGetApiKey = _context.EnvironmentVariable(MYGET_API_KEY); + NuGetApiKey = _context.EnvironmentVariable(NUGET_API_KEY); + ChocolateyApiKey = _context.EnvironmentVariable(CHOCO_API_KEY); + + UsingXBuild = context.EnvironmentVariable("USE_XBUILD") != null; + + GitHubPassword = _context.EnvironmentVariable(GITHUB_PASSWORD); + GitHubAccessToken = _context.EnvironmentVariable(GITHUB_ACCESS_TOKEN); + + BuildVersion = new BuildVersion(context, this); + //ReleaseManager = new ReleaseManager(context, this); if (context.HasArgument("testLevel")) PackageTestLevel = context.Argument("testLevel", 1); - else if (!Versions.IsPreRelease) + else if (!BuildVersion.IsPreRelease) PackageTestLevel = 3; - else switch (Versions.PreReleaseLabel) + else switch (BuildVersion.PreReleaseLabel) { case "pre": case "rc": @@ -73,16 +83,6 @@ public class BuildParameters break; } - MyGetApiKey = _context.EnvironmentVariable(MYGET_API_KEY); - NuGetApiKey = _context.EnvironmentVariable(NUGET_API_KEY); - ChocolateyApiKey = _context.EnvironmentVariable(CHOCO_API_KEY); - - // GitHubUserId = _context.EnvironmentVariable(GITHUB_USER_ID); - // GitHubUserEmail = _context.EnvironmentVariable(GITHUB_USER_EMAIL); - GitHubPassword = _context.EnvironmentVariable(GITHUB_PASSWORD); - - UsingXBuild = context.EnvironmentVariable("USE_XBUILD") != null; - MSBuildSettings = new MSBuildSettings { Verbosity = Verbosity.Minimal, ToolVersion = MSBuildToolVersion.Default,//The highest available MSBuild tool version//VS2017 @@ -119,11 +119,13 @@ public class BuildParameters public string Configuration { get; } - public BuildVersion Versions { get; } - public string PackageVersion => Versions.PackageVersion; - public string AssemblyVersion => Versions.AssemblyVersion; - public string AssemblyFileVersion => Versions.AssemblyFileVersion; - public string AssemblyInformationalVersion => Versions.AssemblyInformationalVersion; + public BuildVersion BuildVersion { get; } + public string PackageVersion => BuildVersion.PackageVersion; + public string AssemblyVersion => BuildVersion.AssemblyVersion; + public string AssemblyFileVersion => BuildVersion.AssemblyFileVersion; + public string AssemblyInformationalVersion => BuildVersion.AssemblyInformationalVersion; + + //public ReleaseManager ReleaseManager { get; } public int PackageTestLevel { get; } @@ -170,11 +172,16 @@ public class BuildParameters public bool IsNuGetApiKeyAvailable => !string.IsNullOrEmpty(NuGetApiKey); public bool IsChocolateyApiKeyAvailable => !string.IsNullOrEmpty(ChocolateyApiKey); - public bool IsPreRelease => Versions.IsPreRelease; - public bool IsFinalRelease => !IsPreRelease; - public bool ShouldPublishToMyGet => IsFinalRelease || LABELS_WE_PUBLISH_ON_MYGET.Contains(Versions.PreReleaseLabel); - public bool ShouldPublishToNuGet => IsFinalRelease || LABELS_WE_PUBLISH_ON_NUGET.Contains(Versions.PreReleaseLabel); - public bool ShouldPublishToChocolatey => IsFinalRelease || LABELS_WE_PUBLISH_ON_CHOCOLATEY.Contains(Versions.PreReleaseLabel); + public string BranchName => BuildVersion.BranchName; + public bool IsReleaseBranch => BuildVersion.IsReleaseBranch; + + public bool IsPreRelease => BuildVersion.IsPreRelease; + public bool ShouldPublishToMyGet => !IsPreRelease && !IsReleaseBranch || + LABELS_WE_PUBLISH_ON_MYGET.Contains(BuildVersion.PreReleaseLabel); + public bool ShouldPublishToNuGet => !IsPreRelease && !IsReleaseBranch || + LABELS_WE_PUBLISH_ON_NUGET.Contains(BuildVersion.PreReleaseLabel); + public bool ShouldPublishToChocolatey => !IsPreRelease && !IsReleaseBranch || + LABELS_WE_PUBLISH_ON_CHOCOLATEY.Contains(BuildVersion.PreReleaseLabel); public bool IsProductionRelease => ShouldPublishToNuGet || ShouldPublishToChocolatey; public bool UsingXBuild { get; } @@ -193,6 +200,7 @@ public class BuildParameters public string GitHubUserId => "charliepoole"; public string GitHubUserEmail => "charliepoole@gmail.com"; public string GitHubPassword { get; } + public string GitHubAccessToken { get; } private void Validate() { @@ -208,6 +216,12 @@ public class BuildParameters errors.Add("Chocolatey ApiKey was not set."); } + if (TasksToExecute.Contains("CreateDraftRelease")) + { + if (IsReleaseBranch && string.IsNullOrEmpty(GitHubAccessToken)) + errors.Add("GitHub Access Token was not set."); + } + if (TasksToExecute.Contains("DeployWebsite")) { if (string.IsNullOrEmpty(GitHubUserId)) @@ -242,17 +256,20 @@ public class BuildParameters Console.WriteLine("IsRunningOnUnix: " + IsRunningOnUnix); Console.WriteLine("IsRunningOnAppVeyor: " + IsRunningOnAppVeyor); - Console.WriteLine("\nGIT"); - Console.WriteLine("\nVERSIONING"); Console.WriteLine("PackageVersion: " + PackageVersion); Console.WriteLine("AssemblyVersion: " + AssemblyVersion); Console.WriteLine("AssemblyFileVersion: " + AssemblyFileVersion); Console.WriteLine("AssemblyInformationalVersion: " + AssemblyInformationalVersion); - Console.WriteLine("SemVer: " + Versions.SemVer); - Console.WriteLine("IsPreRelease: " + Versions.IsPreRelease); - Console.WriteLine("PreReleaseLabel: " + Versions.PreReleaseLabel); - Console.WriteLine("PreReleaseSuffix: " + Versions.PreReleaseSuffix); + Console.WriteLine("SemVer: " + BuildVersion.SemVer); + Console.WriteLine("IsPreRelease: " + BuildVersion.IsPreRelease); + Console.WriteLine("PreReleaseLabel: " + BuildVersion.PreReleaseLabel); + Console.WriteLine("PreReleaseSuffix: " + BuildVersion.PreReleaseSuffix); + + Console.WriteLine("\nRELEASING"); + Console.WriteLine("BranchName: " + BranchName); + Console.WriteLine("IsReleaseBranch: " + IsReleaseBranch); + //Console.WriteLine("ReleaseMilestone: " + ReleaseMilestone); Console.WriteLine("\nDIRECTORIES"); Console.WriteLine("Project: " + ProjectDirectory); diff --git a/build/versioning.cake b/build/versioning.cake index 53ae4ac90..4c0d84908 100644 --- a/build/versioning.cake +++ b/build/versioning.cake @@ -2,7 +2,9 @@ using System.Text.RegularExpressions; public class BuildVersion { + private ISetupContext _context; private BuildParameters _parameters; + private GitVersion _gitVersion; // NOTE: This is complicated because (1) the user may have specified // the package version on the command-line and (2) GitVersion may @@ -13,23 +15,30 @@ public class BuildVersion // then parsing it to provide information that is used in the build. public BuildVersion(ISetupContext context, BuildParameters parameters) { + _context = context; _parameters = parameters; + _gitVersion = context.GitVersion(); + + BranchName = _gitVersion.BranchName; + IsReleaseBranch = BranchName.StartsWith("release-"); // TODO: Get GitVersion to work on Linux string packageVersion = context.HasArgument("asVersion") ? context.Argument("asVersion", DEFAULT_VERSION) - : packageVersion = CalculatePackageVersion(context); + : IsReleaseBranch + ? BranchName.Substring(8) + : CalculatePackageVersion(); int dash = packageVersion.IndexOf('-'); IsPreRelease = dash > 0; - string version = packageVersion; + string versionPart = packageVersion; string suffix = ""; string label = ""; if (IsPreRelease) { - version = packageVersion.Substring(0, dash); + versionPart = packageVersion.Substring(0, dash); suffix = packageVersion.Substring(dash+1); foreach (char c in suffix) { @@ -39,7 +48,8 @@ public class BuildVersion } } - SemVer = new Version(version).ToString(3); + Version version = new Version(versionPart); + SemVer = version.ToString(3); PreReleaseLabel = label; PreReleaseSuffix = suffix; @@ -49,6 +59,9 @@ public class BuildVersion AssemblyInformationalVersion = packageVersion; } + public string BranchName { get; } + public bool IsReleaseBranch { get; } + public string PackageVersion { get; } public string AssemblyVersion { get; } public string AssemblyFileVersion { get; } @@ -59,16 +72,15 @@ public class BuildVersion public string PreReleaseLabel { get; } public string PreReleaseSuffix { get; } - private static string CalculatePackageVersion(ISetupContext context) + private string CalculatePackageVersion() { - var gitVersion = context.GitVersion(); - string label = gitVersion.PreReleaseLabel; + string label = _gitVersion.PreReleaseLabel; // Non pre-release is easy if (string.IsNullOrEmpty(label)) - return gitVersion.MajorMinorPatch; + return _gitVersion.MajorMinorPatch; - string branchName = gitVersion.BranchName; + string branchName = _gitVersion.BranchName; // We don't currently use this pattern, but check in case we do later. if (branchName.StartsWith ("feature/")) branchName = branchName.Substring(8); @@ -77,7 +89,7 @@ public class BuildVersion if (label == branchName) label = "ci"; - string suffix = "-" + label + gitVersion.CommitsSinceVersionSourcePadded; + string suffix = "-" + label + _gitVersion.CommitsSinceVersionSourcePadded; switch(label) { @@ -87,22 +99,21 @@ public class BuildVersion // Nuget limits "special version part" to 20 chars. Add one for the hyphen. if (suffix.Length > 21) suffix = suffix.Substring(0, 21); - return gitVersion.MajorMinorPatch + suffix; + return _gitVersion.MajorMinorPatch + suffix; case "dev": case "pre": - return gitVersion.MajorMinorPatch + suffix; + return _gitVersion.MajorMinorPatch + suffix; case "pr": - return gitVersion.LegacySemVerPadded; + return _gitVersion.LegacySemVerPadded; case "rc": case "alpha": case "beta": default: - return gitVersion.LegacySemVer; + return _gitVersion.LegacySemVer; } - } public void PatchAssemblyInfo(string sourceFile, string assemblyVersion = null) diff --git a/nuget/TestCentric.Metadata.nuspec b/nuget/TestCentric.Metadata.nuspec index 4ecaa492a..81d7e3942 100644 --- a/nuget/TestCentric.Metadata.nuspec +++ b/nuget/TestCentric.Metadata.nuspec @@ -22,9 +22,9 @@ - - - - + + + + diff --git a/src/CommonAssemblyInfo.cs b/src/CommonAssemblyInfo.cs index b5c6c6706..af9146db0 100644 --- a/src/CommonAssemblyInfo.cs +++ b/src/CommonAssemblyInfo.cs @@ -21,6 +21,6 @@ [assembly: AssemblyConfiguration("Release")] #endif -[assembly: AssemblyVersion("1.4.2.0")] -[assembly: AssemblyFileVersion("1.4.2")] -[assembly: AssemblyInformationalVersion("1.4.2-ci00027-issue-324")] +[assembly: AssemblyVersion("1.5.0.0")] +[assembly: AssemblyFileVersion("1.5.0")] +[assembly: AssemblyInformationalVersion("1.5.0")] diff --git a/src/TestEngine/CommonEngineAssemblyInfo.cs b/src/TestEngine/CommonEngineAssemblyInfo.cs index 5567dc8dc..3cce1d422 100644 --- a/src/TestEngine/CommonEngineAssemblyInfo.cs +++ b/src/TestEngine/CommonEngineAssemblyInfo.cs @@ -21,6 +21,6 @@ [assembly: AssemblyConfiguration("Release")] #endif -[assembly: AssemblyVersion("1.4.2.0")] -[assembly: AssemblyFileVersion("1.4.2")] -[assembly: AssemblyInformationalVersion("1.4.2-ci00027-issue-324")] +[assembly: AssemblyVersion("1.5.0.0")] +[assembly: AssemblyFileVersion("1.5.0")] +[assembly: AssemblyInformationalVersion("1.5.0")]