From 99c18bade0bf2018f9409d47677ec623f89ce81d Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Fri, 2 Jan 2026 17:28:01 +0100 Subject: [PATCH 01/73] Add Cake.Frosting-based build utilities for streamlined task management - Introduced `BuildContext` for managing solution, Git root, and executed tasks. - Added foundational task templates (`BuildTask`, `CleanTask`, `RestoreTask`, etc.) and default implementations. - Included CakeHost extensions for task registration and setup. - Created sample project demonstrating the usage of custom tasks. - Updated solution file to include new `CakeBuild` projects and samples. --- Core.sln | 17 +++++ .../CakeBuildSample/CakeBuildSample.csproj | 14 ++++ samples/CakeBuildSample/Program.cs | 13 ++++ .../CreativeCoders.CakeBuild/BuildContext.cs | 50 +++++++++++++ .../CakeContextExtensions.cs | 28 ++++++++ .../CakeHostExtensions.cs | 70 +++++++++++++++++++ .../CreativeCoders.CakeBuild.csproj | 13 ++++ .../StaticGitVersion.cs | 40 +++++++++++ .../Tasks/Defaults/BuildTask.cs | 8 +++ .../Tasks/Defaults/CleanTask.cs | 7 ++ .../Tasks/Defaults/CodeCoverageTask.cs | 8 +++ .../Tasks/Defaults/NuGetPublishTask.cs | 8 +++ .../Tasks/Defaults/PackTask.cs | 8 +++ .../Tasks/Defaults/RestoreTask.cs | 8 +++ .../Tasks/Defaults/TestTask.cs | 8 +++ .../Tasks/FrostingTaskBase.cs | 14 ++++ .../Tasks/Templates/BuildTask.cs | 40 +++++++++++ .../Tasks/Templates/CleanTask.cs | 3 + .../Tasks/Templates/CodeCoverageTask.cs | 4 ++ .../Tasks/Templates/NuGetPublishTask.cs | 3 + .../Tasks/Templates/PackTask.cs | 4 ++ .../Tasks/Templates/RestoreTask.cs | 14 ++++ .../Tasks/Templates/TestTask.cs | 3 + 23 files changed, 385 insertions(+) create mode 100644 samples/CakeBuildSample/CakeBuildSample.csproj create mode 100644 samples/CakeBuildSample/Program.cs create mode 100755 source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs create mode 100755 source/CakeBuild/CreativeCoders.CakeBuild/CakeContextExtensions.cs create mode 100755 source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/CreativeCoders.CakeBuild.csproj create mode 100755 source/CakeBuild/CreativeCoders.CakeBuild/StaticGitVersion.cs create mode 100755 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/BuildTask.cs create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CleanTask.cs create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CodeCoverageTask.cs create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/NuGetPublishTask.cs create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/PackTask.cs create mode 100755 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/RestoreTask.cs create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/TestTask.cs create mode 100755 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs create mode 100755 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs create mode 100755 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs create mode 100755 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs create mode 100755 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/NuGetPublishTask.cs create mode 100755 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs create mode 100755 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/RestoreTask.cs create mode 100755 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs diff --git a/Core.sln b/Core.sln index dce7aa22..f017c0df 100644 --- a/Core.sln +++ b/Core.sln @@ -247,6 +247,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CliHostSampleApp", "samples EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CreativeCoders.Cli.Tests", "tests\CreativeCoders.Cli.Tests\CreativeCoders.Cli.Tests.csproj", "{FF482B6D-D459-413E-82E0-9175C44DA8BA}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CakeBuild", "CakeBuild", "{E8EF00ED-01FA-4F51-A668-5AF8B6C0F09E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CreativeCoders.CakeBuild", "source\CakeBuild\CreativeCoders.CakeBuild\CreativeCoders.CakeBuild.csproj", "{EB88412B-8523-4DA4-8FF9-CACECA0969E6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CakeBuildSample", "samples\CakeBuildSample\CakeBuildSample.csproj", "{58C01CB8-B65A-44FE-9BE0-22929CD474A2}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -571,6 +577,14 @@ Global {FF482B6D-D459-413E-82E0-9175C44DA8BA}.Debug|Any CPU.Build.0 = Debug|Any CPU {FF482B6D-D459-413E-82E0-9175C44DA8BA}.Release|Any CPU.ActiveCfg = Release|Any CPU {FF482B6D-D459-413E-82E0-9175C44DA8BA}.Release|Any CPU.Build.0 = Release|Any CPU + {EB88412B-8523-4DA4-8FF9-CACECA0969E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EB88412B-8523-4DA4-8FF9-CACECA0969E6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EB88412B-8523-4DA4-8FF9-CACECA0969E6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EB88412B-8523-4DA4-8FF9-CACECA0969E6}.Release|Any CPU.Build.0 = Release|Any CPU + {58C01CB8-B65A-44FE-9BE0-22929CD474A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {58C01CB8-B65A-44FE-9BE0-22929CD474A2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {58C01CB8-B65A-44FE-9BE0-22929CD474A2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {58C01CB8-B65A-44FE-9BE0-22929CD474A2}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -679,6 +693,9 @@ Global {ED92EBC6-C297-46AE-998B-155A26442AA5} = {CDCF2469-1668-4EB0-A73F-692115CF6776} {CA248700-A9E0-433E-98FE-4E1C6844811F} = {72E179CA-7AE6-412A-856D-7BD13838E8E3} {FF482B6D-D459-413E-82E0-9175C44DA8BA} = {5A3FFD14-2258-4007-AC77-BAFB3B3EB26F} + {E8EF00ED-01FA-4F51-A668-5AF8B6C0F09E} = {2A7105AA-05B6-469A-93F5-719723A4D90D} + {EB88412B-8523-4DA4-8FF9-CACECA0969E6} = {E8EF00ED-01FA-4F51-A668-5AF8B6C0F09E} + {58C01CB8-B65A-44FE-9BE0-22929CD474A2} = {72E179CA-7AE6-412A-856D-7BD13838E8E3} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {EE24476B-9A4C-4146-B982-3461FAF8B3B0} diff --git a/samples/CakeBuildSample/CakeBuildSample.csproj b/samples/CakeBuildSample/CakeBuildSample.csproj new file mode 100644 index 00000000..793be092 --- /dev/null +++ b/samples/CakeBuildSample/CakeBuildSample.csproj @@ -0,0 +1,14 @@ + + + + Exe + net10.0 + enable + enable + + + + + + + diff --git a/samples/CakeBuildSample/Program.cs b/samples/CakeBuildSample/Program.cs new file mode 100644 index 00000000..49fb91df --- /dev/null +++ b/samples/CakeBuildSample/Program.cs @@ -0,0 +1,13 @@ +using Cake.Frosting; + +namespace CakeBuildSample; + +internal static class Program +{ + static int Main(string[] args) + { + return new CakeHost() + .UseTaskSetup<>() + .Run(args); + } +} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs b/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs new file mode 100755 index 00000000..42a2741a --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs @@ -0,0 +1,50 @@ +using Cake.Common.Tools.GitVersion; +using Cake.Core; +using Cake.Core.IO; +using Cake.Frosting; + +namespace CreativeCoders.CakeBuild; + +public class BuildContext : FrostingContext +{ + private readonly List _executedTasks = []; + + public FilePath SolutionFile { get; set; } + + public GitVersion Version { get; set; } + + public DirectoryPath RootDir { get; set; } + + public IEnumerable ExecutedTasks => _executedTasks; + + public BuildContext(ICakeContext context) + : base(context) + { + RootDir = FindGitRootPath(context.Environment.WorkingDirectory) ?? + context.Environment.WorkingDirectory.GetParent(); + SolutionFile = context.Arguments.GetArgument("solution"); + } + + public void AddExecutedTask(IFrostingTask task) + { + _executedTasks.Add(task); + } + + private DirectoryPath? FindGitRootPath(DirectoryPath? startPath) + { + while (true) + { + if (startPath == null) + { + return null; + } + + if (FileSystem.Exist(startPath.Combine(".git"))) + { + return startPath; + } + + startPath = startPath.GetParent(); + } + } +} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/CakeContextExtensions.cs b/source/CakeBuild/CreativeCoders.CakeBuild/CakeContextExtensions.cs new file mode 100755 index 00000000..ab8ef18c --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/CakeContextExtensions.cs @@ -0,0 +1,28 @@ +using Cake.Common.Tools.GitVersion; +using Cake.Core; +using Cake.Frosting; + +namespace CreativeCoders.CakeBuild; + +public static class CakeContextExtensions +{ + public static bool TaskHasRun(this BuildContext context) + where TTask : IFrostingTask + { + return context.ExecutedTasks.Any(x => x.GetType() == typeof(TTask)); + } + + public static GitVersion GetGitVersionSafe(this ICakeContext context, + string? major = null, string? minor = null, string? patch = null, string? build = null, + GitVersionSettings? gitVersionSettings = null) + { + try + { + return context.GitVersion(); + } + catch (Exception) + { + return StaticGitVersion.Create(major ?? "0", minor ?? "0", patch ?? "0", build ?? "0", ""); + } + } +} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs b/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs new file mode 100755 index 00000000..91656e1e --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs @@ -0,0 +1,70 @@ +using System.Reflection; +using Cake.Frosting; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; + +namespace CreativeCoders.CakeBuild; + +public static class CakeHostExtensions +{ + public static CakeHost AddTask(this CakeHost host) + where TTask : class, IFrostingTask + { + return host.ConfigureServices(x => x.AddSingleton()); + } + + public static CakeHost AddTask(this CakeHost host, TTaskSettings taskSettings) + where TTask : class, IFrostingTask + where TTaskSettings : class + { + ArgumentNullException.ThrowIfNull(host); + + return host.ConfigureServices(x => + { + x.AddSingleton(); + + x.TryAddSingleton(taskSettings); + } + ); + } + + public static CakeHost AddTasks(this CakeHost host, params Type[] taskTypes) + { + ArgumentNullException.ThrowIfNull(host); + ArgumentNullException.ThrowIfNull(taskTypes); + + return host.ConfigureServices(x => + { + foreach (var taskType in taskTypes) + { + if (!typeof(IFrostingTask).IsAssignableFrom(taskType)) + { + throw new InvalidOperationException( + $"Type '{taskType.FullName}' does not implement '{nameof(IFrostingTask)}'."); + } + + x.AddSingleton(typeof(IFrostingTask), taskType); + } + }); + } + + public static CakeHost UseBuildSetup(this CakeHost host) + where TBuildSetup : class + { + host.ConfigureServices(services => services.AddSingleton()); + + foreach (var propertyInfo in typeof(TBuildSetup).GetProperties(BindingFlags.Public | + BindingFlags.Instance)) + { + host.ConfigureServices(services => services.AddSingleton(propertyInfo.PropertyType, sp => + { + var buildSetup = sp.GetRequiredService(); + + return propertyInfo.GetValue(buildSetup) ?? throw new InvalidOperationException( + $"Property '{propertyInfo.Name}' of BuildSetup '{typeof(TBuildSetup).FullName}' is null."); + })); + } + + return host; + } +} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/CreativeCoders.CakeBuild.csproj b/source/CakeBuild/CreativeCoders.CakeBuild/CreativeCoders.CakeBuild.csproj new file mode 100644 index 00000000..bc7d4b3d --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/CreativeCoders.CakeBuild.csproj @@ -0,0 +1,13 @@ + + + + net10.0 + enable + enable + + + + + + + diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/StaticGitVersion.cs b/source/CakeBuild/CreativeCoders.CakeBuild/StaticGitVersion.cs new file mode 100755 index 00000000..4af8d11f --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/StaticGitVersion.cs @@ -0,0 +1,40 @@ +using Cake.Common.Tools.GitVersion; + +namespace CreativeCoders.CakeBuild; + +public static class StaticGitVersion +{ + public static GitVersion Create(string major, string minor, string patch, string build, + string preReleaseTag) + { + var version = $"{major}.{minor}.{patch}.{build}"; + var versionWithPreRelease = string.IsNullOrWhiteSpace(preReleaseTag) + ? version + : $"{version}-{preReleaseTag}"; + + return new GitVersion + { + Major = int.Parse(major), + Minor = int.Parse(minor), + Patch = int.Parse(patch), + PreReleaseTag = preReleaseTag, + BuildMetaData = build, + AssemblySemVer = versionWithPreRelease, + FullSemVer = versionWithPreRelease, + AssemblySemFileVer = version, + BranchName = "unknown", + InformationalVersion = versionWithPreRelease, + MajorMinorPatch = $"{major}.{minor}.{patch}", + LegacySemVer = versionWithPreRelease, + NuGetVersion = versionWithPreRelease, + NuGetVersionV2 = versionWithPreRelease, + PreReleaseLabel = preReleaseTag, + SemVer = versionWithPreRelease, + NuGetPreReleaseTag = preReleaseTag, + NuGetPreReleaseTagV2 = preReleaseTag, + CommitDate = DateTimeOffset.Now.ToString(), + PreReleaseTagWithDash = $"-{preReleaseTag}", + PreReleaseLabelWithDash = $"-{preReleaseTag}", + }; + } +} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/BuildTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/BuildTask.cs new file mode 100755 index 00000000..aa756e91 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/BuildTask.cs @@ -0,0 +1,8 @@ +using Cake.Frosting; +using CreativeCoders.CakeBuild.Tasks.Templates; + +namespace CreativeCoders.CakeBuild.Tasks.Defaults; + +[TaskName("Build")] +[IsDependentOn(typeof(RestoreTask))] +public class BuildTask(BuildTaskSettings settings) : BuildTask(settings); diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CleanTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CleanTask.cs new file mode 100644 index 00000000..0fcad8f2 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CleanTask.cs @@ -0,0 +1,7 @@ +using Cake.Frosting; +using CreativeCoders.CakeBuild.Tasks.Templates; + +namespace CreativeCoders.CakeBuild.Tasks.Defaults; + +[TaskName("Build")] +public class CleanTask : CleanTask { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CodeCoverageTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CodeCoverageTask.cs new file mode 100644 index 00000000..7f979ecc --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CodeCoverageTask.cs @@ -0,0 +1,8 @@ +using Cake.Frosting; +using CreativeCoders.CakeBuild.Tasks.Templates; + +namespace CreativeCoders.CakeBuild.Tasks.Defaults; + +[TaskName("CodeCoverage")] +[IsDependentOn(typeof(TestTask))] +public class CodeCoverageTask : CodeCoverageTask { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/NuGetPublishTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/NuGetPublishTask.cs new file mode 100644 index 00000000..e401e7b8 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/NuGetPublishTask.cs @@ -0,0 +1,8 @@ +using Cake.Frosting; +using CreativeCoders.CakeBuild.Tasks.Templates; + +namespace CreativeCoders.CakeBuild.Tasks.Defaults; + +[TaskName("NuGetPublish")] +[IsDependentOn(typeof(PackTask))] +public class NuGetPublishTask : NuGetPublishTask { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/PackTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/PackTask.cs new file mode 100644 index 00000000..7ccadcbf --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/PackTask.cs @@ -0,0 +1,8 @@ +using Cake.Frosting; +using CreativeCoders.CakeBuild.Tasks.Templates; + +namespace CreativeCoders.CakeBuild.Tasks.Defaults; + +[TaskName("Pack")] +[IsDependentOn(typeof(CodeCoverageTask))] +public class PackTask : PackTask { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/RestoreTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/RestoreTask.cs new file mode 100755 index 00000000..62a60423 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/RestoreTask.cs @@ -0,0 +1,8 @@ +using Cake.Frosting; +using CreativeCoders.CakeBuild.Tasks.Templates; + +namespace CreativeCoders.CakeBuild.Tasks.Defaults; + +[TaskName("Restore")] +[IsDependentOn(typeof(CleanTask))] +public class RestoreTask : RestoreTask; diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/TestTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/TestTask.cs new file mode 100644 index 00000000..288f4098 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/TestTask.cs @@ -0,0 +1,8 @@ +using Cake.Frosting; +using CreativeCoders.CakeBuild.Tasks.Templates; + +namespace CreativeCoders.CakeBuild.Tasks.Defaults; + +[TaskName("Test")] +[IsDependentOn(typeof(BuildTask))] +public class TestTask : TestTask { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs new file mode 100755 index 00000000..4ced8fdc --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs @@ -0,0 +1,14 @@ +using Cake.Frosting; + +namespace CreativeCoders.CakeBuild.Tasks; + +public class FrostingTaskBase : AsyncFrostingTask + where T : BuildContext +{ + public override void Finally(T context) + { + base.Finally(context); + + context.AddExecutedTask(this); + } +} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs new file mode 100755 index 00000000..df3b396b --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs @@ -0,0 +1,40 @@ +using Cake.Common.Tools.DotNet; +using Cake.Common.Tools.DotNet.Build; +using Cake.Core.Diagnostics; + +namespace CreativeCoders.CakeBuild.Tasks.Templates; + +public class BuildTask(BuildTaskSettings settings) : FrostingTaskBase + where T : BuildContext +{ + protected virtual void ApplyDotNetBuildSettings(DotNetBuildSettings dotNetBuildSettings) { } + + private DotNetBuildSettings CreateDotNetBuildSettings() + { + var dotNetBuildSettings = new DotNetBuildSettings + { + Configuration = settings.Configuration + }; + + ApplyDotNetBuildSettings(dotNetBuildSettings); + + return dotNetBuildSettings; + } + + public override Task RunAsync(T context) + { + var dotnetSettings = CreateDotNetBuildSettings(); + + context.Log.Information("Building solution {0} with configuration {1}", + context.SolutionFile.FullPath, dotnetSettings.Configuration); + + context.DotNetBuild(context.SolutionFile.FullPath, dotnetSettings); + + return Task.CompletedTask; + } +} + +public class BuildTaskSettings +{ + public string? Configuration { get; set; } +} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs new file mode 100755 index 00000000..bf4b0f9d --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs @@ -0,0 +1,3 @@ +namespace CreativeCoders.CakeBuild.Tasks.Templates; + +public class CleanTask : FrostingTaskBase where T : BuildContext { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs new file mode 100755 index 00000000..526c0750 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs @@ -0,0 +1,4 @@ +namespace CreativeCoders.CakeBuild.Tasks.Templates; + +public class CodeCoverageTask : FrostingTaskBase + where T : BuildContext { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/NuGetPublishTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/NuGetPublishTask.cs new file mode 100755 index 00000000..504b9af0 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/NuGetPublishTask.cs @@ -0,0 +1,3 @@ +namespace CreativeCoders.CakeBuild.Tasks.Templates; + +public class NuGetPublishTask : FrostingTaskBase where T : BuildContext { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs new file mode 100755 index 00000000..7a24f6ab --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs @@ -0,0 +1,4 @@ +namespace CreativeCoders.CakeBuild.Tasks.Templates; + +public class PackTask : FrostingTaskBase + where T : BuildContext { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/RestoreTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/RestoreTask.cs new file mode 100755 index 00000000..c4ece690 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/RestoreTask.cs @@ -0,0 +1,14 @@ +using Cake.Common.Tools.DotNet; + +namespace CreativeCoders.CakeBuild.Tasks.Templates; + +public class RestoreTask : FrostingTaskBase + where T : BuildContext +{ + public override Task RunAsync(T context) + { + context.DotNetRestore(context.RootDir.FullPath); + + return Task.CompletedTask; + } +} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs new file mode 100755 index 00000000..377389f6 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs @@ -0,0 +1,3 @@ +namespace CreativeCoders.CakeBuild.Tasks.Templates; + +public class TestTask : FrostingTaskBase where T : BuildContext { } From 0dccfa21aa26685bbf05b4ba02e20f4b8fa80193 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Fri, 2 Jan 2026 18:26:23 +0100 Subject: [PATCH 02/73] Add support for solution file auto-detection, build configuration, and context initialization improvements - Renamed `CleanTask` to properly align task names with functionality. - Enhanced `BuildContext` to include solution file auto-detection, default build configuration, and Git version integration. - Simplified `BuildTask` templates and adjusted configuration handling. - Updated `CakeHost` sample with task registration and streamlined workflow. - Refactored project files for consistent dependencies and task integration. --- Core.sln | 3 +- .../CakeBuildSample/CakeBuildSample.csproj | 4 ++ samples/CakeBuildSample/Program.cs | 7 +++- .../CreativeCoders.CakeBuild/BuildContext.cs | 41 ++++++++++++++++++- .../CakeContextExtensions.cs | 2 +- .../CreativeCoders.CakeBuild.csproj | 4 ++ .../Tasks/Defaults/BuildTask.cs | 2 +- .../Tasks/Defaults/CleanTask.cs | 2 +- .../Tasks/Templates/BuildTask.cs | 22 +++++++--- 9 files changed, 73 insertions(+), 14 deletions(-) diff --git a/Core.sln b/Core.sln index f017c0df..da034e61 100644 --- a/Core.sln +++ b/Core.sln @@ -582,9 +582,8 @@ Global {EB88412B-8523-4DA4-8FF9-CACECA0969E6}.Release|Any CPU.ActiveCfg = Release|Any CPU {EB88412B-8523-4DA4-8FF9-CACECA0969E6}.Release|Any CPU.Build.0 = Release|Any CPU {58C01CB8-B65A-44FE-9BE0-22929CD474A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {58C01CB8-B65A-44FE-9BE0-22929CD474A2}.Debug|Any CPU.Build.0 = Debug|Any CPU {58C01CB8-B65A-44FE-9BE0-22929CD474A2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {58C01CB8-B65A-44FE-9BE0-22929CD474A2}.Release|Any CPU.Build.0 = Release|Any CPU + {58C01CB8-B65A-44FE-9BE0-22929CD474A2}.Debug|Any CPU.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/samples/CakeBuildSample/CakeBuildSample.csproj b/samples/CakeBuildSample/CakeBuildSample.csproj index 793be092..ec82a3ec 100644 --- a/samples/CakeBuildSample/CakeBuildSample.csproj +++ b/samples/CakeBuildSample/CakeBuildSample.csproj @@ -11,4 +11,8 @@ + + + + diff --git a/samples/CakeBuildSample/Program.cs b/samples/CakeBuildSample/Program.cs index 49fb91df..557737fc 100644 --- a/samples/CakeBuildSample/Program.cs +++ b/samples/CakeBuildSample/Program.cs @@ -1,4 +1,6 @@ using Cake.Frosting; +using CreativeCoders.CakeBuild; +using CreativeCoders.CakeBuild.Tasks.Defaults; namespace CakeBuildSample; @@ -7,7 +9,10 @@ internal static class Program static int Main(string[] args) { return new CakeHost() - .UseTaskSetup<>() + .UseContext() + .AddTask() + .AddTask() + .AddTask() .Run(args); } } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs b/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs index 42a2741a..f0c0bb6b 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs @@ -1,7 +1,9 @@ -using Cake.Common.Tools.GitVersion; +using Cake.Common.Diagnostics; +using Cake.Common.Tools.GitVersion; using Cake.Core; using Cake.Core.IO; using Cake.Frosting; +using CreativeCoders.Core.IO; namespace CreativeCoders.CakeBuild; @@ -15,6 +17,8 @@ public class BuildContext : FrostingContext public DirectoryPath RootDir { get; set; } + public string BuildConfiguration { get; set; } = "Release"; + public IEnumerable ExecutedTasks => _executedTasks; public BuildContext(ICakeContext context) @@ -22,7 +26,40 @@ public BuildContext(ICakeContext context) { RootDir = FindGitRootPath(context.Environment.WorkingDirectory) ?? context.Environment.WorkingDirectory.GetParent(); - SolutionFile = context.Arguments.GetArgument("solution"); + + var solutionsFilePath = context.Arguments.GetArgument("solution"); + SolutionFile = string.IsNullOrWhiteSpace(solutionsFilePath) + ? FindRootSolution(context) + : new FilePath(solutionsFilePath); + + Version = context.GetGitVersionSafe(); + } + + private FilePath FindRootSolution(ICakeContext context) + { + var solutionsFiles = + FileSys.Directory.EnumerateFiles(RootDir.FullPath, "*.sln", SearchOption.AllDirectories); + + var solutionsSlnxFiles = + FileSys.Directory.EnumerateFiles(RootDir.FullPath, "*.slnx", SearchOption.AllDirectories); + + var solutions = solutionsFiles.Concat(solutionsSlnxFiles).ToArray(); + + if (solutions.Length > 1) + { + context.Error("Multiple solution files found."); + } + + var solution = solutions.FirstOrDefault(); + + if (solution == null) + { + context.Error("No solution file found."); + + throw new InvalidOperationException("No solution file found"); + } + + return solution; } public void AddExecutedTask(IFrostingTask task) diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/CakeContextExtensions.cs b/source/CakeBuild/CreativeCoders.CakeBuild/CakeContextExtensions.cs index ab8ef18c..90ed095e 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/CakeContextExtensions.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/CakeContextExtensions.cs @@ -22,7 +22,7 @@ public static GitVersion GetGitVersionSafe(this ICakeContext context, } catch (Exception) { - return StaticGitVersion.Create(major ?? "0", minor ?? "0", patch ?? "0", build ?? "0", ""); + return StaticGitVersion.Create(major ?? "0", minor ?? "0", patch ?? "0", build ?? "1", ""); } } } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/CreativeCoders.CakeBuild.csproj b/source/CakeBuild/CreativeCoders.CakeBuild/CreativeCoders.CakeBuild.csproj index bc7d4b3d..69c651f0 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/CreativeCoders.CakeBuild.csproj +++ b/source/CakeBuild/CreativeCoders.CakeBuild/CreativeCoders.CakeBuild.csproj @@ -10,4 +10,8 @@ + + + + diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/BuildTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/BuildTask.cs index aa756e91..814d08c1 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/BuildTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/BuildTask.cs @@ -5,4 +5,4 @@ namespace CreativeCoders.CakeBuild.Tasks.Defaults; [TaskName("Build")] [IsDependentOn(typeof(RestoreTask))] -public class BuildTask(BuildTaskSettings settings) : BuildTask(settings); +public class BuildTask() : BuildTask(); diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CleanTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CleanTask.cs index 0fcad8f2..43fcf543 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CleanTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CleanTask.cs @@ -3,5 +3,5 @@ namespace CreativeCoders.CakeBuild.Tasks.Defaults; -[TaskName("Build")] +[TaskName("Clean")] public class CleanTask : CleanTask { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs index df3b396b..5c5f568a 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs @@ -1,29 +1,39 @@ using Cake.Common.Tools.DotNet; using Cake.Common.Tools.DotNet.Build; +using Cake.Common.Tools.DotNet.MSBuild; using Cake.Core.Diagnostics; +using JetBrains.Annotations; namespace CreativeCoders.CakeBuild.Tasks.Templates; -public class BuildTask(BuildTaskSettings settings) : FrostingTaskBase +[PublicAPI] +public class BuildTask() : FrostingTaskBase where T : BuildContext { - protected virtual void ApplyDotNetBuildSettings(DotNetBuildSettings dotNetBuildSettings) { } + protected virtual void ApplyDotNetBuildSettings(T context, DotNetBuildSettings dotNetBuildSettings) { } - private DotNetBuildSettings CreateDotNetBuildSettings() + private DotNetBuildSettings CreateDotNetBuildSettings(T context) { var dotNetBuildSettings = new DotNetBuildSettings { - Configuration = settings.Configuration + Configuration = context.BuildConfiguration, + NoRestore = true, + MSBuildSettings = new DotNetMSBuildSettings + { + InformationalVersion = context.Version.InformationalVersion, + AssemblyVersion = context.Version.AssemblySemVer, + FileVersion = context.Version.AssemblySemFileVer + } }; - ApplyDotNetBuildSettings(dotNetBuildSettings); + ApplyDotNetBuildSettings(context, dotNetBuildSettings); return dotNetBuildSettings; } public override Task RunAsync(T context) { - var dotnetSettings = CreateDotNetBuildSettings(); + var dotnetSettings = CreateDotNetBuildSettings(context); context.Log.Information("Building solution {0} with configuration {1}", context.SolutionFile.FullPath, dotnetSettings.Configuration); From 8ca81bd7ee4cea45de5740c2eea59ddb847e99cd Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Fri, 2 Jan 2026 18:46:43 +0100 Subject: [PATCH 03/73] Update `CakeContextExtensions` to include exception variable in catch block for improved diagnostics, and refine `GitVersion.yml` configuration - Replace `tag` with `label` for branch definitions. - Adjust formatting for improved YAML readability. --- GitVersion.yml | 79 ++++++++----------- .../CakeContextExtensions.cs | 2 +- 2 files changed, 33 insertions(+), 48 deletions(-) diff --git a/GitVersion.yml b/GitVersion.yml index 7d2adb2e..496a653f 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -8,111 +8,96 @@ mode: ContinuousDeployment branches: feature: mode: ContinuousDeployment - tag: feature.{BranchName} + label: feature.{BranchName} increment: Minor - prevent-increment-of-merged-branch-version: false track-merge-target: false regex: ^features?[/-] source-branches: - - develop - - main - - release - - feature - - support - - hotfix + - develop + - main + - release + - feature + - support + - hotfix tracks-release-branches: false is-release-branch: false - is-mainline: false pre-release-weight: 30000 main: mode: ContinuousDeployment - tag: '' + label: '' increment: Patch - prevent-increment-of-merged-branch-version: true track-merge-target: false regex: ^master$|^main$ source-branches: - - develop - - release + - develop + - release tracks-release-branches: false is-release-branch: false - is-mainline: true pre-release-weight: 55000 develop: mode: ContinuousDeployment - tag: alpha + label: alpha increment: Minor - prevent-increment-of-merged-branch-version: false track-merge-target: true regex: ^dev(elop)?(ment)?$ - source-branches: [] + source-branches: [ ] tracks-release-branches: true is-release-branch: false - is-mainline: false pre-release-weight: 0 release: mode: ContinuousDeployment - tag: beta + label: beta increment: None - prevent-increment-of-merged-branch-version: true track-merge-target: false regex: ^releases?[/-] source-branches: - - develop - - main - - support - - release + - develop + - main + - support + - release tracks-release-branches: false is-release-branch: true - is-mainline: false pre-release-weight: 30000 pull-request: mode: ContinuousDeployment - tag: PullRequest + label: PullRequest increment: Inherit - prevent-increment-of-merged-branch-version: false - tag-number-pattern: '[/-](?\d+)' track-merge-target: false regex: ^(pull|pull\-requests|pr)[/-] source-branches: - - develop - - main - - release - - feature - - support - - hotfix + - develop + - main + - release + - feature + - support + - hotfix tracks-release-branches: false is-release-branch: false - is-mainline: false pre-release-weight: 30000 hotfix: mode: ContinuousDeployment - tag: beta + label: beta increment: Patch - prevent-increment-of-merged-branch-version: false track-merge-target: false regex: ^hotfix(es)?[/-] source-branches: - - develop - - main - - support + - develop + - main + - support tracks-release-branches: false is-release-branch: false - is-mainline: false pre-release-weight: 30000 support: mode: ContinuousDeployment - tag: '' + label: '' increment: Patch - prevent-increment-of-merged-branch-version: true track-merge-target: false regex: ^support[/-] source-branches: - - main + - main tracks-release-branches: false is-release-branch: false - is-mainline: true pre-release-weight: 55000 ignore: - sha: [] -merge-message-formats: {} + sha: [ ] +merge-message-formats: { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/CakeContextExtensions.cs b/source/CakeBuild/CreativeCoders.CakeBuild/CakeContextExtensions.cs index 90ed095e..af61d656 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/CakeContextExtensions.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/CakeContextExtensions.cs @@ -20,7 +20,7 @@ public static GitVersion GetGitVersionSafe(this ICakeContext context, { return context.GitVersion(); } - catch (Exception) + catch (Exception e) { return StaticGitVersion.Create(major ?? "0", minor ?? "0", patch ?? "0", build ?? "1", ""); } From 9f0dd9fa9b15f728f2c88527860faf48f18137da Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 3 Jan 2026 11:58:26 +0100 Subject: [PATCH 04/73] Simplify `GitVersion.yml` by removing unused branch configurations and redundant properties. --- GitVersion.yml | 39 --------------------------------------- 1 file changed, 39 deletions(-) diff --git a/GitVersion.yml b/GitVersion.yml index 496a653f..6460f715 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -13,12 +13,7 @@ branches: track-merge-target: false regex: ^features?[/-] source-branches: - - develop - main - - release - - feature - - support - - hotfix tracks-release-branches: false is-release-branch: false pre-release-weight: 30000 @@ -34,16 +29,6 @@ branches: tracks-release-branches: false is-release-branch: false pre-release-weight: 55000 - develop: - mode: ContinuousDeployment - label: alpha - increment: Minor - track-merge-target: true - regex: ^dev(elop)?(ment)?$ - source-branches: [ ] - tracks-release-branches: true - is-release-branch: false - pre-release-weight: 0 release: mode: ContinuousDeployment label: beta @@ -74,30 +59,6 @@ branches: tracks-release-branches: false is-release-branch: false pre-release-weight: 30000 - hotfix: - mode: ContinuousDeployment - label: beta - increment: Patch - track-merge-target: false - regex: ^hotfix(es)?[/-] - source-branches: - - develop - - main - - support - tracks-release-branches: false - is-release-branch: false - pre-release-weight: 30000 - support: - mode: ContinuousDeployment - label: '' - increment: Patch - track-merge-target: false - regex: ^support[/-] - source-branches: - - main - tracks-release-branches: false - is-release-branch: false - pre-release-weight: 55000 ignore: sha: [ ] merge-message-formats: { } From 4b3e5c210c3f6668e25e7d90ad2770ef34f84e98 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 3 Jan 2026 12:04:34 +0100 Subject: [PATCH 05/73] Update `GitVersion.yml` configuration for enhanced semantic versioning - Added `tag-prefix` and `semantic-version-format` properties for improved version tagging. - Simplified branch definitions by removing unused branches (`develop`, `support`, `hotfix`). - Adjusted `pull-request` label from `PullRequest` to `PR`. --- GitVersion.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/GitVersion.yml b/GitVersion.yml index 6460f715..e554e6f6 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -1,5 +1,7 @@ assembly-versioning-scheme: MajorMinorPatch assembly-file-versioning-scheme: MajorMinorPatchTag +tag-prefix: '^v?' +semantic-version-format: Loose major-version-bump-message: '\+semver:\s?(breaking|major)' minor-version-bump-message: '\+semver:\s?(feature|minor)' patch-version-bump-message: '\+semver:\s?(fix|patch)' @@ -36,26 +38,21 @@ branches: track-merge-target: false regex: ^releases?[/-] source-branches: - - develop - main - - support - release tracks-release-branches: false is-release-branch: true pre-release-weight: 30000 pull-request: mode: ContinuousDeployment - label: PullRequest + label: PR increment: Inherit track-merge-target: false regex: ^(pull|pull\-requests|pr)[/-] source-branches: - - develop - main - release - feature - - support - - hotfix tracks-release-branches: false is-release-branch: false pre-release-weight: 30000 From f2f42af96a85d8c3b55e3f85addd43206f07a052 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 3 Jan 2026 12:13:50 +0100 Subject: [PATCH 06/73] Enhance `CleanTask` to clean solution builds - Implement `RunAsync` method, invoking `DotNetClean` and deleting `bin`/`obj` directories. - Introduce private `DeleteDirectories` method to simplify directory cleanup logic with glob patterns and logging. --- .../Tasks/Templates/CleanTask.cs | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs index bf4b0f9d..e70e1514 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs @@ -1,3 +1,28 @@ -namespace CreativeCoders.CakeBuild.Tasks.Templates; +using Cake.Common.Diagnostics; +using Cake.Common.Tools.DotNet; +using Cake.Core.IO; -public class CleanTask : FrostingTaskBase where T : BuildContext { } +namespace CreativeCoders.CakeBuild.Tasks.Templates; + +public class CleanTask : FrostingTaskBase where T : BuildContext +{ + public override async Task RunAsync(T context) + { + context.DotNetClean(context.SolutionFile.FullPath); + + DeleteDirectories(context, context.RootDir.FullPath + "/**/bin"); + DeleteDirectories(context, context.RootDir.FullPath + "/**/obj"); + } + + private static void DeleteDirectories(T context, string globPattern) + { + var dirs = context.Globber.Match(globPattern).OfType(); + + foreach (var dir in dirs) + { + context.Information("Deleting directory '{0}'", dir); + + context.FileSystem.GetDirectory(dir).Delete(true); + } + } +} From 74d58ea381b12c74bc01af0c7a8470c321f0eb88 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 3 Jan 2026 12:14:19 +0100 Subject: [PATCH 07/73] Add missing `using` directives for `System.Linq` and `System.Threading.Tasks` in `CleanTask` --- .../CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs index e70e1514..6a8a1ef5 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs @@ -1,4 +1,6 @@ -using Cake.Common.Diagnostics; +using System.Linq; +using System.Threading.Tasks; +using Cake.Common.Diagnostics; using Cake.Common.Tools.DotNet; using Cake.Core.IO; From ce43349d8d2af4a2c9bdc246b056de1b145ad7bd Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 3 Jan 2026 12:22:38 +0100 Subject: [PATCH 08/73] Add `HasExecutedTask` method to `BuildContext` and integrate with `BuildTask` for conditional `NoRestore` handling --- .../CreativeCoders.CakeBuild/BuildContext.cs | 11 ++++++++++- .../Tasks/Templates/BuildTask.cs | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs b/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs index f0c0bb6b..bed79e01 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs @@ -1,4 +1,8 @@ -using Cake.Common.Diagnostics; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Cake.Common.Diagnostics; using Cake.Common.Tools.GitVersion; using Cake.Core; using Cake.Core.IO; @@ -67,6 +71,11 @@ public void AddExecutedTask(IFrostingTask task) _executedTasks.Add(task); } + public bool HasExecutedTask(Type taskType) + { + return _executedTasks.Any(x => x.GetType().IsAssignableTo(taskType)); + } + private DirectoryPath? FindGitRootPath(DirectoryPath? startPath) { while (true) diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs index 5c5f568a..fc7b0c93 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs @@ -17,7 +17,7 @@ private DotNetBuildSettings CreateDotNetBuildSettings(T context) var dotNetBuildSettings = new DotNetBuildSettings { Configuration = context.BuildConfiguration, - NoRestore = true, + NoRestore = context.HasExecutedTask(typeof(RestoreTask)), MSBuildSettings = new DotNetMSBuildSettings { InformationalVersion = context.Version.InformationalVersion, From d2204ca2c2a2303871d2fbd35fe89ec5c2e06148 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 3 Jan 2026 12:23:02 +0100 Subject: [PATCH 09/73] Add missing `using System.Threading.Tasks` directive in `BuildTask` --- .../CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs index fc7b0c93..3e9e8696 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs @@ -1,4 +1,5 @@ -using Cake.Common.Tools.DotNet; +using System.Threading.Tasks; +using Cake.Common.Tools.DotNet; using Cake.Common.Tools.DotNet.Build; using Cake.Common.Tools.DotNet.MSBuild; using Cake.Core.Diagnostics; From 1fce0aa66f4d3380dc5c8fc8b7b76be667d0ac3b Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 3 Jan 2026 12:23:27 +0100 Subject: [PATCH 10/73] Add missing `using System.Threading.Tasks` directive in `RestoreTask` --- .../CreativeCoders.CakeBuild/Tasks/Templates/RestoreTask.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/RestoreTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/RestoreTask.cs index c4ece690..e24f0be9 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/RestoreTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/RestoreTask.cs @@ -1,4 +1,5 @@ -using Cake.Common.Tools.DotNet; +using System.Threading.Tasks; +using Cake.Common.Tools.DotNet; namespace CreativeCoders.CakeBuild.Tasks.Templates; From 39380ff6f709f8b4c5b0384e8f357e98eb047cf2 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 3 Jan 2026 12:28:32 +0100 Subject: [PATCH 11/73] Log `NoRestore` setting in `BuildTask` for enhanced diagnostics when skipping restores --- .../CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs index 3e9e8696..b964f88e 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs @@ -1,4 +1,5 @@ using System.Threading.Tasks; +using Cake.Common.Diagnostics; using Cake.Common.Tools.DotNet; using Cake.Common.Tools.DotNet.Build; using Cake.Common.Tools.DotNet.MSBuild; @@ -29,6 +30,11 @@ private DotNetBuildSettings CreateDotNetBuildSettings(T context) ApplyDotNetBuildSettings(context, dotNetBuildSettings); + if (dotNetBuildSettings.NoRestore) + { + context.Information("Skip restore"); + } + return dotNetBuildSettings; } From cc302bde0d8adde9888f35f31c40c96cf8c844d7 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 3 Jan 2026 16:06:35 +0100 Subject: [PATCH 12/73] Add settings interfaces for task templates and refactor `BuildContext` - Introduce settings interfaces for task templates (`ICleanTaskSettings`, `ITestTaskSettings`, etc.). - Refactor `BuildContext` to enhance modularity and reuse of Git root path logic. - Add `UseBuildSetup` integration to `CakeHost` for streamlined build setup logic. --- samples/CakeBuildSample/BuildSetup.cs | 11 ++++ samples/CakeBuildSample/Program.cs | 1 + .../CreativeCoders.CakeBuild/BuildContext.cs | 66 +++++++++---------- .../CakeHostExtensions.cs | 2 + .../Tasks/Defaults/DefaultBuildSetup.cs | 5 ++ .../Tasks/Templates/Settings/IBuildPaths.cs | 34 ++++++++++ .../Templates/Settings/IBuildTaskSettings.cs | 3 + .../Templates/Settings/ICakeBuildSettings.cs | 8 +++ .../Templates/Settings/ICleanTaskSettings.cs | 3 + .../Settings/ICodeCoverageTaskSettings.cs | 3 + .../Settings/INuGetPublishTaskSettings.cs | 3 + .../Templates/Settings/IPackTaskSettings.cs | 6 ++ .../Templates/Settings/ITestTaskSettings.cs | 6 ++ 13 files changed, 118 insertions(+), 33 deletions(-) create mode 100644 samples/CakeBuildSample/BuildSetup.cs create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/DefaultBuildSetup.cs create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildPaths.cs create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildTaskSettings.cs create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICakeBuildSettings.cs create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICodeCoverageTaskSettings.cs create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/INuGetPublishTaskSettings.cs create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IPackTaskSettings.cs create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ITestTaskSettings.cs diff --git a/samples/CakeBuildSample/BuildSetup.cs b/samples/CakeBuildSample/BuildSetup.cs new file mode 100644 index 00000000..f5e725c5 --- /dev/null +++ b/samples/CakeBuildSample/BuildSetup.cs @@ -0,0 +1,11 @@ +using Cake.Core; +using Cake.Core.IO; +using CreativeCoders.CakeBuild.Tasks.Defaults; +using CreativeCoders.CakeBuild.Tasks.Templates.Settings; + +namespace CakeBuildSample; + +public class BuildSetup(ICakeContext context) : IDefaultBuildSetup +{ + public ICakeContext Context { get; } = context; +} diff --git a/samples/CakeBuildSample/Program.cs b/samples/CakeBuildSample/Program.cs index 557737fc..b8997b3c 100644 --- a/samples/CakeBuildSample/Program.cs +++ b/samples/CakeBuildSample/Program.cs @@ -10,6 +10,7 @@ static int Main(string[] args) { return new CakeHost() .UseContext() + .UseBuildSetup() .AddTask() .AddTask() .AddTask() diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs b/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs index bed79e01..08ef4b6d 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs @@ -1,30 +1,18 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using Cake.Common.Diagnostics; +using Cake.Common.Diagnostics; using Cake.Common.Tools.GitVersion; using Cake.Core; using Cake.Core.IO; using Cake.Frosting; using CreativeCoders.Core.IO; +using JetBrains.Annotations; namespace CreativeCoders.CakeBuild; +[PublicAPI] public class BuildContext : FrostingContext { private readonly List _executedTasks = []; - public FilePath SolutionFile { get; set; } - - public GitVersion Version { get; set; } - - public DirectoryPath RootDir { get; set; } - - public string BuildConfiguration { get; set; } = "Release"; - - public IEnumerable ExecutedTasks => _executedTasks; - public BuildContext(ICakeContext context) : base(context) { @@ -39,6 +27,24 @@ public BuildContext(ICakeContext context) Version = context.GetGitVersionSafe(); } + private DirectoryPath? FindGitRootPath(DirectoryPath? startPath) + { + while (true) + { + if (startPath == null) + { + return null; + } + + if (FileSystem.Exist(startPath.Combine(".git"))) + { + return startPath; + } + + startPath = startPath.GetParent(); + } + } + private FilePath FindRootSolution(ICakeContext context) { var solutionsFiles = @@ -66,6 +72,18 @@ private FilePath FindRootSolution(ICakeContext context) return solution; } + public FilePath SolutionFile { get; set; } + + public GitVersion Version { get; set; } + + public DirectoryPath RootDir { get; set; } + + public DirectoryPath ArtifactsDir => RootDir.Combine(".artifacts"); + + public string BuildConfiguration { get; set; } = "Release"; + + public IList ExecutedTasks => _executedTasks; + public void AddExecutedTask(IFrostingTask task) { _executedTasks.Add(task); @@ -75,22 +93,4 @@ public bool HasExecutedTask(Type taskType) { return _executedTasks.Any(x => x.GetType().IsAssignableTo(taskType)); } - - private DirectoryPath? FindGitRootPath(DirectoryPath? startPath) - { - while (true) - { - if (startPath == null) - { - return null; - } - - if (FileSystem.Exist(startPath.Combine(".git"))) - { - return startPath; - } - - startPath = startPath.GetParent(); - } - } } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs b/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs index 91656e1e..992b62c7 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs @@ -1,10 +1,12 @@ using System.Reflection; using Cake.Frosting; +using JetBrains.Annotations; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; namespace CreativeCoders.CakeBuild; +[PublicAPI] public static class CakeHostExtensions { public static CakeHost AddTask(this CakeHost host) diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/DefaultBuildSetup.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/DefaultBuildSetup.cs new file mode 100644 index 00000000..8b01cdf0 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/DefaultBuildSetup.cs @@ -0,0 +1,5 @@ +using CreativeCoders.CakeBuild.Tasks.Templates.Settings; + +namespace CreativeCoders.CakeBuild.Tasks.Defaults; + +public interface IDefaultBuildSetup : IBuildPaths { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildPaths.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildPaths.cs new file mode 100644 index 00000000..0a938364 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildPaths.cs @@ -0,0 +1,34 @@ +using Cake.Core; +using Cake.Core.IO; + +namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; + +public interface IBuildPaths : ICakeBuildSettings +{ + DirectoryPath RootDir => FindGitRootPath(Context.Environment.WorkingDirectory) ?? + Context.Environment.WorkingDirectory.GetParent(); + + DirectoryPath ArtifactsDir => RootDir.Combine(".artifacts"); + + DirectoryPath TestOutputBasePath => RootDir.Combine(".tests"); + + DirectoryPath CodeCoverageResultsDir => TestOutputBasePath.Combine("coverage-results"); + + DirectoryPath? FindGitRootPath(DirectoryPath? startPath) + { + while (true) + { + if (startPath == null) + { + return null; + } + + if (this.Context.FileSystem.Exist(startPath.Combine(".git"))) + { + return startPath; + } + + startPath = startPath.GetParent(); + } + } +} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildTaskSettings.cs new file mode 100644 index 00000000..de5000a0 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildTaskSettings.cs @@ -0,0 +1,3 @@ +namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; + +public interface IBuildTaskSettings { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICakeBuildSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICakeBuildSettings.cs new file mode 100644 index 00000000..163a665c --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICakeBuildSettings.cs @@ -0,0 +1,8 @@ +using Cake.Core; + +namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; + +public interface ICakeBuildSettings +{ + ICakeContext Context { get; } +} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs new file mode 100644 index 00000000..dde55470 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs @@ -0,0 +1,3 @@ +namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; + +public interface ICleanTaskSettings { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICodeCoverageTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICodeCoverageTaskSettings.cs new file mode 100644 index 00000000..b73dc58d --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICodeCoverageTaskSettings.cs @@ -0,0 +1,3 @@ +namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; + +public interface ICodeCoverageTaskSettings { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/INuGetPublishTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/INuGetPublishTaskSettings.cs new file mode 100644 index 00000000..068640e6 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/INuGetPublishTaskSettings.cs @@ -0,0 +1,3 @@ +namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; + +public interface INuGetPublishTaskSettings { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IPackTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IPackTaskSettings.cs new file mode 100644 index 00000000..34422095 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IPackTaskSettings.cs @@ -0,0 +1,6 @@ +namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; + +public interface IPackTaskSettings +{ + +} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ITestTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ITestTaskSettings.cs new file mode 100644 index 00000000..c52c8325 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ITestTaskSettings.cs @@ -0,0 +1,6 @@ +namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; + +public interface ITestTaskSettings +{ + +} From 1b9124d608b068f5b321c7a2de4fa978dba6aef7 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 3 Jan 2026 20:18:53 +0100 Subject: [PATCH 13/73] - Fix null reference in `IBuildPaths` by removing redundant `this` qualifier - Update `GitVersion.Tool` to version `6.5.1` in build project dependencies --- build/_build.csproj | 4 ++-- .../Tasks/Templates/Settings/IBuildPaths.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build/_build.csproj b/build/_build.csproj index 3cd974b1..c76d93b9 100644 --- a/build/_build.csproj +++ b/build/_build.csproj @@ -13,8 +13,8 @@ - - + + diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildPaths.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildPaths.cs index 0a938364..53371624 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildPaths.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildPaths.cs @@ -23,7 +23,7 @@ public interface IBuildPaths : ICakeBuildSettings return null; } - if (this.Context.FileSystem.Exist(startPath.Combine(".git"))) + if (Context.FileSystem.Exist(startPath.Combine(".git"))) { return startPath; } From 2bc0074d0617260f18cf9a31402402a6ef9a0701 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 3 Jan 2026 20:26:20 +0100 Subject: [PATCH 14/73] Update GitHub Actions workflow: bump `actions/checkout` to v5 and adjust deploy step - Upgraded `actions/checkout` to version 5 for compatibility. - Commented out caching and artifact upload steps. - Modified the `DeployNuGet` step to run a specific build command within the `CakeBuildSample` directory. --- .github/workflows/integration.yml | 32 ++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index f35bc58e..37f32667 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -26,26 +26,28 @@ jobs: name: ubuntu-latest runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: fetch-depth: 0 - - name: 'Cache: .nuke/temp, ~/.nuget/packages' - uses: actions/cache@v4 - with: - path: | - .nuke/temp - ~/.nuget/packages - key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} + # - name: 'Cache: .nuke/temp, ~/.nuget/packages' + # uses: actions/cache@v4 + # with: + # path: | + # .nuke/temp + # ~/.nuget/packages + # key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} - name: 'Run: DeployNuGet' - run: ./build.cmd DeployNuGet + run: | + cd ./samples/CakeBuildSample + dotnet run -- -t build env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: 'Publish: coverage_report' - uses: actions/upload-artifact@v4 - if: runner.os == 'Linux' - with: - name: coverage_report - path: .tests/coverage_report + # - name: 'Publish: coverage_report' + # uses: actions/upload-artifact@v4 + # if: runner.os == 'Linux' + # with: + # name: coverage_report + # path: .tests/coverage_report windows-latest: name: windows-latest runs-on: windows-latest From 847a987e809bbd076aa0f82743325a1f5e5d5ea1 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 3 Jan 2026 20:31:35 +0100 Subject: [PATCH 15/73] Comment out Windows and macOS jobs in GitHub Actions workflow and remove redundant configuration in solution file. --- .github/workflows/integration.yml | 96 +++++++++++++++---------------- Core.sln | 1 - 2 files changed, 48 insertions(+), 49 deletions(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 37f32667..6ddd192a 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -48,51 +48,51 @@ jobs: # with: # name: coverage_report # path: .tests/coverage_report - windows-latest: - name: windows-latest - runs-on: windows-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: 'Cache: .nuke/temp, ~/.nuget/packages' - uses: actions/cache@v4 - with: - path: | - .nuke/temp - ~/.nuget/packages - key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} - - name: 'Run: DeployNuGet' - run: ./build.cmd DeployNuGet - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: 'Publish: coverage_report' - uses: actions/upload-artifact@v4 - if: runner.os == 'Linux' - with: - name: coverage_report - path: .tests/coverage_report - macos-latest: - name: macos-latest - runs-on: macos-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: 'Cache: .nuke/temp, ~/.nuget/packages' - uses: actions/cache@v4 - with: - path: | - .nuke/temp - ~/.nuget/packages - key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} - - name: 'Run: DeployNuGet' - run: ./build.cmd DeployNuGet - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: 'Publish: coverage_report' - uses: actions/upload-artifact@v4 - if: runner.os == 'Linux' - with: - name: coverage_report - path: .tests/coverage_report +# windows-latest: +# name: windows-latest +# runs-on: windows-latest +# steps: +# - uses: actions/checkout@v4 +# with: +# fetch-depth: 0 +# - name: 'Cache: .nuke/temp, ~/.nuget/packages' +# uses: actions/cache@v4 +# with: +# path: | +# .nuke/temp +# ~/.nuget/packages +# key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} +# - name: 'Run: DeployNuGet' +# run: ./build.cmd DeployNuGet +# env: +# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +# - name: 'Publish: coverage_report' +# uses: actions/upload-artifact@v4 +# if: runner.os == 'Linux' +# with: +# name: coverage_report +# path: .tests/coverage_report +# macos-latest: +# name: macos-latest +# runs-on: macos-latest +# steps: +# - uses: actions/checkout@v4 +# with: +# fetch-depth: 0 +# - name: 'Cache: .nuke/temp, ~/.nuget/packages' +# uses: actions/cache@v4 +# with: +# path: | +# .nuke/temp +# ~/.nuget/packages +# key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} +# - name: 'Run: DeployNuGet' +# run: ./build.cmd DeployNuGet +# env: +# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +# - name: 'Publish: coverage_report' +# uses: actions/upload-artifact@v4 +# if: runner.os == 'Linux' +# with: +# name: coverage_report +# path: .tests/coverage_report diff --git a/Core.sln b/Core.sln index da034e61..60e35041 100644 --- a/Core.sln +++ b/Core.sln @@ -583,7 +583,6 @@ Global {EB88412B-8523-4DA4-8FF9-CACECA0969E6}.Release|Any CPU.Build.0 = Release|Any CPU {58C01CB8-B65A-44FE-9BE0-22929CD474A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {58C01CB8-B65A-44FE-9BE0-22929CD474A2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {58C01CB8-B65A-44FE-9BE0-22929CD474A2}.Debug|Any CPU.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From a0e22be6ea7115cd62fb3add9711aadab9e9a3b2 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 3 Jan 2026 20:47:06 +0100 Subject: [PATCH 16/73] Add `CakeTaskSettings` attribute for task settings interfaces and enhance `CakeHost` with settings support - Introduced `[CakeTaskSettings]` attribute to annotate task settings interfaces. - Refactored `CakeHost.UseBuildSetup` to inject and register task-specific settings interfaces. - Added missing `using` directives and improved modularity in task setup. --- .../CreativeCoders.CakeBuild/BuildContext.cs | 6 +++- .../CakeHostExtensions.cs | 32 ++++++++++++------- .../Settings/CakeTaskSettingsAttribute.cs | 6 ++++ .../Tasks/Templates/Settings/IBuildPaths.cs | 1 + .../Templates/Settings/IBuildTaskSettings.cs | 1 + .../Templates/Settings/ICleanTaskSettings.cs | 1 + .../Settings/ICodeCoverageTaskSettings.cs | 1 + .../Settings/INuGetPublishTaskSettings.cs | 1 + .../Templates/Settings/IPackTaskSettings.cs | 6 ++-- .../Templates/Settings/ITestTaskSettings.cs | 6 ++-- 10 files changed, 41 insertions(+), 20 deletions(-) create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/CakeTaskSettingsAttribute.cs diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs b/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs index 08ef4b6d..d32e26fd 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs @@ -1,4 +1,8 @@ -using Cake.Common.Diagnostics; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Cake.Common.Diagnostics; using Cake.Common.Tools.GitVersion; using Cake.Core; using Cake.Core.IO; diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs b/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs index 992b62c7..527f9a4a 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs @@ -1,5 +1,7 @@ -using System.Reflection; +using System; +using System.Reflection; using Cake.Frosting; +using CreativeCoders.CakeBuild.Tasks.Templates.Settings; using JetBrains.Annotations; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; @@ -53,20 +55,28 @@ public static CakeHost AddTasks(this CakeHost host, params Type[] taskTypes) public static CakeHost UseBuildSetup(this CakeHost host) where TBuildSetup : class { - host.ConfigureServices(services => services.AddSingleton()); + host.ConfigureServices(services => + { + services.AddSingleton(); + services.AddSettingsInterfacesFor(typeof(TBuildSetup), typeof(TBuildSetup)); + }); + + return host; + } - foreach (var propertyInfo in typeof(TBuildSetup).GetProperties(BindingFlags.Public | - BindingFlags.Instance)) + private static void AddSettingsInterfacesFor(this IServiceCollection services, Type type, + Type buildSetupType) + { + var interfaceTypes = type.GetInterfaces(); + + foreach (var interfaceType in interfaceTypes) { - host.ConfigureServices(services => services.AddSingleton(propertyInfo.PropertyType, sp => + if (interfaceType.GetCustomAttribute() is not null) { - var buildSetup = sp.GetRequiredService(); + services.AddSingleton(interfaceType, sp => sp.GetRequiredService(buildSetupType)); + } - return propertyInfo.GetValue(buildSetup) ?? throw new InvalidOperationException( - $"Property '{propertyInfo.Name}' of BuildSetup '{typeof(TBuildSetup).FullName}' is null."); - })); + services.AddSettingsInterfacesFor(interfaceType, buildSetupType); } - - return host; } } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/CakeTaskSettingsAttribute.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/CakeTaskSettingsAttribute.cs new file mode 100644 index 00000000..5a6f0f65 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/CakeTaskSettingsAttribute.cs @@ -0,0 +1,6 @@ +using System; + +namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; + +[AttributeUsage(AttributeTargets.Interface)] +public class CakeTaskSettingsAttribute : Attribute { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildPaths.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildPaths.cs index 53371624..bef35644 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildPaths.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildPaths.cs @@ -3,6 +3,7 @@ namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; +[CakeTaskSettings] public interface IBuildPaths : ICakeBuildSettings { DirectoryPath RootDir => FindGitRootPath(Context.Environment.WorkingDirectory) ?? diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildTaskSettings.cs index de5000a0..b003e980 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildTaskSettings.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildTaskSettings.cs @@ -1,3 +1,4 @@ namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; +[CakeTaskSettings] public interface IBuildTaskSettings { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs index dde55470..b33ab2e7 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs @@ -1,3 +1,4 @@ namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; +[CakeTaskSettings] public interface ICleanTaskSettings { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICodeCoverageTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICodeCoverageTaskSettings.cs index b73dc58d..d071fc3b 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICodeCoverageTaskSettings.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICodeCoverageTaskSettings.cs @@ -1,3 +1,4 @@ namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; +[CakeTaskSettings] public interface ICodeCoverageTaskSettings { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/INuGetPublishTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/INuGetPublishTaskSettings.cs index 068640e6..8f76aee6 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/INuGetPublishTaskSettings.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/INuGetPublishTaskSettings.cs @@ -1,3 +1,4 @@ namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; +[CakeTaskSettings] public interface INuGetPublishTaskSettings { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IPackTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IPackTaskSettings.cs index 34422095..b6774f0a 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IPackTaskSettings.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IPackTaskSettings.cs @@ -1,6 +1,4 @@ namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; -public interface IPackTaskSettings -{ - -} +[CakeTaskSettings] +public interface IPackTaskSettings { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ITestTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ITestTaskSettings.cs index c52c8325..b51444f0 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ITestTaskSettings.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ITestTaskSettings.cs @@ -1,6 +1,4 @@ namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; -public interface ITestTaskSettings -{ - -} +[CakeTaskSettings] +public interface ITestTaskSettings { } From 59a15a6bc8bb8eb3a6e44d70cffd3a7631b263b3 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 3 Jan 2026 20:53:08 +0100 Subject: [PATCH 17/73] Set terminal environment variables in GitHub Actions for improved console output rendering --- .github/workflows/integration.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 6ddd192a..1394b372 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -25,6 +25,9 @@ jobs: ubuntu-latest: name: ubuntu-latest runs-on: ubuntu-latest + env: + TERM: xterm + DOTNET_SYSTEM_CONSOLE_ALLOW_ANSI_COLOR_REDIRECTION: 1 steps: - uses: actions/checkout@v5 with: From 2425ec0e2bdbe574fbce1264089693cead2b3c9c Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 3 Jan 2026 21:02:37 +0100 Subject: [PATCH 18/73] Add task setup and teardown for better grouping in Cake Frosting builds - Introduced `SomeTaskSetup` and `SomeTaskTeardown` to handle task-specific logic. - Integrated GitHub Actions group commands for improved build log readability. --- samples/CakeBuildSample/Program.cs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/samples/CakeBuildSample/Program.cs b/samples/CakeBuildSample/Program.cs index b8997b3c..07ceeef2 100644 --- a/samples/CakeBuildSample/Program.cs +++ b/samples/CakeBuildSample/Program.cs @@ -1,4 +1,6 @@ -using Cake.Frosting; +using Cake.Common.Build; +using Cake.Core; +using Cake.Frosting; using CreativeCoders.CakeBuild; using CreativeCoders.CakeBuild.Tasks.Defaults; @@ -14,6 +16,24 @@ static int Main(string[] args) .AddTask() .AddTask() .AddTask() + .UseTaskSetup() + .UseTaskTeardown() .Run(args); } } + +public class SomeTaskTeardown : IFrostingTaskTeardown +{ + void IFrostingTaskTeardown.Teardown(ICakeContext context, ITaskTeardownContext info) + { + context.GitHubActions().Commands.EndGroup(); + } +} + +public class SomeTaskSetup : IFrostingTaskSetup +{ + void IFrostingTaskSetup.Setup(ICakeContext context, ITaskSetupContext info) + { + context.GitHubActions().Commands.StartGroup(info.Task.Name); + } +} From a6dadcb72def797396692655bb80230baca9c221 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 3 Jan 2026 21:05:41 +0100 Subject: [PATCH 19/73] Refactor `CleanTask` to reorder `DotNetClean` after directory deletions --- .../CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs index 6a8a1ef5..77575e00 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs @@ -10,10 +10,10 @@ public class CleanTask : FrostingTaskBase where T : BuildContext { public override async Task RunAsync(T context) { - context.DotNetClean(context.SolutionFile.FullPath); - DeleteDirectories(context, context.RootDir.FullPath + "/**/bin"); DeleteDirectories(context, context.RootDir.FullPath + "/**/obj"); + + context.DotNetClean(context.SolutionFile.FullPath); } private static void DeleteDirectories(T context, string globPattern) From 94424d68358b39c25c392a1fa357b613515d89d2 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 3 Jan 2026 21:08:07 +0100 Subject: [PATCH 20/73] Add information logging to task setup in `SomeTaskSetup` --- samples/CakeBuildSample/Program.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/samples/CakeBuildSample/Program.cs b/samples/CakeBuildSample/Program.cs index 07ceeef2..74a04a49 100644 --- a/samples/CakeBuildSample/Program.cs +++ b/samples/CakeBuildSample/Program.cs @@ -1,4 +1,5 @@ using Cake.Common.Build; +using Cake.Common.Diagnostics; using Cake.Core; using Cake.Frosting; using CreativeCoders.CakeBuild; @@ -34,6 +35,7 @@ public class SomeTaskSetup : IFrostingTaskSetup { void IFrostingTaskSetup.Setup(ICakeContext context, ITaskSetupContext info) { + context.Information(""); context.GitHubActions().Commands.StartGroup(info.Task.Name); } } From 1405df86a2f8e02b521467cc6c46f5b839ff2fc3 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 3 Jan 2026 21:31:49 +0100 Subject: [PATCH 21/73] Refactor `CakeHost` to simplify task setup and integrate build server functionality - Added `SetupHost`, `AddDefaultTasks`, and `AddBuildServerIntegration` extension methods to streamline configuration. - Replaced custom task setup and teardown (`SomeTaskSetup` and `SomeTaskTeardown`) with reusable GitHub Actions integrations (`StartGroupTaskSetup` and `EndGroupTaskTeardown`). - Updated `CakeBuildSample` to utilize new streamlined APIs. --- samples/CakeBuildSample/Program.cs | 33 +++---------------- .../BuildServer/EndGroupTaskTeardown.cs | 18 ++++++++++ .../BuildServer/StartGroupTaskSetup.cs | 20 +++++++++++ .../CakeHostExtensions.cs | 32 +++++++++++++++++- ...ultBuildSetup.cs => IDefaultBuildSetup.cs} | 0 5 files changed, 73 insertions(+), 30 deletions(-) create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/BuildServer/EndGroupTaskTeardown.cs create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/BuildServer/StartGroupTaskSetup.cs rename source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/{DefaultBuildSetup.cs => IDefaultBuildSetup.cs} (100%) diff --git a/samples/CakeBuildSample/Program.cs b/samples/CakeBuildSample/Program.cs index 74a04a49..d500b4b8 100644 --- a/samples/CakeBuildSample/Program.cs +++ b/samples/CakeBuildSample/Program.cs @@ -1,9 +1,5 @@ -using Cake.Common.Build; -using Cake.Common.Diagnostics; -using Cake.Core; -using Cake.Frosting; +using Cake.Frosting; using CreativeCoders.CakeBuild; -using CreativeCoders.CakeBuild.Tasks.Defaults; namespace CakeBuildSample; @@ -12,30 +8,9 @@ internal static class Program static int Main(string[] args) { return new CakeHost() - .UseContext() - .UseBuildSetup() - .AddTask() - .AddTask() - .AddTask() - .UseTaskSetup() - .UseTaskTeardown() + .SetupHost() + .AddDefaultTasks() + .AddBuildServerIntegration() .Run(args); } } - -public class SomeTaskTeardown : IFrostingTaskTeardown -{ - void IFrostingTaskTeardown.Teardown(ICakeContext context, ITaskTeardownContext info) - { - context.GitHubActions().Commands.EndGroup(); - } -} - -public class SomeTaskSetup : IFrostingTaskSetup -{ - void IFrostingTaskSetup.Setup(ICakeContext context, ITaskSetupContext info) - { - context.Information(""); - context.GitHubActions().Commands.StartGroup(info.Task.Name); - } -} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/BuildServer/EndGroupTaskTeardown.cs b/source/CakeBuild/CreativeCoders.CakeBuild/BuildServer/EndGroupTaskTeardown.cs new file mode 100644 index 00000000..c4c7d292 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/BuildServer/EndGroupTaskTeardown.cs @@ -0,0 +1,18 @@ +using Cake.Common.Build; +using Cake.Core; +using Cake.Frosting; +using JetBrains.Annotations; + +namespace CreativeCoders.CakeBuild.BuildServer; + +[UsedImplicitly] +public class EndGroupTaskTeardown : IFrostingTaskTeardown +{ + void IFrostingTaskTeardown.Teardown(ICakeContext context, ITaskTeardownContext info) + { + if (context.GitHubActions().IsRunningOnGitHubActions) + { + context.GitHubActions().Commands.EndGroup(); + } + } +} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/BuildServer/StartGroupTaskSetup.cs b/source/CakeBuild/CreativeCoders.CakeBuild/BuildServer/StartGroupTaskSetup.cs new file mode 100644 index 00000000..f667ad82 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/BuildServer/StartGroupTaskSetup.cs @@ -0,0 +1,20 @@ +using Cake.Common.Build; +using Cake.Common.Diagnostics; +using Cake.Core; +using Cake.Frosting; +using JetBrains.Annotations; + +namespace CreativeCoders.CakeBuild.BuildServer; + +[UsedImplicitly] +public class StartGroupTaskSetup : IFrostingTaskSetup +{ + void IFrostingTaskSetup.Setup(ICakeContext context, ITaskSetupContext info) + { + if (context.GitHubActions().IsRunningOnGitHubActions) + { + context.Information(""); + context.GitHubActions().Commands.StartGroup(info.Task.Name); + } + } +} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs b/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs index 527f9a4a..64a3090b 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs @@ -1,6 +1,8 @@ using System; using System.Reflection; using Cake.Frosting; +using CreativeCoders.CakeBuild.BuildServer; +using CreativeCoders.CakeBuild.Tasks.Defaults; using CreativeCoders.CakeBuild.Tasks.Templates.Settings; using JetBrains.Annotations; using Microsoft.Extensions.DependencyInjection; @@ -52,7 +54,35 @@ public static CakeHost AddTasks(this CakeHost host, params Type[] taskTypes) }); } - public static CakeHost UseBuildSetup(this CakeHost host) + public static CakeHost AddDefaultTasks(this CakeHost host) + { + return host.AddTasks( + typeof(CleanTask), + typeof(RestoreTask), + typeof(BuildTask), + typeof(TestTask), + typeof(CodeCoverageTask), + typeof(PackTask), + typeof(NuGetPublishTask)); + } + + public static CakeHost AddBuildServerIntegration(this CakeHost host) + { + return host + .UseTaskSetup() + .UseTaskTeardown(); + } + + public static CakeHost SetupHost(this CakeHost host) + where TBuildSetup : class + where TBuildContext : BuildContext + { + return host + .UseContext() + .UseBuildSetup(); + } + + private static CakeHost UseBuildSetup(this CakeHost host) where TBuildSetup : class { host.ConfigureServices(services => diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/DefaultBuildSetup.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/IDefaultBuildSetup.cs similarity index 100% rename from source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/DefaultBuildSetup.cs rename to source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/IDefaultBuildSetup.cs From 5239b44a5139e17650e7d5482e77bb218c47bb89 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sun, 4 Jan 2026 12:00:48 +0100 Subject: [PATCH 22/73] Fix typo in `Ensure.cs` and add `ICakeHostBuilder` implementation for streamlined Cake build setup - Corrected `UnkownParamName` to `UnknownParamName` across all methods in `Ensure.cs`. - Introduced `ICakeHostBuilder` interface and its implementation, `CakeHostBuilder`, for simplifying Cake build configuration. - Updated `CakeHostExtensions` and `CakeBuildSample` to leverage the new `CakeHostBuilder`. --- samples/CakeBuildSample/Program.cs | 8 +- .../CakeHostBuilder.cs | 82 +++++++++++++++++++ .../CakeHostExtensions.cs | 4 +- .../ICakeHostBuilder.cs | 25 ++++++ source/Core/CreativeCoders.Core/Ensure.cs | 28 +++---- 5 files changed, 128 insertions(+), 19 deletions(-) create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/CakeHostBuilder.cs create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/ICakeHostBuilder.cs diff --git a/samples/CakeBuildSample/Program.cs b/samples/CakeBuildSample/Program.cs index d500b4b8..7de2858e 100644 --- a/samples/CakeBuildSample/Program.cs +++ b/samples/CakeBuildSample/Program.cs @@ -1,5 +1,4 @@ -using Cake.Frosting; -using CreativeCoders.CakeBuild; +using CreativeCoders.CakeBuild; namespace CakeBuildSample; @@ -7,10 +6,11 @@ internal static class Program { static int Main(string[] args) { - return new CakeHost() - .SetupHost() + return CakeHostBuilder.Create() + .UseBuildSetup() .AddDefaultTasks() .AddBuildServerIntegration() + .Build() .Run(args); } } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostBuilder.cs b/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostBuilder.cs new file mode 100644 index 00000000..beb885d5 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostBuilder.cs @@ -0,0 +1,82 @@ +using Cake.Frosting; +using CreativeCoders.Core; + +namespace CreativeCoders.CakeBuild; + +public class CakeHostBuilder : ICakeHostBuilder +{ + private readonly CakeHost _cakeHost = new CakeHost(); + + private bool _buildContextIsSet; + + public static ICakeHostBuilder Create() + { + return new CakeHostBuilder(); + } + + public ICakeHostBuilder UseBuildContext() + where TBuildContext : BuildContext + { + _buildContextIsSet = true; + + _cakeHost.UseContext(); + + return this; + } + + public ICakeHostBuilder UseBuildSetup() + where TBuildSetup : class + { + _cakeHost.UseBuildSetup(); + + return this; + } + + public ICakeHostBuilder AddBuildServerIntegration() + { + _cakeHost.AddBuildServerIntegration(); + + return this; + } + + public ICakeHostBuilder AddDefaultTasks() + { + _cakeHost.AddDefaultTasks(); + + return this; + } + + public ICakeHostBuilder AddTask() + where TTask : class, IFrostingTask + { + _cakeHost.AddTask(); + + return this; + } + + public ICakeHostBuilder AddTasks(params Type[] taskTypes) + { + _cakeHost.AddTasks(taskTypes); + + return this; + } + + public ICakeHostBuilder ConfigureHost(Action configure) + { + Ensure.NotNull(configure); + + configure(_cakeHost); + + return this; + } + + public CakeHost Build() + { + if (!_buildContextIsSet) + { + _cakeHost.UseContext(); + } + + return _cakeHost; + } +} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs b/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs index 64a3090b..adc09ea3 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs @@ -16,6 +16,8 @@ public static class CakeHostExtensions public static CakeHost AddTask(this CakeHost host) where TTask : class, IFrostingTask { + ArgumentNullException.ThrowIfNull(host); + return host.ConfigureServices(x => x.AddSingleton()); } @@ -82,7 +84,7 @@ public static CakeHost SetupHost(this CakeHost host) .UseBuildSetup(); } - private static CakeHost UseBuildSetup(this CakeHost host) + public static CakeHost UseBuildSetup(this CakeHost host) where TBuildSetup : class { host.ConfigureServices(services => diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/ICakeHostBuilder.cs b/source/CakeBuild/CreativeCoders.CakeBuild/ICakeHostBuilder.cs new file mode 100644 index 00000000..c434be80 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/ICakeHostBuilder.cs @@ -0,0 +1,25 @@ +using Cake.Frosting; + +namespace CreativeCoders.CakeBuild; + +public interface ICakeHostBuilder +{ + ICakeHostBuilder AddBuildServerIntegration(); + + ICakeHostBuilder AddDefaultTasks(); + + ICakeHostBuilder AddTask() + where TTask : class, IFrostingTask; + + ICakeHostBuilder AddTasks(params Type[] taskTypes); + + ICakeHostBuilder ConfigureHost(Action configure); + + ICakeHostBuilder UseBuildContext() + where TBuildContext : BuildContext; + + ICakeHostBuilder UseBuildSetup() + where TBuildSetup : class; + + CakeHost Build(); +} diff --git a/source/Core/CreativeCoders.Core/Ensure.cs b/source/Core/CreativeCoders.Core/Ensure.cs index 78215ee5..883c23a5 100644 --- a/source/Core/CreativeCoders.Core/Ensure.cs +++ b/source/Core/CreativeCoders.Core/Ensure.cs @@ -17,7 +17,7 @@ namespace CreativeCoders.Core; [PublicAPI] public static class Ensure { - private const string UnkownParamName = "[unknown]"; + private const string UnknownParamName = "[unknown]"; ///------------------------------------------------------------------------------------------------- /// Ensures that is not null. @@ -35,7 +35,7 @@ public static class Ensure [MethodImpl(MethodImplOptions.AggressiveInlining)] [return: System.Diagnostics.CodeAnalysis.NotNull] public static T NotNull([System.Diagnostics.CodeAnalysis.NotNull] [NoEnumeration] T? value, - [CallerArgumentExpression("value")] string paramName = UnkownParamName) + [CallerArgumentExpression("value")] string paramName = UnknownParamName) { return value ?? throw new ArgumentNullException(paramName); } @@ -43,7 +43,7 @@ public static T NotNull([System.Diagnostics.CodeAnalysis.NotNull] [NoEnumerat [ContractAnnotation("value: null => halt")] [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void IsNotNull([System.Diagnostics.CodeAnalysis.NotNull] [NoEnumeration] object? value, - [CallerArgumentExpression("value")] string paramName = UnkownParamName) + [CallerArgumentExpression("value")] string paramName = UnknownParamName) { if (value is null) { @@ -84,7 +84,7 @@ public static void IsNotNull([System.Diagnostics.CodeAnalysis.NotNull] [NoEnu [ContractAnnotation("halt <= value: null; value: notnull => notnull")] [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string IsNotNullOrEmpty([System.Diagnostics.CodeAnalysis.NotNull] string? value, - [CallerArgumentExpression("value")] string paramName = UnkownParamName) + [CallerArgumentExpression("value")] string paramName = UnknownParamName) { return string.IsNullOrEmpty(value) ? throw new ArgumentException("Must not be null or empty", paramName) @@ -104,7 +104,7 @@ public static string IsNotNullOrEmpty([System.Diagnostics.CodeAnalysis.NotNull] [ContractAnnotation("halt <= value: null")] [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void IsNotNullOrEmpty(IEnumerable? value, - [CallerArgumentExpression("value")] string paramName = UnkownParamName) + [CallerArgumentExpression("value")] string paramName = UnknownParamName) { if (value == null || !value.Any()) { @@ -126,7 +126,7 @@ public static void IsNotNullOrEmpty(IEnumerable? value, [ContractAnnotation("halt <= value: null; value: notnull => notnull")] [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string IsNotNullOrWhitespace(string? value, - [CallerArgumentExpression("value")] string paramName = UnkownParamName) + [CallerArgumentExpression("value")] string paramName = UnknownParamName) { return string.IsNullOrWhiteSpace(value) ? throw new ArgumentException("Must not be null or whitespace", paramName) @@ -143,7 +143,7 @@ public static string IsNotNullOrWhitespace(string? value, /// Name of the parameter. /// ------------------------------------------------------------------------------------------------- public static void FileExists(string? fileName, - [CallerArgumentExpression("fileName")] string paramName = UnkownParamName) + [CallerArgumentExpression("fileName")] string paramName = UnknownParamName) { if (!FileSys.File.Exists(fileName)) { @@ -165,7 +165,7 @@ public static void FileExists(string? fileName, ///------------------------------------------------------------------------------------------------- public static void DirectoryExists(string? directoryName, [CallerArgumentExpression("directoryName")] - string paramName = UnkownParamName) + string paramName = UnknownParamName) { if (!FileSys.Directory.Exists(directoryName)) { @@ -184,7 +184,7 @@ public static void DirectoryExists(string? directoryName, ///------------------------------------------------------------------------------------------------- [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void GuidIsNotEmpty(Guid guid, - [CallerArgumentExpression("guid")] string paramName = UnkownParamName) + [CallerArgumentExpression("guid")] string paramName = UnknownParamName) { if (guid.Equals(Guid.Empty)) { @@ -202,7 +202,7 @@ public static void GuidIsNotEmpty(Guid guid, public static void That(bool condition, string message = "Assertion failed", [CallerArgumentExpression("condition")] - string paramName = UnkownParamName) + string paramName = UnknownParamName) { if (!condition) { @@ -223,7 +223,7 @@ public static void That(bool condition, public static void ThatRange(bool condition, string message = "Assertion failed", [CallerArgumentExpression("condition")] - string paramName = UnkownParamName) + string paramName = UnknownParamName) { if (!condition) { @@ -246,7 +246,7 @@ public static void ThatRange(bool condition, ///------------------------------------------------------------------------------------------------- [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void IndexIsInRange(int index, int startIndex, int endIndex, - [CallerArgumentExpression("index")] string paramName = UnkownParamName) + [CallerArgumentExpression("index")] string paramName = UnknownParamName) { if (index < startIndex || index > endIndex) { @@ -269,7 +269,7 @@ public static void IndexIsInRange(int index, int startIndex, int endIndex, ///------------------------------------------------------------------------------------------------- [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void IndexIsInRange(int index, int collectionLength, - [CallerArgumentExpression("index")] string paramName = UnkownParamName) + [CallerArgumentExpression("index")] string paramName = UnknownParamName) { if (index < 0 || index >= collectionLength) { @@ -289,7 +289,7 @@ public static void IndexIsInRange(int index, int collectionLength, ///------------------------------------------------------------------------------------------------- [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Argument Argument(T? value, - [CallerArgumentExpression("value")] string paramName = UnkownParamName) + [CallerArgumentExpression("value")] string paramName = UnknownParamName) { return new Argument(value, paramName); } From 9c8f44301b1efae29c6719f5b0866374eef2f36e Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sun, 4 Jan 2026 12:08:24 +0100 Subject: [PATCH 23/73] Clean up unused and redundant package references in Blazor and TokenAuthApi projects --- .../BlazorWebAssemblySampleApp.csproj | 7 +++---- .../CreativeCoders.AspNetCore.TokenAuthApi.csproj | 4 ---- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/samples/BlazorWebAssemblySampleApp/BlazorWebAssemblySampleApp.csproj b/samples/BlazorWebAssemblySampleApp/BlazorWebAssemblySampleApp.csproj index 686eabe4..3fc58281 100644 --- a/samples/BlazorWebAssemblySampleApp/BlazorWebAssemblySampleApp.csproj +++ b/samples/BlazorWebAssemblySampleApp/BlazorWebAssemblySampleApp.csproj @@ -5,10 +5,9 @@ - - - - + + + diff --git a/source/AspNetCore/CreativeCoders.AspNetCore.TokenAuthApi/CreativeCoders.AspNetCore.TokenAuthApi.csproj b/source/AspNetCore/CreativeCoders.AspNetCore.TokenAuthApi/CreativeCoders.AspNetCore.TokenAuthApi.csproj index 09f4151b..63c40571 100644 --- a/source/AspNetCore/CreativeCoders.AspNetCore.TokenAuthApi/CreativeCoders.AspNetCore.TokenAuthApi.csproj +++ b/source/AspNetCore/CreativeCoders.AspNetCore.TokenAuthApi/CreativeCoders.AspNetCore.TokenAuthApi.csproj @@ -10,10 +10,6 @@ - - - - From 4805f33a36a187de550b956502d65e869de6b569 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Mon, 5 Jan 2026 12:45:42 +0100 Subject: [PATCH 24/73] Refactor build context and task settings for enhanced modularity and flexibility - Removed redundant interfaces (`IDefaultBuildSetup`, `IBuildPaths`, `ICakeBuildSettings`, etc.). - Introduced `IBuildContext` and `IBuildContextAccessor` to centralize build context management. - Updated `CleanTask` and `BuildTask` to leverage `ICleanTaskSettings`, improving task-specific configuration. - Refactored `BuildContext` to streamline directory and configuration management. - Simplified sample project setup using the new `SampleBuildContext`. --- samples/CakeBuildSample/BuildSetup.cs | 11 ----- samples/CakeBuildSample/Program.cs | 3 +- samples/CakeBuildSample/SampleBuildContext.cs | 17 +++++++ .../CreativeCoders.CakeBuild/BuildContext.cs | 46 +++++++++++++++---- .../CakeHostExtensions.cs | 3 +- .../CreativeCoders.CakeBuild/IBuildContext.cs | 32 +++++++++++++ .../IBuildContextAccessor.cs | 6 +++ ...tBuildSetup.cs => IDefaultTaskSettings.cs} | 2 +- .../Tasks/Templates/BuildTask.cs | 9 +--- .../Tasks/Templates/CleanTask.cs | 20 ++++---- .../Tasks/Templates/RestoreTask.cs | 3 +- .../Settings/CakeTaskSettingsAttribute.cs | 2 - .../Tasks/Templates/Settings/IBuildPaths.cs | 35 -------------- .../Templates/Settings/IBuildTaskSettings.cs | 4 -- .../Templates/Settings/ICakeBuildSettings.cs | 8 ---- .../Templates/Settings/ICleanTaskSettings.cs | 39 +++++++++++++++- .../CreativeCoders.Core/ObjectExtensions.cs | 2 + 17 files changed, 148 insertions(+), 94 deletions(-) delete mode 100644 samples/CakeBuildSample/BuildSetup.cs create mode 100644 samples/CakeBuildSample/SampleBuildContext.cs create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/IBuildContext.cs create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/IBuildContextAccessor.cs rename source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/{IDefaultBuildSetup.cs => IDefaultTaskSettings.cs} (63%) delete mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildPaths.cs delete mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildTaskSettings.cs delete mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICakeBuildSettings.cs diff --git a/samples/CakeBuildSample/BuildSetup.cs b/samples/CakeBuildSample/BuildSetup.cs deleted file mode 100644 index f5e725c5..00000000 --- a/samples/CakeBuildSample/BuildSetup.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Cake.Core; -using Cake.Core.IO; -using CreativeCoders.CakeBuild.Tasks.Defaults; -using CreativeCoders.CakeBuild.Tasks.Templates.Settings; - -namespace CakeBuildSample; - -public class BuildSetup(ICakeContext context) : IDefaultBuildSetup -{ - public ICakeContext Context { get; } = context; -} diff --git a/samples/CakeBuildSample/Program.cs b/samples/CakeBuildSample/Program.cs index 7de2858e..8889b782 100644 --- a/samples/CakeBuildSample/Program.cs +++ b/samples/CakeBuildSample/Program.cs @@ -1,4 +1,5 @@ using CreativeCoders.CakeBuild; +using CreativeCoders.CakeBuild.Tasks.Defaults; namespace CakeBuildSample; @@ -7,7 +8,7 @@ internal static class Program static int Main(string[] args) { return CakeHostBuilder.Create() - .UseBuildSetup() + .UseBuildContext() .AddDefaultTasks() .AddBuildServerIntegration() .Build() diff --git a/samples/CakeBuildSample/SampleBuildContext.cs b/samples/CakeBuildSample/SampleBuildContext.cs new file mode 100644 index 00000000..2ad66c5c --- /dev/null +++ b/samples/CakeBuildSample/SampleBuildContext.cs @@ -0,0 +1,17 @@ +using Cake.Core; +using Cake.Core.IO; +using CreativeCoders.CakeBuild; +using CreativeCoders.CakeBuild.Tasks.Defaults; +using CreativeCoders.CakeBuild.Tasks.Templates.Settings; +using CreativeCoders.Core; +using CreativeCoders.Core.Collections; + +namespace CakeBuildSample; + +public class SampleBuildContext : BuildContext, IDefaultTaskSettings +{ + public SampleBuildContext(ICakeContext context) : base(context) { } + + IList ICleanTaskSettings.DirectoriesToClean => + this.CastAs().DefaultDirectoriesToClean.AddRange(RootDir.Combine(".tests")); +} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs b/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs index d32e26fd..6ff7d070 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs @@ -1,19 +1,17 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; +using Cake.Common.Build; using Cake.Common.Diagnostics; using Cake.Common.Tools.GitVersion; using Cake.Core; using Cake.Core.IO; using Cake.Frosting; +using CreativeCoders.CakeBuild.Tasks.Templates.Settings; using CreativeCoders.Core.IO; using JetBrains.Annotations; namespace CreativeCoders.CakeBuild; [PublicAPI] -public class BuildContext : FrostingContext +public class BuildContext : FrostingContext, IBuildContext, IBuildContextAccessor { private readonly List _executedTasks = []; @@ -76,15 +74,19 @@ private FilePath FindRootSolution(ICakeContext context) return solution; } - public FilePath SolutionFile { get; set; } + public FilePath SolutionFile { get; } - public GitVersion Version { get; set; } + public DirectoryPath RootDir { get; } - public DirectoryPath RootDir { get; set; } + public virtual DirectoryPath ArtifactsDir => RootDir.Combine(".artifacts"); - public DirectoryPath ArtifactsDir => RootDir.Combine(".artifacts"); + public virtual DirectoryPath TestOutputBasePath => RootDir.Combine(".tests"); - public string BuildConfiguration { get; set; } = "Release"; + public virtual DirectoryPath CodeCoverageResultsDir => TestOutputBasePath.Combine("coverage-results"); + + public virtual string BuildConfiguration => this.BuildSystem().IsLocalBuild ? "Debug" : "Release"; + + public GitVersion Version { get; } public IList ExecutedTasks => _executedTasks; @@ -97,4 +99,28 @@ public bool HasExecutedTask(Type taskType) { return _executedTasks.Any(x => x.GetType().IsAssignableTo(taskType)); } + + public T GetSettings() where T : class + { + return this as T + ?? FindSettingsProperty() + ?? throw new InvalidOperationException($"No settings of type '{typeof(T).Name}' found"); + } + + private T? FindSettingsProperty() + where T : class + { + var matchingProperties = GetType() + .GetProperties() + .Where(x => x.PropertyType == typeof(T) || + x.PropertyType.GetInterfaces().Any(intfType => + intfType == typeof(T))); + + return matchingProperties + .Select(x => x.GetValue(this)) + .OfType() + .FirstOrDefault(); + } + + public IBuildContext Context => this; } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs b/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs index adc09ea3..a0dc5c8c 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs @@ -1,5 +1,4 @@ -using System; -using System.Reflection; +using System.Reflection; using Cake.Frosting; using CreativeCoders.CakeBuild.BuildServer; using CreativeCoders.CakeBuild.Tasks.Defaults; diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/IBuildContext.cs b/source/CakeBuild/CreativeCoders.CakeBuild/IBuildContext.cs new file mode 100644 index 00000000..ea25ecc6 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/IBuildContext.cs @@ -0,0 +1,32 @@ +using Cake.Common.Tools.GitVersion; +using Cake.Core; +using Cake.Core.IO; +using Cake.Frosting; + +namespace CreativeCoders.CakeBuild; + +public interface IBuildContext : ICakeContext +{ + FilePath SolutionFile { get; } + + DirectoryPath RootDir { get; } + + DirectoryPath ArtifactsDir { get; } + + DirectoryPath TestOutputBasePath { get; } + + DirectoryPath CodeCoverageResultsDir { get; } + + string BuildConfiguration { get; } + + GitVersion Version { get; } + + IList ExecutedTasks { get; } + + void AddExecutedTask(IFrostingTask task); + + bool HasExecutedTask(Type taskType); + + T GetSettings() + where T : class; +} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/IBuildContextAccessor.cs b/source/CakeBuild/CreativeCoders.CakeBuild/IBuildContextAccessor.cs new file mode 100644 index 00000000..203b5571 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/IBuildContextAccessor.cs @@ -0,0 +1,6 @@ +namespace CreativeCoders.CakeBuild; + +public interface IBuildContextAccessor +{ + IBuildContext Context { get; } +} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/IDefaultBuildSetup.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/IDefaultTaskSettings.cs similarity index 63% rename from source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/IDefaultBuildSetup.cs rename to source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/IDefaultTaskSettings.cs index 8b01cdf0..24e79464 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/IDefaultBuildSetup.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/IDefaultTaskSettings.cs @@ -2,4 +2,4 @@ namespace CreativeCoders.CakeBuild.Tasks.Defaults; -public interface IDefaultBuildSetup : IBuildPaths { } +public interface IDefaultTaskSettings : ICleanTaskSettings { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs index b964f88e..75cadad5 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs @@ -1,5 +1,4 @@ -using System.Threading.Tasks; -using Cake.Common.Diagnostics; +using Cake.Common.Diagnostics; using Cake.Common.Tools.DotNet; using Cake.Common.Tools.DotNet.Build; using Cake.Common.Tools.DotNet.MSBuild; @@ -20,6 +19,7 @@ private DotNetBuildSettings CreateDotNetBuildSettings(T context) { Configuration = context.BuildConfiguration, NoRestore = context.HasExecutedTask(typeof(RestoreTask)), + NoIncremental = true, MSBuildSettings = new DotNetMSBuildSettings { InformationalVersion = context.Version.InformationalVersion, @@ -50,8 +50,3 @@ public override Task RunAsync(T context) return Task.CompletedTask; } } - -public class BuildTaskSettings -{ - public string? Configuration { get; set; } -} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs index 77575e00..7e385073 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs @@ -1,26 +1,26 @@ -using System.Linq; -using System.Threading.Tasks; -using Cake.Common.Diagnostics; +using Cake.Common.Diagnostics; using Cake.Common.Tools.DotNet; using Cake.Core.IO; +using CreativeCoders.CakeBuild.Tasks.Templates.Settings; namespace CreativeCoders.CakeBuild.Tasks.Templates; public class CleanTask : FrostingTaskBase where T : BuildContext { - public override async Task RunAsync(T context) + public override Task RunAsync(T context) { - DeleteDirectories(context, context.RootDir.FullPath + "/**/bin"); - DeleteDirectories(context, context.RootDir.FullPath + "/**/obj"); + var settings = context.GetSettings(); + + DeleteDirectories(context, settings.DirectoriesToClean); context.DotNetClean(context.SolutionFile.FullPath); + + return Task.CompletedTask; } - private static void DeleteDirectories(T context, string globPattern) + private static void DeleteDirectories(T context, IEnumerable dirsForDelete) { - var dirs = context.Globber.Match(globPattern).OfType(); - - foreach (var dir in dirs) + foreach (var dir in dirsForDelete.Where(dir => context.FileSystem.GetDirectory(dir).Exists)) { context.Information("Deleting directory '{0}'", dir); diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/RestoreTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/RestoreTask.cs index e24f0be9..c4ece690 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/RestoreTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/RestoreTask.cs @@ -1,5 +1,4 @@ -using System.Threading.Tasks; -using Cake.Common.Tools.DotNet; +using Cake.Common.Tools.DotNet; namespace CreativeCoders.CakeBuild.Tasks.Templates; diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/CakeTaskSettingsAttribute.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/CakeTaskSettingsAttribute.cs index 5a6f0f65..794e2faa 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/CakeTaskSettingsAttribute.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/CakeTaskSettingsAttribute.cs @@ -1,5 +1,3 @@ -using System; - namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; [AttributeUsage(AttributeTargets.Interface)] diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildPaths.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildPaths.cs deleted file mode 100644 index bef35644..00000000 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildPaths.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Cake.Core; -using Cake.Core.IO; - -namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; - -[CakeTaskSettings] -public interface IBuildPaths : ICakeBuildSettings -{ - DirectoryPath RootDir => FindGitRootPath(Context.Environment.WorkingDirectory) ?? - Context.Environment.WorkingDirectory.GetParent(); - - DirectoryPath ArtifactsDir => RootDir.Combine(".artifacts"); - - DirectoryPath TestOutputBasePath => RootDir.Combine(".tests"); - - DirectoryPath CodeCoverageResultsDir => TestOutputBasePath.Combine("coverage-results"); - - DirectoryPath? FindGitRootPath(DirectoryPath? startPath) - { - while (true) - { - if (startPath == null) - { - return null; - } - - if (Context.FileSystem.Exist(startPath.Combine(".git"))) - { - return startPath; - } - - startPath = startPath.GetParent(); - } - } -} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildTaskSettings.cs deleted file mode 100644 index b003e980..00000000 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IBuildTaskSettings.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; - -[CakeTaskSettings] -public interface IBuildTaskSettings { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICakeBuildSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICakeBuildSettings.cs deleted file mode 100644 index 163a665c..00000000 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICakeBuildSettings.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Cake.Core; - -namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; - -public interface ICakeBuildSettings -{ - ICakeContext Context { get; } -} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs index b33ab2e7..54d48531 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs @@ -1,4 +1,41 @@ +using System.Collections.Generic; +using System.Linq; +using Cake.Core.IO; + namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; [CakeTaskSettings] -public interface ICleanTaskSettings { } +public interface ICleanTaskSettings : IBuildContextAccessor +{ + IList DirectoriesToClean => DefaultDirectoriesToClean; + + IList DefaultDirectoriesToClean + { + get + { + var dirs = new List(); + + string[] defaultSourceDirs = ["source", "src", "samples", "tests"]; + + foreach (var defaultSourceDir in defaultSourceDirs) + { + var sourceDir = Context.RootDir.Combine(defaultSourceDir); + + if (Context.FileSystem.Exist(sourceDir)) + { + var binDirs = Context.Globber.Match(sourceDir.FullPath + "/**/bin") + .OfType(); + + dirs.AddRange(binDirs); + + var objDirs = Context.Globber.Match(sourceDir.FullPath + "/**/obj") + .OfType(); + + dirs.AddRange(objDirs); + } + } + + return dirs; + } + } +} diff --git a/source/Core/CreativeCoders.Core/ObjectExtensions.cs b/source/Core/CreativeCoders.Core/ObjectExtensions.cs index 014047e4..778ba00b 100644 --- a/source/Core/CreativeCoders.Core/ObjectExtensions.cs +++ b/source/Core/CreativeCoders.Core/ObjectExtensions.cs @@ -47,6 +47,8 @@ public static bool TryAs(this object instance, [MaybeNullWhen(false)] out T a return false; } + public static T CastAs(this object instance) => (T)Ensure.NotNull(instance); + public static async ValueTask TryDisposeAsync(this object instance) { switch (instance) From f570ea908b878fe60f1bd57c5707ab041ea1c899 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Mon, 5 Jan 2026 12:52:20 +0100 Subject: [PATCH 25/73] Add implementation for `TestTask` to execute `DotNetTest` with configurable settings and enhance `BuildTask` syntax consistency --- .../Tasks/Templates/BuildTask.cs | 2 +- .../Tasks/Templates/TestTask.cs | 36 +++++++++++++++++-- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs index 75cadad5..59af6201 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs @@ -8,7 +8,7 @@ namespace CreativeCoders.CakeBuild.Tasks.Templates; [PublicAPI] -public class BuildTask() : FrostingTaskBase +public class BuildTask : FrostingTaskBase where T : BuildContext { protected virtual void ApplyDotNetBuildSettings(T context, DotNetBuildSettings dotNetBuildSettings) { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs index 377389f6..de2a083a 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs @@ -1,3 +1,35 @@ -namespace CreativeCoders.CakeBuild.Tasks.Templates; +using Cake.Common.Diagnostics; +using Cake.Common.Tools.DotNet; +using Cake.Common.Tools.DotNet.Test; -public class TestTask : FrostingTaskBase where T : BuildContext { } +namespace CreativeCoders.CakeBuild.Tasks.Templates; + +public class TestTask : FrostingTaskBase where T : BuildContext +{ + public override Task RunAsync(T context) + { + context.DotNetTest(context.RootDir.FullPath, CreateDotNetBuildSettings(context)); + + return Task.CompletedTask; + } + + protected virtual void ApplyDotNetTestSettings(T context, DotNetTestSettings dotNetBuildSettings) { } + + private DotNetTestSettings CreateDotNetBuildSettings(T context) + { + var dotNetTestSettings = new DotNetTestSettings + { + Configuration = context.BuildConfiguration, + NoBuild = context.HasExecutedTask(typeof(BuildTask)) + }; + + ApplyDotNetTestSettings(context, dotNetTestSettings); + + if (dotNetTestSettings.NoBuild) + { + context.Information("Skip build"); + } + + return dotNetTestSettings; + } +} From 7ba5b51f5a105550c9595adcf77ea5a42d8869d3 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Mon, 5 Jan 2026 12:52:40 +0100 Subject: [PATCH 26/73] Update integration workflow to run tests instead of build in `DeployNuGet` step --- .github/workflows/integration.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 1394b372..bc984aa3 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -42,7 +42,7 @@ jobs: - name: 'Run: DeployNuGet' run: | cd ./samples/CakeBuildSample - dotnet run -- -t build + dotnet run -- -t test env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # - name: 'Publish: coverage_report' From 4e6a7254a3baaf89fcdf16462892cf2ef296ab77 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Mon, 5 Jan 2026 14:48:30 +0100 Subject: [PATCH 27/73] Refactor `FrostingTaskBase` and derived tasks to streamline task execution and enhance GitHub Actions integration - Introduced `RunAsyncCore` as a protected abstract method in `FrostingTaskBase`, replacing `RunAsync` in derived tasks. - Added GitHub Actions group logging for better task execution visibility. - Updated all template tasks to implement `RunAsyncCore` with appropriate logic or placeholders. --- .../Tasks/FrostingTaskBase.cs | 36 +++++++++++++++++-- .../Tasks/Templates/BuildTask.cs | 2 +- .../Tasks/Templates/CleanTask.cs | 2 +- .../Tasks/Templates/CodeCoverageTask.cs | 8 ++++- .../Tasks/Templates/NuGetPublishTask.cs | 8 ++++- .../Tasks/Templates/PackTask.cs | 8 ++++- .../Tasks/Templates/RestoreTask.cs | 2 +- .../Tasks/Templates/TestTask.cs | 2 +- 8 files changed, 59 insertions(+), 9 deletions(-) diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs index 4ced8fdc..78a1700c 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs @@ -1,10 +1,42 @@ -using Cake.Frosting; +using System.Reflection; +using Cake.Common.Build; +using Cake.Common.Diagnostics; +using Cake.Frosting; namespace CreativeCoders.CakeBuild.Tasks; -public class FrostingTaskBase : AsyncFrostingTask +public abstract class FrostingTaskBase : AsyncFrostingTask where T : BuildContext { + public sealed override async Task RunAsync(T context) + { + var taskName = ReadTaskName(); + + if (context.GitHubActions().IsRunningOnGitHubActions) + { + context.Information(""); + context.GitHubActions().Commands.StartGroup(taskName); + } + + context.Information($"Running task '{taskName}' ..."); + + await RunAsyncCore(context).ConfigureAwait(false); + + if (context.GitHubActions().IsRunningOnGitHubActions) + { + context.GitHubActions().Commands.EndGroup(); + } + } + + private string ReadTaskName() + { + var taskNameAttr = GetType().GetCustomAttribute(); + + return taskNameAttr?.Name ?? GetType().Name; + } + + protected abstract Task RunAsyncCore(T context); + public override void Finally(T context) { base.Finally(context); diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs index 59af6201..2eb50bf5 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs @@ -38,7 +38,7 @@ private DotNetBuildSettings CreateDotNetBuildSettings(T context) return dotNetBuildSettings; } - public override Task RunAsync(T context) + protected override Task RunAsyncCore(T context) { var dotnetSettings = CreateDotNetBuildSettings(context); diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs index 7e385073..512f0431 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs @@ -7,7 +7,7 @@ namespace CreativeCoders.CakeBuild.Tasks.Templates; public class CleanTask : FrostingTaskBase where T : BuildContext { - public override Task RunAsync(T context) + protected override Task RunAsyncCore(T context) { var settings = context.GetSettings(); diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs index 526c0750..4e315772 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs @@ -1,4 +1,10 @@ namespace CreativeCoders.CakeBuild.Tasks.Templates; public class CodeCoverageTask : FrostingTaskBase - where T : BuildContext { } + where T : BuildContext +{ + protected override Task RunAsyncCore(T context) + { + throw new NotImplementedException(); + } +} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/NuGetPublishTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/NuGetPublishTask.cs index 504b9af0..808517d3 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/NuGetPublishTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/NuGetPublishTask.cs @@ -1,3 +1,9 @@ namespace CreativeCoders.CakeBuild.Tasks.Templates; -public class NuGetPublishTask : FrostingTaskBase where T : BuildContext { } +public class NuGetPublishTask : FrostingTaskBase where T : BuildContext +{ + protected override Task RunAsyncCore(T context) + { + throw new NotImplementedException(); + } +} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs index 7a24f6ab..367aac43 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs @@ -1,4 +1,10 @@ namespace CreativeCoders.CakeBuild.Tasks.Templates; public class PackTask : FrostingTaskBase - where T : BuildContext { } + where T : BuildContext +{ + protected override Task RunAsyncCore(T context) + { + throw new NotImplementedException(); + } +} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/RestoreTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/RestoreTask.cs index c4ece690..bb171337 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/RestoreTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/RestoreTask.cs @@ -5,7 +5,7 @@ namespace CreativeCoders.CakeBuild.Tasks.Templates; public class RestoreTask : FrostingTaskBase where T : BuildContext { - public override Task RunAsync(T context) + protected override Task RunAsyncCore(T context) { context.DotNetRestore(context.RootDir.FullPath); diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs index de2a083a..bf5c9f93 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs @@ -6,7 +6,7 @@ namespace CreativeCoders.CakeBuild.Tasks.Templates; public class TestTask : FrostingTaskBase where T : BuildContext { - public override Task RunAsync(T context) + protected override Task RunAsyncCore(T context) { context.DotNetTest(context.RootDir.FullPath, CreateDotNetBuildSettings(context)); From 8ad977879209bfe67476f3a44b1675bd906211b9 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Mon, 5 Jan 2026 14:58:53 +0100 Subject: [PATCH 28/73] Remove `AddBuildServerIntegration` from `CakeBuildSample` for simplification --- samples/CakeBuildSample/Program.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/samples/CakeBuildSample/Program.cs b/samples/CakeBuildSample/Program.cs index 8889b782..a4671162 100644 --- a/samples/CakeBuildSample/Program.cs +++ b/samples/CakeBuildSample/Program.cs @@ -10,7 +10,6 @@ static int Main(string[] args) return CakeHostBuilder.Create() .UseBuildContext() .AddDefaultTasks() - .AddBuildServerIntegration() .Build() .Run(args); } From d9d1712f26f9508588ec8f1f29f67660dc2c131a Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Mon, 5 Jan 2026 15:01:48 +0100 Subject: [PATCH 29/73] Annotate `FrostingTaskBase` with [PublicAPI] and update logging in task teardown for consistency --- .../BuildServer/EndGroupTaskTeardown.cs | 2 ++ .../CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/BuildServer/EndGroupTaskTeardown.cs b/source/CakeBuild/CreativeCoders.CakeBuild/BuildServer/EndGroupTaskTeardown.cs index c4c7d292..b9e19dbe 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/BuildServer/EndGroupTaskTeardown.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/BuildServer/EndGroupTaskTeardown.cs @@ -1,4 +1,5 @@ using Cake.Common.Build; +using Cake.Common.Diagnostics; using Cake.Core; using Cake.Frosting; using JetBrains.Annotations; @@ -12,6 +13,7 @@ void IFrostingTaskTeardown.Teardown(ICakeContext context, ITaskTeardownContext i { if (context.GitHubActions().IsRunningOnGitHubActions) { + context.Information(""); context.GitHubActions().Commands.EndGroup(); } } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs index 78a1700c..55c73e6a 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs @@ -2,9 +2,11 @@ using Cake.Common.Build; using Cake.Common.Diagnostics; using Cake.Frosting; +using JetBrains.Annotations; namespace CreativeCoders.CakeBuild.Tasks; +[PublicAPI] public abstract class FrostingTaskBase : AsyncFrostingTask where T : BuildContext { @@ -24,11 +26,12 @@ public sealed override async Task RunAsync(T context) if (context.GitHubActions().IsRunningOnGitHubActions) { + context.Information(""); context.GitHubActions().Commands.EndGroup(); } } - private string ReadTaskName() + protected string ReadTaskName() { var taskNameAttr = GetType().GetCustomAttribute(); From a578af0abc8f819f28a4bf1ad95247aee969fa83 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Mon, 5 Jan 2026 15:04:28 +0100 Subject: [PATCH 30/73] Comment out GitHub Actions group logging in `FrostingTaskBase` and add `AddBuildServerIntegration` to `CakeBuildSample`. --- samples/CakeBuildSample/Program.cs | 1 + .../Tasks/FrostingTaskBase.cs | 20 +++++++++---------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/samples/CakeBuildSample/Program.cs b/samples/CakeBuildSample/Program.cs index a4671162..8889b782 100644 --- a/samples/CakeBuildSample/Program.cs +++ b/samples/CakeBuildSample/Program.cs @@ -10,6 +10,7 @@ static int Main(string[] args) return CakeHostBuilder.Create() .UseBuildContext() .AddDefaultTasks() + .AddBuildServerIntegration() .Build() .Run(args); } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs index 55c73e6a..793ce4d8 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs @@ -14,21 +14,21 @@ public sealed override async Task RunAsync(T context) { var taskName = ReadTaskName(); - if (context.GitHubActions().IsRunningOnGitHubActions) - { - context.Information(""); - context.GitHubActions().Commands.StartGroup(taskName); - } + // if (context.GitHubActions().IsRunningOnGitHubActions) + // { + // context.Information(""); + // context.GitHubActions().Commands.StartGroup(taskName); + // } context.Information($"Running task '{taskName}' ..."); await RunAsyncCore(context).ConfigureAwait(false); - if (context.GitHubActions().IsRunningOnGitHubActions) - { - context.Information(""); - context.GitHubActions().Commands.EndGroup(); - } + // if (context.GitHubActions().IsRunningOnGitHubActions) + // { + // context.Information(""); + // context.GitHubActions().Commands.EndGroup(); + // } } protected string ReadTaskName() From 3129563d7c50a0aecda578d1f3b54b858526c8c5 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Mon, 5 Jan 2026 17:30:33 +0100 Subject: [PATCH 31/73] Refactor and update task settings and implementations for improved modularity and consistency - Changed `ICleanTaskSettings.DefaultDirectoriesToClean` to method `GetDefaultDirectoriesToClean` for better clarity and extensibility. - Introduced `TestProjects` property in `ITestTaskSettings`. - Removed commented GitHub Actions group logging from `FrostingTaskBase` for cleanup. - Streamlined `SampleBuildContext` to use updated `ICleanTaskSettings` API. --- samples/CakeBuildSample/Program.cs | 1 - samples/CakeBuildSample/SampleBuildContext.cs | 4 +- .../Tasks/FrostingTaskBase.cs | 12 ------ .../Templates/Settings/ICleanTaskSettings.cs | 39 ++++++++----------- .../Templates/Settings/ITestTaskSettings.cs | 5 ++- 5 files changed, 23 insertions(+), 38 deletions(-) diff --git a/samples/CakeBuildSample/Program.cs b/samples/CakeBuildSample/Program.cs index 8889b782..8db82481 100644 --- a/samples/CakeBuildSample/Program.cs +++ b/samples/CakeBuildSample/Program.cs @@ -1,5 +1,4 @@ using CreativeCoders.CakeBuild; -using CreativeCoders.CakeBuild.Tasks.Defaults; namespace CakeBuildSample; diff --git a/samples/CakeBuildSample/SampleBuildContext.cs b/samples/CakeBuildSample/SampleBuildContext.cs index 2ad66c5c..068c3ea8 100644 --- a/samples/CakeBuildSample/SampleBuildContext.cs +++ b/samples/CakeBuildSample/SampleBuildContext.cs @@ -12,6 +12,6 @@ public class SampleBuildContext : BuildContext, IDefaultTaskSettings { public SampleBuildContext(ICakeContext context) : base(context) { } - IList ICleanTaskSettings.DirectoriesToClean => - this.CastAs().DefaultDirectoriesToClean.AddRange(RootDir.Combine(".tests")); + public IList DirectoriesToClean => this.CastAs() + .GetDefaultDirectoriesToClean().AddRange(RootDir.Combine(".tests")); } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs index 793ce4d8..9afce3f8 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs @@ -14,21 +14,9 @@ public sealed override async Task RunAsync(T context) { var taskName = ReadTaskName(); - // if (context.GitHubActions().IsRunningOnGitHubActions) - // { - // context.Information(""); - // context.GitHubActions().Commands.StartGroup(taskName); - // } - context.Information($"Running task '{taskName}' ..."); await RunAsyncCore(context).ConfigureAwait(false); - - // if (context.GitHubActions().IsRunningOnGitHubActions) - // { - // context.Information(""); - // context.GitHubActions().Commands.EndGroup(); - // } } protected string ReadTaskName() diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs index 54d48531..cffeff21 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs @@ -1,5 +1,3 @@ -using System.Collections.Generic; -using System.Linq; using Cake.Core.IO; namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; @@ -7,35 +5,32 @@ namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; [CakeTaskSettings] public interface ICleanTaskSettings : IBuildContextAccessor { - IList DirectoriesToClean => DefaultDirectoriesToClean; + IList DirectoriesToClean => GetDefaultDirectoriesToClean(); - IList DefaultDirectoriesToClean + IList GetDefaultDirectoriesToClean() { - get - { - var dirs = new List(); + var dirs = new List(); - string[] defaultSourceDirs = ["source", "src", "samples", "tests"]; + string[] defaultSourceDirs = ["source", "src", "samples", "tests"]; - foreach (var defaultSourceDir in defaultSourceDirs) - { - var sourceDir = Context.RootDir.Combine(defaultSourceDir); + foreach (var defaultSourceDir in defaultSourceDirs) + { + var sourceDir = Context.RootDir.Combine(defaultSourceDir); - if (Context.FileSystem.Exist(sourceDir)) - { - var binDirs = Context.Globber.Match(sourceDir.FullPath + "/**/bin") - .OfType(); + if (Context.FileSystem.Exist(sourceDir)) + { + var binDirs = Context.Globber.Match(sourceDir.FullPath + "/**/bin") + .OfType(); - dirs.AddRange(binDirs); + dirs.AddRange(binDirs); - var objDirs = Context.Globber.Match(sourceDir.FullPath + "/**/obj") - .OfType(); + var objDirs = Context.Globber.Match(sourceDir.FullPath + "/**/obj") + .OfType(); - dirs.AddRange(objDirs); - } + dirs.AddRange(objDirs); } - - return dirs; } + + return dirs; } } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ITestTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ITestTaskSettings.cs index b51444f0..a51892dc 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ITestTaskSettings.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ITestTaskSettings.cs @@ -1,4 +1,7 @@ namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; [CakeTaskSettings] -public interface ITestTaskSettings { } +public interface ITestTaskSettings +{ + IEnumerable TestProjects { get; } +} From 9c0aca6fe918517df71f0b112a362d1d4f5ec702 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Mon, 5 Jan 2026 17:55:39 +0100 Subject: [PATCH 32/73] Annotate interfaces with [PublicAPI], refactor exception handling in CakeContextExtensions, enhance `ITestTaskSettings`, and update task implementations for improved modularity --- .../CreativeCoders.CakeBuild/BuildContext.cs | 11 ++++----- .../BuildServer/EndGroupTaskTeardown.cs | 8 ++++--- .../BuildServer/StartGroupTaskSetup.cs | 8 ++++--- .../CakeContextExtensions.cs | 8 +++++-- .../ICakeHostBuilder.cs | 2 ++ .../StaticGitVersion.cs | 2 +- .../Tasks/Defaults/IDefaultTaskSettings.cs | 2 +- .../Tasks/FrostingTaskBase.cs | 1 - .../Templates/Settings/ITestTaskSettings.cs | 24 +++++++++++++++++-- .../Tasks/Templates/TestTask.cs | 14 ++++++++++- 10 files changed, 60 insertions(+), 20 deletions(-) diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs b/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs index 6ff7d070..db0cf9d6 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs @@ -4,7 +4,6 @@ using Cake.Core; using Cake.Core.IO; using Cake.Frosting; -using CreativeCoders.CakeBuild.Tasks.Templates.Settings; using CreativeCoders.Core.IO; using JetBrains.Annotations; @@ -64,14 +63,14 @@ private FilePath FindRootSolution(ICakeContext context) var solution = solutions.FirstOrDefault(); - if (solution == null) + if (solution != null) { - context.Error("No solution file found."); - - throw new InvalidOperationException("No solution file found"); + return solution; } - return solution; + context.Error("No solution file found."); + + throw new InvalidOperationException("No solution file found"); } public FilePath SolutionFile { get; } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/BuildServer/EndGroupTaskTeardown.cs b/source/CakeBuild/CreativeCoders.CakeBuild/BuildServer/EndGroupTaskTeardown.cs index b9e19dbe..9490e08d 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/BuildServer/EndGroupTaskTeardown.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/BuildServer/EndGroupTaskTeardown.cs @@ -11,10 +11,12 @@ public class EndGroupTaskTeardown : IFrostingTaskTeardown { void IFrostingTaskTeardown.Teardown(ICakeContext context, ITaskTeardownContext info) { - if (context.GitHubActions().IsRunningOnGitHubActions) + if (!context.GitHubActions().IsRunningOnGitHubActions) { - context.Information(""); - context.GitHubActions().Commands.EndGroup(); + return; } + + context.Information(""); + context.GitHubActions().Commands.EndGroup(); } } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/BuildServer/StartGroupTaskSetup.cs b/source/CakeBuild/CreativeCoders.CakeBuild/BuildServer/StartGroupTaskSetup.cs index f667ad82..ff3c0586 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/BuildServer/StartGroupTaskSetup.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/BuildServer/StartGroupTaskSetup.cs @@ -11,10 +11,12 @@ public class StartGroupTaskSetup : IFrostingTaskSetup { void IFrostingTaskSetup.Setup(ICakeContext context, ITaskSetupContext info) { - if (context.GitHubActions().IsRunningOnGitHubActions) + if (!context.GitHubActions().IsRunningOnGitHubActions) { - context.Information(""); - context.GitHubActions().Commands.StartGroup(info.Task.Name); + return; } + + context.Information(""); + context.GitHubActions().Commands.StartGroup(info.Task.Name); } } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/CakeContextExtensions.cs b/source/CakeBuild/CreativeCoders.CakeBuild/CakeContextExtensions.cs index af61d656..6354feb3 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/CakeContextExtensions.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/CakeContextExtensions.cs @@ -1,9 +1,11 @@ using Cake.Common.Tools.GitVersion; using Cake.Core; using Cake.Frosting; +using JetBrains.Annotations; namespace CreativeCoders.CakeBuild; +[PublicAPI] public static class CakeContextExtensions { public static bool TaskHasRun(this BuildContext context) @@ -18,9 +20,11 @@ public static GitVersion GetGitVersionSafe(this ICakeContext context, { try { - return context.GitVersion(); + return gitVersionSettings == null + ? context.GitVersion() + : context.GitVersion(gitVersionSettings); } - catch (Exception e) + catch (Exception) { return StaticGitVersion.Create(major ?? "0", minor ?? "0", patch ?? "0", build ?? "1", ""); } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/ICakeHostBuilder.cs b/source/CakeBuild/CreativeCoders.CakeBuild/ICakeHostBuilder.cs index c434be80..cc2cbc12 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/ICakeHostBuilder.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/ICakeHostBuilder.cs @@ -1,7 +1,9 @@ using Cake.Frosting; +using JetBrains.Annotations; namespace CreativeCoders.CakeBuild; +[PublicAPI] public interface ICakeHostBuilder { ICakeHostBuilder AddBuildServerIntegration(); diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/StaticGitVersion.cs b/source/CakeBuild/CreativeCoders.CakeBuild/StaticGitVersion.cs index 4af8d11f..7fb903df 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/StaticGitVersion.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/StaticGitVersion.cs @@ -34,7 +34,7 @@ public static GitVersion Create(string major, string minor, string patch, string NuGetPreReleaseTagV2 = preReleaseTag, CommitDate = DateTimeOffset.Now.ToString(), PreReleaseTagWithDash = $"-{preReleaseTag}", - PreReleaseLabelWithDash = $"-{preReleaseTag}", + PreReleaseLabelWithDash = $"-{preReleaseTag}" }; } } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/IDefaultTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/IDefaultTaskSettings.cs index 24e79464..65c3219f 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/IDefaultTaskSettings.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/IDefaultTaskSettings.cs @@ -2,4 +2,4 @@ namespace CreativeCoders.CakeBuild.Tasks.Defaults; -public interface IDefaultTaskSettings : ICleanTaskSettings { } +public interface IDefaultTaskSettings : ICleanTaskSettings, ITestTaskSettings { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs index 9afce3f8..e239822d 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs @@ -1,5 +1,4 @@ using System.Reflection; -using Cake.Common.Build; using Cake.Common.Diagnostics; using Cake.Frosting; using JetBrains.Annotations; diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ITestTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ITestTaskSettings.cs index a51892dc..cdf3590a 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ITestTaskSettings.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ITestTaskSettings.cs @@ -1,7 +1,27 @@ +using Cake.Common.Solution; +using Cake.Core.IO; + namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; [CakeTaskSettings] -public interface ITestTaskSettings +public interface ITestTaskSettings : IBuildContextAccessor { - IEnumerable TestProjects { get; } + IEnumerable TestProjects + { + get + { + var solution = Context.ParseSolution(Context.SolutionFile); + + var testProjects = solution.Projects + .Where(p => + p.Path.MakeAbsolute(Context.Environment).FullPath.StartsWith(TestSourceDir.FullPath, + StringComparison.InvariantCulture)); + + return testProjects + .Select(x => x.Path) + .Where(x => x.GetExtension()?.ToLower() == ".csproj"); + } + } + + DirectoryPath TestSourceDir => Context.RootDir.Combine("tests"); } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs index bf5c9f93..1cdb6a03 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs @@ -1,6 +1,7 @@ using Cake.Common.Diagnostics; using Cake.Common.Tools.DotNet; using Cake.Common.Tools.DotNet.Test; +using CreativeCoders.CakeBuild.Tasks.Templates.Settings; namespace CreativeCoders.CakeBuild.Tasks.Templates; @@ -8,7 +9,18 @@ public class TestTask : FrostingTaskBase where T : BuildContext { protected override Task RunAsyncCore(T context) { - context.DotNetTest(context.RootDir.FullPath, CreateDotNetBuildSettings(context)); + var testSettings = context.GetSettings(); + + var testProjects = testSettings.TestProjects.OrderBy(x => x.FullPath).ToArray(); + + context.Information($"Found {testProjects.Length} test project(s)"); + + foreach (var testProject in testProjects) + { + context.Information($"Test project found: {testProject.GetFilename()}"); + + context.DotNetTest(testProject.FullPath, CreateDotNetBuildSettings(context)); + } return Task.CompletedTask; } From 1f6795ea53a3f0e760d463673db9a4d8fe0c0d7b Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Mon, 5 Jan 2026 18:03:28 +0100 Subject: [PATCH 33/73] Annotate `TestTask` with [PublicAPI] and update `ITestTaskSettings` to handle `.slnx` file format limitations --- .../Tasks/Templates/Settings/ITestTaskSettings.cs | 6 ++++++ .../CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs | 2 ++ 2 files changed, 8 insertions(+) diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ITestTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ITestTaskSettings.cs index cdf3590a..dc861e44 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ITestTaskSettings.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ITestTaskSettings.cs @@ -10,6 +10,12 @@ IEnumerable TestProjects { get { + if (Context.SolutionFile.GetExtension()?.ToLower() != ".sln") + { + // Currently no support for new xml based slnx solution file format + return []; + } + var solution = Context.ParseSolution(Context.SolutionFile); var testProjects = solution.Projects diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs index 1cdb6a03..d7efecf6 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs @@ -2,9 +2,11 @@ using Cake.Common.Tools.DotNet; using Cake.Common.Tools.DotNet.Test; using CreativeCoders.CakeBuild.Tasks.Templates.Settings; +using JetBrains.Annotations; namespace CreativeCoders.CakeBuild.Tasks.Templates; +[PublicAPI] public class TestTask : FrostingTaskBase where T : BuildContext { protected override Task RunAsyncCore(T context) From 66dc309c9d2b6e02cf6ec698881133a488c41957 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Tue, 6 Jan 2026 13:05:13 +0100 Subject: [PATCH 34/73] Add code coverage task implementation and update related settings for enhanced test reporting - Implement `CodeCoverageTask` using `ReportGenerator`. - Enhance `IBuildContext` with properties for managing code coverage directories and reports. - Update `TestTask` to support coverage collection and generate TRX reports. - Refactor `ITestTaskSettings` to include coverage-related settings. - Modify `.github/workflows` to execute the `codecoverage` task in the integration pipeline. - Add `ReportGenerator` to `CakeBuildSample` dependencies. --- .github/workflows/integration.yml | 2 +- samples/CakeBuildSample/CakeBuildSample.csproj | 1 + .../CreativeCoders.CakeBuild/BuildContext.cs | 6 +++++- .../CreativeCoders.CakeBuild/IBuildContext.cs | 6 +++++- .../Tasks/Templates/CodeCoverageTask.cs | 10 ++++++++-- .../Templates/Settings/ICleanTaskSettings.cs | 2 +- .../Tasks/Templates/Settings/ITestTaskSettings.cs | 4 +++- .../Tasks/Templates/TestTask.cs | 15 ++++++++++++--- 8 files changed, 36 insertions(+), 10 deletions(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index bc984aa3..ed42a225 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -42,7 +42,7 @@ jobs: - name: 'Run: DeployNuGet' run: | cd ./samples/CakeBuildSample - dotnet run -- -t test + dotnet run -- -t codecoverage env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # - name: 'Publish: coverage_report' diff --git a/samples/CakeBuildSample/CakeBuildSample.csproj b/samples/CakeBuildSample/CakeBuildSample.csproj index ec82a3ec..c9145951 100644 --- a/samples/CakeBuildSample/CakeBuildSample.csproj +++ b/samples/CakeBuildSample/CakeBuildSample.csproj @@ -9,6 +9,7 @@ + diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs b/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs index db0cf9d6..05cc583f 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs @@ -81,7 +81,11 @@ private FilePath FindRootSolution(ICakeContext context) public virtual DirectoryPath TestOutputBasePath => RootDir.Combine(".tests"); - public virtual DirectoryPath CodeCoverageResultsDir => TestOutputBasePath.Combine("coverage-results"); + public virtual DirectoryPath TestResultsDir => TestOutputBasePath.Combine("results"); + + public virtual DirectoryPath CodeCoverageDir => TestOutputBasePath.Combine("coverage"); + + public virtual DirectoryPath CodeCoverageReportDir => TestOutputBasePath.Combine("coverage-report"); public virtual string BuildConfiguration => this.BuildSystem().IsLocalBuild ? "Debug" : "Release"; diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/IBuildContext.cs b/source/CakeBuild/CreativeCoders.CakeBuild/IBuildContext.cs index ea25ecc6..e7091f7b 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/IBuildContext.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/IBuildContext.cs @@ -15,7 +15,11 @@ public interface IBuildContext : ICakeContext DirectoryPath TestOutputBasePath { get; } - DirectoryPath CodeCoverageResultsDir { get; } + DirectoryPath TestResultsDir { get; } + + DirectoryPath CodeCoverageDir { get; } + + DirectoryPath CodeCoverageReportDir { get; } string BuildConfiguration { get; } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs index 4e315772..86c6dec8 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs @@ -1,10 +1,16 @@ -namespace CreativeCoders.CakeBuild.Tasks.Templates; +using Cake.Common.Tools.ReportGenerator; +using Cake.Core.IO; + +namespace CreativeCoders.CakeBuild.Tasks.Templates; public class CodeCoverageTask : FrostingTaskBase where T : BuildContext { protected override Task RunAsyncCore(T context) { - throw new NotImplementedException(); + context.ReportGenerator(new GlobPattern(context.CodeCoverageDir.FullPath + "/**/*.xml"), + context.CodeCoverageReportDir); + + return Task.CompletedTask; } } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs index cffeff21..43c4d02e 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs @@ -11,7 +11,7 @@ IList GetDefaultDirectoriesToClean() { var dirs = new List(); - string[] defaultSourceDirs = ["source", "src", "samples", "tests"]; + string[] defaultSourceDirs = ["source", "src", "tests"]; foreach (var defaultSourceDir in defaultSourceDirs) { diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ITestTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ITestTaskSettings.cs index dc861e44..56879aff 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ITestTaskSettings.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ITestTaskSettings.cs @@ -12,7 +12,7 @@ IEnumerable TestProjects { if (Context.SolutionFile.GetExtension()?.ToLower() != ".sln") { - // Currently no support for new xml based slnx solution file format + // Currently no support for new XML based slnx solution file format return []; } @@ -29,5 +29,7 @@ IEnumerable TestProjects } } + bool GenerateCoverageReport => true; + DirectoryPath TestSourceDir => Context.RootDir.Combine("tests"); } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs index d7efecf6..8b5d75ae 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs @@ -1,6 +1,7 @@ using Cake.Common.Diagnostics; using Cake.Common.Tools.DotNet; using Cake.Common.Tools.DotNet.Test; +using Cake.Core.IO; using CreativeCoders.CakeBuild.Tasks.Templates.Settings; using JetBrains.Annotations; @@ -21,7 +22,8 @@ protected override Task RunAsyncCore(T context) { context.Information($"Test project found: {testProject.GetFilename()}"); - context.DotNetTest(testProject.FullPath, CreateDotNetBuildSettings(context)); + context.DotNetTest(testProject.FullPath, + CreateDotNetBuildSettings(context, testProject, testSettings)); } return Task.CompletedTask; @@ -29,12 +31,19 @@ protected override Task RunAsyncCore(T context) protected virtual void ApplyDotNetTestSettings(T context, DotNetTestSettings dotNetBuildSettings) { } - private DotNetTestSettings CreateDotNetBuildSettings(T context) + private DotNetTestSettings CreateDotNetBuildSettings(T context, FilePath testProject, + ITestTaskSettings testSettings) { + var testResultFile = + context.TestResultsDir.CombineWithFilePath($"{testProject.GetFilenameWithoutExtension()}.trx"); + var dotNetTestSettings = new DotNetTestSettings { Configuration = context.BuildConfiguration, - NoBuild = context.HasExecutedTask(typeof(BuildTask)) + NoBuild = context.HasExecutedTask(typeof(BuildTask)), + Loggers = [$"trx;LogFileName={testResultFile}"], + Collectors = testSettings.GenerateCoverageReport ? ["XPlat Code Coverage"] : [], + ResultsDirectory = context.CodeCoverageDir }; ApplyDotNetTestSettings(context, dotNetTestSettings); From e742b8eaa552bf79e1ea4dd363e5566f90521ffe Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Tue, 6 Jan 2026 13:15:13 +0100 Subject: [PATCH 35/73] Add detailed build version logging to `BuildTask` - Log informational, assembly, and file versions during solution build for improved traceability. --- .../CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs index 2eb50bf5..83ab3f41 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs @@ -45,6 +45,11 @@ protected override Task RunAsyncCore(T context) context.Log.Information("Building solution {0} with configuration {1}", context.SolutionFile.FullPath, dotnetSettings.Configuration); + context.Information("Build with informational version: " + + dotnetSettings.MSBuildSettings.InformationalVersion); + context.Information("Build with assembly version: " + dotnetSettings.MSBuildSettings.AssemblyVersion); + context.Information("Build with file version: " + dotnetSettings.MSBuildSettings.FileVersion); + context.DotNetBuild(context.SolutionFile.FullPath, dotnetSettings); return Task.CompletedTask; From 88bec6acbec79f88954910790e8c189d2ea24cc8 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Tue, 6 Jan 2026 13:17:23 +0100 Subject: [PATCH 36/73] Add `GitVersion.Tool` as a dependency to `CakeBuildSample` --- samples/CakeBuildSample/CakeBuildSample.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/samples/CakeBuildSample/CakeBuildSample.csproj b/samples/CakeBuildSample/CakeBuildSample.csproj index c9145951..d9b57ee9 100644 --- a/samples/CakeBuildSample/CakeBuildSample.csproj +++ b/samples/CakeBuildSample/CakeBuildSample.csproj @@ -10,6 +10,7 @@ + From 85c3aa2fa09788ceb0d642b97b0140c52216afde Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Tue, 6 Jan 2026 13:47:28 +0100 Subject: [PATCH 37/73] Update `ICodeCoverageTaskSettings` with .NET framework property and configure tool paths in `CakeBuildSample` - Added `Framework` property to `ICodeCoverageTaskSettings` for dynamic .NET version handling. - Configured `CakeHost` in `CakeBuildSample` to use a temporary tools directory and install required tools. --- samples/CakeBuildSample/Program.cs | 17 ++++++++++++++++- .../Settings/ICodeCoverageTaskSettings.cs | 7 ++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/samples/CakeBuildSample/Program.cs b/samples/CakeBuildSample/Program.cs index 8db82481..d13bf478 100644 --- a/samples/CakeBuildSample/Program.cs +++ b/samples/CakeBuildSample/Program.cs @@ -1,4 +1,8 @@ -using CreativeCoders.CakeBuild; +using Cake.Core.IO; +using Cake.Frosting; +using CreativeCoders.CakeBuild; +using CreativeCoders.Core.IO; +using CreativeCoders.Core.SysEnvironment; namespace CakeBuildSample; @@ -10,6 +14,17 @@ static int Main(string[] args) .UseBuildContext() .AddDefaultTasks() .AddBuildServerIntegration() + .ConfigureHost(x => + { + var tempToolsPath = FileSys.Path.Combine(FileSys.Path.GetTempPath(), ".cake-tools"); + + Console.WriteLine($"Using temp tools path: {tempToolsPath}"); + + x.SetToolPath(tempToolsPath); + + x.InstallTool(new Uri("nuget:?package=GitVersion.Tool&version=6.5.1")); + x.InstallTool(new Uri("nuget:?package=dotnet-reportgenerator-globaltool&version=5.5.1")); + }) .Build() .Run(args); } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICodeCoverageTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICodeCoverageTaskSettings.cs index d071fc3b..a5e1f324 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICodeCoverageTaskSettings.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICodeCoverageTaskSettings.cs @@ -1,4 +1,9 @@ +using CreativeCoders.Core.SysEnvironment; + namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; [CakeTaskSettings] -public interface ICodeCoverageTaskSettings { } +public interface ICodeCoverageTaskSettings +{ + string Framework => $"net{Env.Version.Major}.0"; +} From a7fe54662a6b264a068efdb1cd3d3ba29f42586c Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Tue, 6 Jan 2026 13:51:46 +0100 Subject: [PATCH 38/73] Enable `windows-latest` runner in the integration workflow and update `DeployNuGet` step to run code coverage task. --- .github/workflows/integration.yml | 38 ++++++++++++++++--------------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index ed42a225..3e8cbfb5 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -51,24 +51,26 @@ jobs: # with: # name: coverage_report # path: .tests/coverage_report -# windows-latest: -# name: windows-latest -# runs-on: windows-latest -# steps: -# - uses: actions/checkout@v4 -# with: -# fetch-depth: 0 -# - name: 'Cache: .nuke/temp, ~/.nuget/packages' -# uses: actions/cache@v4 -# with: -# path: | -# .nuke/temp -# ~/.nuget/packages -# key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} -# - name: 'Run: DeployNuGet' -# run: ./build.cmd DeployNuGet -# env: -# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + windows-latest: + name: windows-latest + runs-on: windows-latest + steps: + - uses: actions/checkout@v5 + with: + fetch-depth: 0 + # - name: 'Cache: .nuke/temp, ~/.nuget/packages' + # uses: actions/cache@v4 + # with: + # path: | + # .nuke/temp + # ~/.nuget/packages + # key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} + - name: 'Run: DeployNuGet' + run: | + cd ./samples/CakeBuildSample + dotnet run -- -t codecoverage + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # - name: 'Publish: coverage_report' # uses: actions/upload-artifact@v4 # if: runner.os == 'Linux' From 46afa079d4d445a34012fa5a2a231d748115f2f6 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Tue, 6 Jan 2026 14:14:19 +0100 Subject: [PATCH 39/73] Update `CodeCoverageTask` to log ReportGenerator process arguments and enhance tool installation in `CakeBuildSample` - Add diagnostic logging for ReportGenerator process arguments in `CodeCoverageTask` using `Information`. - Use `DotNetToolPackageInstaller` in `CakeBuildSample` for improved tool installation patterns. - Update tool URIs to use `dotnet:` scheme for consistency. --- samples/CakeBuildSample/Program.cs | 6 ++++-- .../Tasks/Templates/CodeCoverageTask.cs | 14 ++++++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/samples/CakeBuildSample/Program.cs b/samples/CakeBuildSample/Program.cs index d13bf478..a80e4197 100644 --- a/samples/CakeBuildSample/Program.cs +++ b/samples/CakeBuildSample/Program.cs @@ -1,4 +1,5 @@ using Cake.Core.IO; +using Cake.DotNetTool.Module; using Cake.Frosting; using CreativeCoders.CakeBuild; using CreativeCoders.Core.IO; @@ -22,8 +23,9 @@ static int Main(string[] args) x.SetToolPath(tempToolsPath); - x.InstallTool(new Uri("nuget:?package=GitVersion.Tool&version=6.5.1")); - x.InstallTool(new Uri("nuget:?package=dotnet-reportgenerator-globaltool&version=5.5.1")); + x.UsePackageInstaller(); + x.InstallTool(new Uri("dotnet:?package=GitVersion.Tool&version=6.5.1")); + x.InstallTool(new Uri("dotnet:?package=dotnet-reportgenerator-globaltool&version=5.5.1")); }) .Build() .Run(args); diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs index 86c6dec8..c486059e 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs @@ -1,4 +1,5 @@ -using Cake.Common.Tools.ReportGenerator; +using Cake.Common.Diagnostics; +using Cake.Common.Tools.ReportGenerator; using Cake.Core.IO; namespace CreativeCoders.CakeBuild.Tasks.Templates; @@ -8,8 +9,17 @@ public class CodeCoverageTask : FrostingTaskBase { protected override Task RunAsyncCore(T context) { + var reportGeneratorSettings = new ReportGeneratorSettings + { + SetupProcessSettings = x => + { + context.Information( + $"ReportGenerator Process Args: {string.Join("", x.Arguments.Select(arg => arg.RenderSafe()))}"); + } + }; + context.ReportGenerator(new GlobPattern(context.CodeCoverageDir.FullPath + "/**/*.xml"), - context.CodeCoverageReportDir); + context.CodeCoverageReportDir, reportGeneratorSettings); return Task.CompletedTask; } From fc0c589adcbdcfc32fe23c5b99736699e9bb1f50 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Tue, 6 Jan 2026 16:16:58 +0100 Subject: [PATCH 40/73] Update `CodeCoverageTask` to use `ICodeCoverageTaskSettings` for dynamic configuration - Refactor `CodeCoverageTask` to retrieve settings from `ICodeCoverageTaskSettings`. - Add `ReportGlobPattern` and `ReportTypes` --- .../Tasks/Templates/CodeCoverageTask.cs | 11 +++++------ .../Templates/Settings/ICodeCoverageTaskSettings.cs | 12 +++++++++--- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs index c486059e..cc4ece41 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs @@ -1,6 +1,7 @@ using Cake.Common.Diagnostics; using Cake.Common.Tools.ReportGenerator; using Cake.Core.IO; +using CreativeCoders.CakeBuild.Tasks.Templates.Settings; namespace CreativeCoders.CakeBuild.Tasks.Templates; @@ -9,16 +10,14 @@ public class CodeCoverageTask : FrostingTaskBase { protected override Task RunAsyncCore(T context) { + var codeCoverageSettings = context.GetSettings(); + var reportGeneratorSettings = new ReportGeneratorSettings { - SetupProcessSettings = x => - { - context.Information( - $"ReportGenerator Process Args: {string.Join("", x.Arguments.Select(arg => arg.RenderSafe()))}"); - } + ReportTypes = codeCoverageSettings.ReportTypes.ToList() }; - context.ReportGenerator(new GlobPattern(context.CodeCoverageDir.FullPath + "/**/*.xml"), + context.ReportGenerator(new GlobPattern(codeCoverageSettings.ReportGlobPattern), context.CodeCoverageReportDir, reportGeneratorSettings); return Task.CompletedTask; diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICodeCoverageTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICodeCoverageTaskSettings.cs index a5e1f324..eaf19585 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICodeCoverageTaskSettings.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICodeCoverageTaskSettings.cs @@ -1,9 +1,15 @@ -using CreativeCoders.Core.SysEnvironment; +using Cake.Common.Tools.ReportGenerator; namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; [CakeTaskSettings] -public interface ICodeCoverageTaskSettings +public interface ICodeCoverageTaskSettings : IBuildContextAccessor { - string Framework => $"net{Env.Version.Major}.0"; + IEnumerable ReportTypes => + [ + ReportGeneratorReportType.Html, + ReportGeneratorReportType.MarkdownSummaryGithub + ]; + + string ReportGlobPattern => Context.CodeCoverageDir.FullPath + "/**/*.xml"; } From 0f49c194bd0c9986bedfe76af9236675ae469c27 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Tue, 6 Jan 2026 17:03:06 +0100 Subject: [PATCH 41/73] Add `IPackTaskSettings` and implement `PackTask` with NuGet packaging functionality - Introduced `IPackTaskSettings` for configuring NuGet packaging properties. - Implemented `PackTask` to use `DotNetPack` with dynamic settings retrieval. - Updated `IDefaultTaskSettings` to include `IPackTaskSettings`. - Enhanced `BuildTask` with detailed package version logging. - Modified `GitVersion.yml` for improved feature branch regex and deployment configurations. --- GitVersion.yml | 7 +++- .../Tasks/Defaults/IDefaultTaskSettings.cs | 3 +- .../Tasks/Templates/BuildTask.cs | 4 +- .../Tasks/Templates/PackTask.cs | 40 ++++++++++++++++++- .../Templates/Settings/IPackTaskSettings.cs | 15 ++++++- 5 files changed, 62 insertions(+), 7 deletions(-) diff --git a/GitVersion.yml b/GitVersion.yml index e554e6f6..cc29f663 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -9,15 +9,18 @@ no-bump-message: '\+semver:\s?(none|skip)' mode: ContinuousDeployment branches: feature: - mode: ContinuousDeployment + mode: ManualDeployment label: feature.{BranchName} increment: Minor track-merge-target: false - regex: ^features?[/-] + regex: ^features?[\/-](?.+) + prevent-increment: + when-current-commit-tagged: false source-branches: - main tracks-release-branches: false is-release-branch: false + is-main-branch: false pre-release-weight: 30000 main: mode: ContinuousDeployment diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/IDefaultTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/IDefaultTaskSettings.cs index 65c3219f..a1543cbe 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/IDefaultTaskSettings.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/IDefaultTaskSettings.cs @@ -2,4 +2,5 @@ namespace CreativeCoders.CakeBuild.Tasks.Defaults; -public interface IDefaultTaskSettings : ICleanTaskSettings, ITestTaskSettings { } +public interface IDefaultTaskSettings : ICleanTaskSettings, ITestTaskSettings, ICodeCoverageTaskSettings, + IPackTaskSettings { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs index 83ab3f41..480de321 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs @@ -24,7 +24,8 @@ private DotNetBuildSettings CreateDotNetBuildSettings(T context) { InformationalVersion = context.Version.InformationalVersion, AssemblyVersion = context.Version.AssemblySemVer, - FileVersion = context.Version.AssemblySemFileVer + FileVersion = context.Version.AssemblySemFileVer, + PackageVersion = context.Version.SemVer } }; @@ -49,6 +50,7 @@ protected override Task RunAsyncCore(T context) dotnetSettings.MSBuildSettings.InformationalVersion); context.Information("Build with assembly version: " + dotnetSettings.MSBuildSettings.AssemblyVersion); context.Information("Build with file version: " + dotnetSettings.MSBuildSettings.FileVersion); + context.Information("Build with package version: " + dotnetSettings.MSBuildSettings.PackageVersion); context.DotNetBuild(context.SolutionFile.FullPath, dotnetSettings); diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs index 367aac43..d4afdaf5 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs @@ -1,10 +1,46 @@ -namespace CreativeCoders.CakeBuild.Tasks.Templates; +using Cake.Common.Tools.DotNet; +using Cake.Common.Tools.DotNet.MSBuild; +using Cake.Common.Tools.DotNet.Pack; +using CreativeCoders.CakeBuild.Tasks.Templates.Settings; + +namespace CreativeCoders.CakeBuild.Tasks.Templates; public class PackTask : FrostingTaskBase where T : BuildContext { protected override Task RunAsyncCore(T context) { - throw new NotImplementedException(); + var packSettings = context.GetSettings(); + + context.DotNetPack(context.SolutionFile.FullPath, CreateDotNetPackSettings(context, packSettings)); + + return Task.CompletedTask; + } + + private DotNetPackSettings CreateDotNetPackSettings(T context, IPackTaskSettings packSettings) + { + var dotNetPackSettings = new DotNetPackSettings + { + OutputDirectory = packSettings.OutputDirectory, + Configuration = context.BuildConfiguration, + NoBuild = context.HasExecutedTask(typeof(BuildTask)), + IncludeSymbols = true, + SymbolPackageFormat = "snupkg", + + MSBuildSettings = new DotNetMSBuildSettings + { + InformationalVersion = context.Version.InformationalVersion, + AssemblyVersion = context.Version.AssemblySemVer, + FileVersion = context.Version.AssemblySemFileVer, + PackageVersion = context.Version.SemVer, + } + }; + + dotNetPackSettings.MSBuildSettings.WithProperty("PackageProjectUrl", packSettings.PackageProjectUrl); + dotNetPackSettings.MSBuildSettings.WithProperty("PackageLicenseExpression", + packSettings.PackageLicenseExpression); + dotNetPackSettings.MSBuildSettings.WithProperty("PackageLicenseUrl", packSettings.PackageLicenseUrl); + + return dotNetPackSettings; } } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IPackTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IPackTaskSettings.cs index b6774f0a..4b74a908 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IPackTaskSettings.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/IPackTaskSettings.cs @@ -1,4 +1,17 @@ +using Cake.Core.IO; + namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; [CakeTaskSettings] -public interface IPackTaskSettings { } +public interface IPackTaskSettings : IBuildContextAccessor +{ + DirectoryPath OutputDirectory => Context.ArtifactsDir.Combine("nuget"); + + string Copyright => string.Empty; + + string PackageProjectUrl => string.Empty; + + string PackageLicenseUrl => string.Empty; + + string PackageLicenseExpression => string.Empty; +} From 560af6ecf31db0160e83639626c3bd7f39686b5a Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Wed, 7 Jan 2026 18:51:23 +0100 Subject: [PATCH 42/73] Add `PackageLicenseExpression` and MSBuild settings extensions for enhanced packaging configuration - Introduced `PackageLicenseExpression` with predefined license constants. - Added MSBuild settings extension methods for configuring package properties (`WithPackageProjectUrl`, `WithPackageLicenseUrl`, `WithPackageLicenseExpression`, and `WithCopyright`). - Updated `PackTask` to utilize the new extension methods for cleaner configuration of packaging settings. --- .../DotNetMSBuildSettingsExtensions.cs | 45 +++++++++++++++++++ .../Tasks/Templates/PackTask.cs | 9 ++-- .../Settings/PackageLicenseExpression.cs | 21 +++++++++ 3 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/DotNetMSBuildSettingsExtensions.cs create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/PackageLicenseExpression.cs diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/DotNetMSBuildSettingsExtensions.cs b/source/CakeBuild/CreativeCoders.CakeBuild/DotNetMSBuildSettingsExtensions.cs new file mode 100644 index 00000000..d69b2589 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/DotNetMSBuildSettingsExtensions.cs @@ -0,0 +1,45 @@ +using Cake.Common.Tools.DotNet.MSBuild; + +namespace CreativeCoders.CakeBuild; + +public static class DotNetMSBuildSettingsExtensions +{ + public static DotNetMSBuildSettings WithPackageProjectUrl(this DotNetMSBuildSettings settings, + string packageProjectUrl) + { + return settings.SetPropertyIfNotEmpty("PackageProjectUrl", packageProjectUrl); + } + + public static DotNetMSBuildSettings WithPackageLicenseUrl(this DotNetMSBuildSettings settings, + string packageLicenseUrl) + { + return settings.SetPropertyIfNotEmpty("PackageLicenseUrl", packageLicenseUrl); + } + + public static DotNetMSBuildSettings WithPackageLicenseExpression(this DotNetMSBuildSettings settings, + string packageLicenseExpression) + { + return settings.SetPropertyIfNotEmpty("PackageLicenseExpression", packageLicenseExpression); + } + + public static DotNetMSBuildSettings WithCopyright(this DotNetMSBuildSettings settings, string copyright) + { + return settings.SetPropertyIfNotEmpty("Copyright", copyright); + } + + public static DotNetMSBuildSettings SetProperty(this DotNetMSBuildSettings settings, string propertyName, + string propertyValue) + { + settings.Properties[propertyName] = [propertyValue]; + return settings; + } + + public static DotNetMSBuildSettings SetPropertyIfNotEmpty(this DotNetMSBuildSettings settings, + string propertyName, + string? propertyValue) + { + return string.IsNullOrEmpty(propertyValue) + ? settings + : settings.SetProperty(propertyName, propertyValue); + } +} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs index d4afdaf5..02f0a519 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs @@ -36,10 +36,11 @@ private DotNetPackSettings CreateDotNetPackSettings(T context, IPackTaskSettings } }; - dotNetPackSettings.MSBuildSettings.WithProperty("PackageProjectUrl", packSettings.PackageProjectUrl); - dotNetPackSettings.MSBuildSettings.WithProperty("PackageLicenseExpression", - packSettings.PackageLicenseExpression); - dotNetPackSettings.MSBuildSettings.WithProperty("PackageLicenseUrl", packSettings.PackageLicenseUrl); + dotNetPackSettings.MSBuildSettings + .WithPackageProjectUrl(packSettings.PackageProjectUrl) + .WithPackageLicenseUrl(packSettings.PackageLicenseUrl) + .WithPackageLicenseExpression(packSettings.PackageLicenseExpression) + .WithCopyright(packSettings.Copyright); return dotNetPackSettings; } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/PackageLicenseExpression.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/PackageLicenseExpression.cs new file mode 100644 index 00000000..b1b93938 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/PackageLicenseExpression.cs @@ -0,0 +1,21 @@ +using JetBrains.Annotations; + +namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; + +[PublicAPI] +public static class PackageLicenseExpression +{ + public const string LGPL30Only = "LGPL-3.0-only"; + + public const string LGPL30OrLater = "LGPL-3.0-or-later"; + + public const string MIT = "MIT"; + + public const string GPL30Only = "GPL-3.0-only"; + + public const string GPL30OrLater = "GPL-3.0-or-later"; + + public const string ApacheLicense20 = "Apache-2.0"; + + public const string MPL20 = "MPL-2.0"; +} From 448393701bedd9d74886ce0693a2dcb54b69fee3 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Wed, 7 Jan 2026 19:05:49 +0100 Subject: [PATCH 43/73] Rename `NuGetPublishTask` to `NuGetPushTask` and implement push functionality - Updated class, interfaces, and settings from `NuGetPublish` to `NuGetPush` for consistency with naming conventions. - Added NuGet push implementation using `DotNetNuGetPush` with configurable settings. - Extended `IDefaultTaskSettings` to include `INuGetPushTaskSettings`. --- .../CakeHostExtensions.cs | 2 +- .../Tasks/Defaults/IDefaultTaskSettings.cs | 8 +++- .../{NuGetPublishTask.cs => NuGetPushTask.cs} | 2 +- .../Tasks/Templates/NuGetPublishTask.cs | 9 ---- .../Tasks/Templates/NuGetPushTask.cs | 41 +++++++++++++++++++ .../Settings/INuGetPublishTaskSettings.cs | 4 -- .../Settings/INuGetPushTaskSettings.cs | 11 +++++ 7 files changed, 60 insertions(+), 17 deletions(-) rename source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/{NuGetPublishTask.cs => NuGetPushTask.cs} (73%) delete mode 100755 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/NuGetPublishTask.cs create mode 100755 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/NuGetPushTask.cs delete mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/INuGetPublishTaskSettings.cs create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/INuGetPushTaskSettings.cs diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs b/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs index a0dc5c8c..07a84a8c 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs @@ -64,7 +64,7 @@ public static CakeHost AddDefaultTasks(this CakeHost host) typeof(TestTask), typeof(CodeCoverageTask), typeof(PackTask), - typeof(NuGetPublishTask)); + typeof(NuGetPushTask)); } public static CakeHost AddBuildServerIntegration(this CakeHost host) diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/IDefaultTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/IDefaultTaskSettings.cs index a1543cbe..60885f0f 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/IDefaultTaskSettings.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/IDefaultTaskSettings.cs @@ -2,5 +2,9 @@ namespace CreativeCoders.CakeBuild.Tasks.Defaults; -public interface IDefaultTaskSettings : ICleanTaskSettings, ITestTaskSettings, ICodeCoverageTaskSettings, - IPackTaskSettings { } +public interface IDefaultTaskSettings : + ICleanTaskSettings, + ITestTaskSettings, + ICodeCoverageTaskSettings, + IPackTaskSettings, + INuGetPushTaskSettings; diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/NuGetPublishTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/NuGetPushTask.cs similarity index 73% rename from source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/NuGetPublishTask.cs rename to source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/NuGetPushTask.cs index e401e7b8..f0711290 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/NuGetPublishTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/NuGetPushTask.cs @@ -5,4 +5,4 @@ namespace CreativeCoders.CakeBuild.Tasks.Defaults; [TaskName("NuGetPublish")] [IsDependentOn(typeof(PackTask))] -public class NuGetPublishTask : NuGetPublishTask { } +public class NuGetPushTask : NuGetPushTask { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/NuGetPublishTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/NuGetPublishTask.cs deleted file mode 100755 index 808517d3..00000000 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/NuGetPublishTask.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace CreativeCoders.CakeBuild.Tasks.Templates; - -public class NuGetPublishTask : FrostingTaskBase where T : BuildContext -{ - protected override Task RunAsyncCore(T context) - { - throw new NotImplementedException(); - } -} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/NuGetPushTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/NuGetPushTask.cs new file mode 100755 index 00000000..3b08d58f --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/NuGetPushTask.cs @@ -0,0 +1,41 @@ +using Cake.Common.Diagnostics; +using Cake.Common.Tools.DotNet; +using Cake.Common.Tools.DotNet.NuGet.Push; +using CreativeCoders.CakeBuild.Tasks.Templates.Settings; + +namespace CreativeCoders.CakeBuild.Tasks.Templates; + +public class NuGetPushTask : FrostingTaskBase where T : BuildContext +{ + protected override Task RunAsyncCore(T context) + { + var pushSettings = context.GetSettings(); + + if (pushSettings.SkipPush) + { + context.Information("Skip NuGet push"); + return Task.CompletedTask; + } + + var packSettings = context.GetSettings(); + + var filePath = packSettings.OutputDirectory.GetFilePath("*.nupkg"); + + context.DotNetNuGetPush(filePath, CreateNuGetPushSettings(pushSettings)); + + return Task.CompletedTask; + } + + private static DotNetNuGetPushSettings CreateNuGetPushSettings(INuGetPushTaskSettings settings) + { + var nugetPushSettings = new DotNetNuGetPushSettings + { + Source = settings.NuGetFeedUrl, + ApiKey = settings.NuGetApiKey, + SkipDuplicate = true, + IgnoreSymbols = false + }; + + return nugetPushSettings; + } +} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/INuGetPublishTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/INuGetPublishTaskSettings.cs deleted file mode 100644 index 8f76aee6..00000000 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/INuGetPublishTaskSettings.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; - -[CakeTaskSettings] -public interface INuGetPublishTaskSettings { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/INuGetPushTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/INuGetPushTaskSettings.cs new file mode 100644 index 00000000..e10aa5d9 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/INuGetPushTaskSettings.cs @@ -0,0 +1,11 @@ +namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; + +[CakeTaskSettings] +public interface INuGetPushTaskSettings +{ + string NuGetFeedUrl => string.Empty; + + string NuGetApiKey => string.Empty; + + bool SkipPush => false; +} From 2f48d58974414fe110bcef912f3485abdb262ca6 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Wed, 7 Jan 2026 19:06:05 +0100 Subject: [PATCH 44/73] Rename `[TaskName]` from `NuGetPublish` to `NuGetPush` for consistency with task naming conventions. --- .../CreativeCoders.CakeBuild/Tasks/Defaults/NuGetPushTask.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/NuGetPushTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/NuGetPushTask.cs index f0711290..4b45190d 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/NuGetPushTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/NuGetPushTask.cs @@ -3,6 +3,6 @@ namespace CreativeCoders.CakeBuild.Tasks.Defaults; -[TaskName("NuGetPublish")] +[TaskName("NuGetPush")] [IsDependentOn(typeof(PackTask))] public class NuGetPushTask : NuGetPushTask { } From a5cff4a48aa22f85d59aa5ada6da34a2098370a4 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 10 Jan 2026 13:35:03 +0100 Subject: [PATCH 45/73] - Update task settings to use `GetRequiredSettings` for improved error handling - Add `DefaultHostSetup` to summarize setup configuration during execution - Rename `PackageLicenseExpression` to `PackageLicenseExpressions` for consistency - Introduce `PrintSetupSummary` property for better control over setup logging - Enhance integration workflow for NuGet push with added `NUGET_TOKEN` configuration --- .github/workflows/integration.yml | 9 +++--- samples/CakeBuildSample/SampleBuildContext.cs | 22 ++++++++++++-- .../CreativeCoders.CakeBuild/BuildContext.cs | 14 +++++++-- .../CakeHostBuilder.cs | 30 +++++++++++++++++++ .../CreativeCoders.CakeBuild/IBuildContext.cs | 4 ++- .../Tasks/Templates/BuildTask.cs | 3 +- .../Tasks/Templates/CleanTask.cs | 2 +- .../Tasks/Templates/CodeCoverageTask.cs | 2 +- .../Tasks/Templates/NuGetPushTask.cs | 4 +-- .../Tasks/Templates/PackTask.cs | 2 +- .../Templates/Settings/ICleanTaskSettings.cs | 2 ++ .../Settings/INuGetPushTaskSettings.cs | 6 ++-- ...ession.cs => PackageLicenseExpressions.cs} | 2 +- .../Tasks/Templates/TestTask.cs | 2 +- 14 files changed, 83 insertions(+), 21 deletions(-) rename source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/{PackageLicenseExpression.cs => PackageLicenseExpressions.cs} (91%) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 3e8cbfb5..f7f4b928 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -40,11 +40,12 @@ jobs: # ~/.nuget/packages # key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} - name: 'Run: DeployNuGet' - run: | - cd ./samples/CakeBuildSample - dotnet run -- -t codecoverage env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NUGET_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + cd ./samples/CakeBuildSample + dotnet run -- -t nugetpush # - name: 'Publish: coverage_report' # uses: actions/upload-artifact@v4 # if: runner.os == 'Linux' @@ -68,7 +69,7 @@ jobs: - name: 'Run: DeployNuGet' run: | cd ./samples/CakeBuildSample - dotnet run -- -t codecoverage + dotnet run -- -t nugetpush env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # - name: 'Publish: coverage_report' diff --git a/samples/CakeBuildSample/SampleBuildContext.cs b/samples/CakeBuildSample/SampleBuildContext.cs index 068c3ea8..90c8b099 100644 --- a/samples/CakeBuildSample/SampleBuildContext.cs +++ b/samples/CakeBuildSample/SampleBuildContext.cs @@ -1,3 +1,4 @@ +using Cake.Common.Build; using Cake.Core; using Cake.Core.IO; using CreativeCoders.CakeBuild; @@ -5,13 +6,28 @@ using CreativeCoders.CakeBuild.Tasks.Templates.Settings; using CreativeCoders.Core; using CreativeCoders.Core.Collections; +using JetBrains.Annotations; namespace CakeBuildSample; -public class SampleBuildContext : BuildContext, IDefaultTaskSettings +[UsedImplicitly] +public class SampleBuildContext(ICakeContext context) : BuildContext(context), IDefaultTaskSettings { - public SampleBuildContext(ICakeContext context) : base(context) { } - public IList DirectoriesToClean => this.CastAs() .GetDefaultDirectoriesToClean().AddRange(RootDir.Combine(".tests")); + + + public string Copyright => $"{DateTime.Now.Year} CreativeCoders"; + + public string PackageProjectUrl => "https://github.com/CreativeCodersTeam/Core"; + + public string PackageLicenseExpression => PackageLicenseExpressions.ApacheLicense20; + + public string NuGetFeedUrl => this.GitHubActions().Environment.Workflow.Workflow == "release" + ? "nuget.org" + : "https://nuget.pkg.github.com/CreativeCodersTeam/index.json"; + + public bool SkipPush => this.BuildSystem().IsPullRequest || + this.BuildSystem().IsLocalBuild || + this.GitHubActions().Environment.Runner.OS != "Linux"; } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs b/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs index 05cc583f..46673389 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs @@ -93,6 +93,8 @@ private FilePath FindRootSolution(ICakeContext context) public IList ExecutedTasks => _executedTasks; + public bool PrintSetupSummary => true; + public void AddExecutedTask(IFrostingTask task) { _executedTasks.Add(task); @@ -103,11 +105,19 @@ public bool HasExecutedTask(Type taskType) return _executedTasks.Any(x => x.GetType().IsAssignableTo(taskType)); } - public T GetSettings() where T : class + public T GetRequiredSettings() + where T : class + { + return GetSettings() + ?? throw new InvalidOperationException($"No settings of type '{typeof(T).Name}' found"); + } + + public T? GetSettings() + where T : class { return this as T ?? FindSettingsProperty() - ?? throw new InvalidOperationException($"No settings of type '{typeof(T).Name}' found"); + ?? null; } private T? FindSettingsProperty() diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostBuilder.cs b/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostBuilder.cs index beb885d5..d8b55ed6 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostBuilder.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostBuilder.cs @@ -1,5 +1,9 @@ +using Cake.Common.Diagnostics; +using Cake.Core; using Cake.Frosting; +using CreativeCoders.CakeBuild.Tasks.Templates.Settings; using CreativeCoders.Core; +using JetBrains.Annotations; namespace CreativeCoders.CakeBuild; @@ -77,6 +81,32 @@ public CakeHost Build() _cakeHost.UseContext(); } + _cakeHost.UseSetup(); + return _cakeHost; } } + +[UsedImplicitly] +public class DefaultHostSetup : IFrostingSetup +{ + public void Setup(ICakeContext context, ISetupContext info) + { + if (context is not BuildContext buildContext) + { + return; + } + + if (!buildContext.PrintSetupSummary) + { + return; + } + + var pushSettings = buildContext.GetSettings(); + + if (pushSettings != null) + { + context.Information($"Skip Push: {pushSettings.SkipPush}"); + } + } +} diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/IBuildContext.cs b/source/CakeBuild/CreativeCoders.CakeBuild/IBuildContext.cs index e7091f7b..01c4e2ed 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/IBuildContext.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/IBuildContext.cs @@ -25,12 +25,14 @@ public interface IBuildContext : ICakeContext GitVersion Version { get; } + bool PrintSetupSummary { get; } + IList ExecutedTasks { get; } void AddExecutedTask(IFrostingTask task); bool HasExecutedTask(Type taskType); - T GetSettings() + T GetRequiredSettings() where T : class; } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs index 480de321..e4bad9b8 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs @@ -25,7 +25,8 @@ private DotNetBuildSettings CreateDotNetBuildSettings(T context) InformationalVersion = context.Version.InformationalVersion, AssemblyVersion = context.Version.AssemblySemVer, FileVersion = context.Version.AssemblySemFileVer, - PackageVersion = context.Version.SemVer + PackageVersion = context.Version.SemVer, + Version = context.Version.SemVer } }; diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs index 512f0431..664d384f 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs @@ -9,7 +9,7 @@ public class CleanTask : FrostingTaskBase where T : BuildContext { protected override Task RunAsyncCore(T context) { - var settings = context.GetSettings(); + var settings = context.GetRequiredSettings(); DeleteDirectories(context, settings.DirectoriesToClean); diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs index cc4ece41..bc9e297d 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs @@ -10,7 +10,7 @@ public class CodeCoverageTask : FrostingTaskBase { protected override Task RunAsyncCore(T context) { - var codeCoverageSettings = context.GetSettings(); + var codeCoverageSettings = context.GetRequiredSettings(); var reportGeneratorSettings = new ReportGeneratorSettings { diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/NuGetPushTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/NuGetPushTask.cs index 3b08d58f..0395c426 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/NuGetPushTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/NuGetPushTask.cs @@ -9,7 +9,7 @@ public class NuGetPushTask : FrostingTaskBase where T : BuildContext { protected override Task RunAsyncCore(T context) { - var pushSettings = context.GetSettings(); + var pushSettings = context.GetRequiredSettings(); if (pushSettings.SkipPush) { @@ -17,7 +17,7 @@ protected override Task RunAsyncCore(T context) return Task.CompletedTask; } - var packSettings = context.GetSettings(); + var packSettings = context.GetRequiredSettings(); var filePath = packSettings.OutputDirectory.GetFilePath("*.nupkg"); diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs index 02f0a519..2a1105a6 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs @@ -10,7 +10,7 @@ public class PackTask : FrostingTaskBase { protected override Task RunAsyncCore(T context) { - var packSettings = context.GetSettings(); + var packSettings = context.GetRequiredSettings(); context.DotNetPack(context.SolutionFile.FullPath, CreateDotNetPackSettings(context, packSettings)); diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs index 43c4d02e..8797e211 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs @@ -31,6 +31,8 @@ IList GetDefaultDirectoriesToClean() } } + dirs.AddRange([Context.ArtifactsDir, Context.TestOutputBasePath]); + return dirs; } } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/INuGetPushTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/INuGetPushTaskSettings.cs index e10aa5d9..5ac98d04 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/INuGetPushTaskSettings.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/INuGetPushTaskSettings.cs @@ -1,11 +1,11 @@ namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; [CakeTaskSettings] -public interface INuGetPushTaskSettings +public interface INuGetPushTaskSettings : IBuildContextAccessor { - string NuGetFeedUrl => string.Empty; + string NuGetFeedUrl => "nuget.org"; - string NuGetApiKey => string.Empty; + string NuGetApiKey => Context.Environment.GetEnvironmentVariable("NUGET_TOKEN"); bool SkipPush => false; } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/PackageLicenseExpression.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/PackageLicenseExpressions.cs similarity index 91% rename from source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/PackageLicenseExpression.cs rename to source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/PackageLicenseExpressions.cs index b1b93938..7f4467e3 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/PackageLicenseExpression.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/PackageLicenseExpressions.cs @@ -3,7 +3,7 @@ namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; [PublicAPI] -public static class PackageLicenseExpression +public static class PackageLicenseExpressions { public const string LGPL30Only = "LGPL-3.0-only"; diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs index 8b5d75ae..b19f263b 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs @@ -12,7 +12,7 @@ public class TestTask : FrostingTaskBase where T : BuildContext { protected override Task RunAsyncCore(T context) { - var testSettings = context.GetSettings(); + var testSettings = context.GetRequiredSettings(); var testProjects = testSettings.TestProjects.OrderBy(x => x.FullPath).ToArray(); From 6b24f17190ded42d698c9da0827b7df027f361c4 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 10 Jan 2026 13:42:13 +0100 Subject: [PATCH 46/73] Simplify integration workflow by removing auto-generation comments and adding NuGet package directory listing. --- .github/workflows/integration.yml | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index f7f4b928..ec7b73ae 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -1,19 +1,3 @@ -# ------------------------------------------------------------------------------ -# -# -# This code was generated. -# -# - To turn off auto-generation set: -# -# [GitHubActions (AutoGenerate = false)] -# -# - To trigger manual generation invoke: -# -# nuke --generate-configuration GitHubActions_integration --host GitHubActions -# -# -# ------------------------------------------------------------------------------ - name: integration on: @@ -46,6 +30,8 @@ jobs: run: | cd ./samples/CakeBuildSample dotnet run -- -t nugetpush + cd ~/.nuget/packages + ls -l # - name: 'Publish: coverage_report' # uses: actions/upload-artifact@v4 # if: runner.os == 'Linux' From 3a6f2340c3d7b8bc7045c15743ba33e1e5930e3e Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 10 Jan 2026 13:55:18 +0100 Subject: [PATCH 47/73] Add warning log for GitVersion fallback and improve exception handling - Enable `coverage-report` artifact publishing in the integration workflow --- .github/workflows/integration.yml | 12 ++++++------ .../CakeContextExtensions.cs | 7 +++++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index ec7b73ae..f5b7819e 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -32,12 +32,12 @@ jobs: dotnet run -- -t nugetpush cd ~/.nuget/packages ls -l - # - name: 'Publish: coverage_report' - # uses: actions/upload-artifact@v4 - # if: runner.os == 'Linux' - # with: - # name: coverage_report - # path: .tests/coverage_report + - name: 'Publish: coverage-report' + uses: actions/upload-artifact@v4 + if: runner.os == 'Linux' + with: + name: coverage_report + path: .tests/coverage-report windows-latest: name: windows-latest runs-on: windows-latest diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/CakeContextExtensions.cs b/source/CakeBuild/CreativeCoders.CakeBuild/CakeContextExtensions.cs index 6354feb3..512d5a28 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/CakeContextExtensions.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/CakeContextExtensions.cs @@ -1,4 +1,5 @@ -using Cake.Common.Tools.GitVersion; +using Cake.Common.Diagnostics; +using Cake.Common.Tools.GitVersion; using Cake.Core; using Cake.Frosting; using JetBrains.Annotations; @@ -24,8 +25,10 @@ public static GitVersion GetGitVersionSafe(this ICakeContext context, ? context.GitVersion() : context.GitVersion(gitVersionSettings); } - catch (Exception) + catch (Exception e) { + context.Warning("GitVersion failed. Using fallback version. Reason: {0}", e.Message); + return StaticGitVersion.Create(major ?? "0", minor ?? "0", patch ?? "0", build ?? "1", ""); } } From 511fab4a04197df28141aa3e0f30f370caf57019 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 10 Jan 2026 13:57:25 +0100 Subject: [PATCH 48/73] Update tool URI scheme to `nuget:` for `GitVersion.Tool` and enable NuGet cache in integration workflow --- .github/workflows/integration.yml | 13 ++++++------- samples/CakeBuildSample/Program.cs | 2 +- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index f5b7819e..a159b902 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -45,13 +45,12 @@ jobs: - uses: actions/checkout@v5 with: fetch-depth: 0 - # - name: 'Cache: .nuke/temp, ~/.nuget/packages' - # uses: actions/cache@v4 - # with: - # path: | - # .nuke/temp - # ~/.nuget/packages - # key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} + - name: 'Cache: ~/.nuget/packages' + uses: actions/cache@v4 + with: + path: | + ~/.nuget/packages + key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} - name: 'Run: DeployNuGet' run: | cd ./samples/CakeBuildSample diff --git a/samples/CakeBuildSample/Program.cs b/samples/CakeBuildSample/Program.cs index a80e4197..7dc1f4e7 100644 --- a/samples/CakeBuildSample/Program.cs +++ b/samples/CakeBuildSample/Program.cs @@ -24,7 +24,7 @@ static int Main(string[] args) x.SetToolPath(tempToolsPath); x.UsePackageInstaller(); - x.InstallTool(new Uri("dotnet:?package=GitVersion.Tool&version=6.5.1")); + x.InstallTool(new Uri("nuget:?package=GitVersion.Tool&version=6.5.1")); x.InstallTool(new Uri("dotnet:?package=dotnet-reportgenerator-globaltool&version=5.5.1")); }) .Build() From 4f18a14dc07b9ccf7c82e2ab6b05d3fc676d06e1 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 10 Jan 2026 14:05:01 +0100 Subject: [PATCH 49/73] Update `GitVersion` tool to use `GitVersion.CommandLine` instead of `GitVersion.Tool` in `CakeBuildSample` --- samples/CakeBuildSample/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/CakeBuildSample/Program.cs b/samples/CakeBuildSample/Program.cs index 7dc1f4e7..ec68c46c 100644 --- a/samples/CakeBuildSample/Program.cs +++ b/samples/CakeBuildSample/Program.cs @@ -24,7 +24,7 @@ static int Main(string[] args) x.SetToolPath(tempToolsPath); x.UsePackageInstaller(); - x.InstallTool(new Uri("nuget:?package=GitVersion.Tool&version=6.5.1")); + x.InstallTool(new Uri("nuget:?package=GitVersion.CommandLine&version=6.5.1")); x.InstallTool(new Uri("dotnet:?package=dotnet-reportgenerator-globaltool&version=5.5.1")); }) .Build() From 4245732ebc5fea765b02e0efdc64b954f844b062 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 10 Jan 2026 14:12:23 +0100 Subject: [PATCH 50/73] Refactor `GitVersion` usage in `BuildContext` and update tool URI in `CakeBuildSample` - Replaced `Version` property in `BuildContext` with a computed getter using `GetGitVersionSafe`. - Updated `GitVersion.Tool` URI scheme in `CakeBuildSample` to use `dotnet:` instead of `nuget:`. --- samples/CakeBuildSample/Program.cs | 2 +- source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/samples/CakeBuildSample/Program.cs b/samples/CakeBuildSample/Program.cs index ec68c46c..a80e4197 100644 --- a/samples/CakeBuildSample/Program.cs +++ b/samples/CakeBuildSample/Program.cs @@ -24,7 +24,7 @@ static int Main(string[] args) x.SetToolPath(tempToolsPath); x.UsePackageInstaller(); - x.InstallTool(new Uri("nuget:?package=GitVersion.CommandLine&version=6.5.1")); + x.InstallTool(new Uri("dotnet:?package=GitVersion.Tool&version=6.5.1")); x.InstallTool(new Uri("dotnet:?package=dotnet-reportgenerator-globaltool&version=5.5.1")); }) .Build() diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs b/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs index 46673389..5efe947f 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs @@ -24,8 +24,6 @@ public BuildContext(ICakeContext context) SolutionFile = string.IsNullOrWhiteSpace(solutionsFilePath) ? FindRootSolution(context) : new FilePath(solutionsFilePath); - - Version = context.GetGitVersionSafe(); } private DirectoryPath? FindGitRootPath(DirectoryPath? startPath) @@ -89,7 +87,7 @@ private FilePath FindRootSolution(ICakeContext context) public virtual string BuildConfiguration => this.BuildSystem().IsLocalBuild ? "Debug" : "Release"; - public GitVersion Version { get; } + public GitVersion Version => this.GetGitVersionSafe(); public IList ExecutedTasks => _executedTasks; From 6ba458cb5a0cc91a1fcac4b15a8880223f82b5dc Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 10 Jan 2026 14:18:04 +0100 Subject: [PATCH 51/73] Comment out `UsePackageInstaller` in `CakeBuildSample` and update tool installation logic --- samples/CakeBuildSample/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/CakeBuildSample/Program.cs b/samples/CakeBuildSample/Program.cs index a80e4197..506e3521 100644 --- a/samples/CakeBuildSample/Program.cs +++ b/samples/CakeBuildSample/Program.cs @@ -23,7 +23,7 @@ static int Main(string[] args) x.SetToolPath(tempToolsPath); - x.UsePackageInstaller(); + //x.UsePackageInstaller(); x.InstallTool(new Uri("dotnet:?package=GitVersion.Tool&version=6.5.1")); x.InstallTool(new Uri("dotnet:?package=dotnet-reportgenerator-globaltool&version=5.5.1")); }) From f9c4205e22483e8f2bd2daade6d912cc77847678 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 10 Jan 2026 14:34:34 +0100 Subject: [PATCH 52/73] Add `InstallTools` method to simplify tool installation and refactor tool setup logic - Introduced `InstallTools` method in `ICakeHostBuilder` for streamlined tool installation. - Created `ToolInstallation`, `DotNetToolInstallation`, and `NuGetToolInstallation` classes for better type safety and tool configuration. - Refactored `CakeBuildSample` to use the new `InstallTools` API, replacing inline tool path and installation logic. --- samples/CakeBuildSample/Program.cs | 15 +++------------ .../CreativeCoders.CakeBuild/CakeHostBuilder.cs | 13 ++++++++++--- .../DotNetToolInstallation.cs | 3 +++ .../CreativeCoders.CakeBuild/ICakeHostBuilder.cs | 3 +-- .../NuGetToolInstallation.cs | 3 +++ .../CreativeCoders.CakeBuild/ToolInstallation.cs | 12 ++++++++++++ 6 files changed, 32 insertions(+), 17 deletions(-) create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/DotNetToolInstallation.cs create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/NuGetToolInstallation.cs create mode 100644 source/CakeBuild/CreativeCoders.CakeBuild/ToolInstallation.cs diff --git a/samples/CakeBuildSample/Program.cs b/samples/CakeBuildSample/Program.cs index 506e3521..cf6eea31 100644 --- a/samples/CakeBuildSample/Program.cs +++ b/samples/CakeBuildSample/Program.cs @@ -15,18 +15,9 @@ static int Main(string[] args) .UseBuildContext() .AddDefaultTasks() .AddBuildServerIntegration() - .ConfigureHost(x => - { - var tempToolsPath = FileSys.Path.Combine(FileSys.Path.GetTempPath(), ".cake-tools"); - - Console.WriteLine($"Using temp tools path: {tempToolsPath}"); - - x.SetToolPath(tempToolsPath); - - //x.UsePackageInstaller(); - x.InstallTool(new Uri("dotnet:?package=GitVersion.Tool&version=6.5.1")); - x.InstallTool(new Uri("dotnet:?package=dotnet-reportgenerator-globaltool&version=5.5.1")); - }) + .InstallTools( + new DotNetToolInstallation("GitVersion.Tool", "6.5.1"), + new DotNetToolInstallation("dotnet-reportgenerator-globaltool", "5.5.1")) .Build() .Run(args); } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostBuilder.cs b/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostBuilder.cs index d8b55ed6..f292be52 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostBuilder.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostBuilder.cs @@ -3,6 +3,7 @@ using Cake.Frosting; using CreativeCoders.CakeBuild.Tasks.Templates.Settings; using CreativeCoders.Core; +using CreativeCoders.Core.IO; using JetBrains.Annotations; namespace CreativeCoders.CakeBuild; @@ -28,10 +29,16 @@ public ICakeHostBuilder UseBuildContext() return this; } - public ICakeHostBuilder UseBuildSetup() - where TBuildSetup : class + public ICakeHostBuilder InstallTools(params ToolInstallation[] tools) { - _cakeHost.UseBuildSetup(); + var tempToolsPath = FileSys.Path.Combine(FileSys.Path.GetTempPath(), ".cake-tools"); + + _cakeHost.SetToolPath(tempToolsPath); + + foreach (var tool in tools) + { + _cakeHost.InstallTool(new Uri($"{tool.ToolKind}:?package={tool.Name}&version={tool.Version}")); + } return this; } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/DotNetToolInstallation.cs b/source/CakeBuild/CreativeCoders.CakeBuild/DotNetToolInstallation.cs new file mode 100644 index 00000000..e883127b --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/DotNetToolInstallation.cs @@ -0,0 +1,3 @@ +namespace CreativeCoders.CakeBuild; + +public class DotNetToolInstallation(string name, string version) : ToolInstallation("dotnet", name, version); \ No newline at end of file diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/ICakeHostBuilder.cs b/source/CakeBuild/CreativeCoders.CakeBuild/ICakeHostBuilder.cs index cc2cbc12..dbd97fd1 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/ICakeHostBuilder.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/ICakeHostBuilder.cs @@ -20,8 +20,7 @@ ICakeHostBuilder AddTask() ICakeHostBuilder UseBuildContext() where TBuildContext : BuildContext; - ICakeHostBuilder UseBuildSetup() - where TBuildSetup : class; + ICakeHostBuilder InstallTools(params ToolInstallation[] tools); CakeHost Build(); } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/NuGetToolInstallation.cs b/source/CakeBuild/CreativeCoders.CakeBuild/NuGetToolInstallation.cs new file mode 100644 index 00000000..a7b53873 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/NuGetToolInstallation.cs @@ -0,0 +1,3 @@ +namespace CreativeCoders.CakeBuild; + +public class NuGetToolInstallation(string name, string version) : ToolInstallation("nuget", name, version); \ No newline at end of file diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/ToolInstallation.cs b/source/CakeBuild/CreativeCoders.CakeBuild/ToolInstallation.cs new file mode 100644 index 00000000..9bfd55c5 --- /dev/null +++ b/source/CakeBuild/CreativeCoders.CakeBuild/ToolInstallation.cs @@ -0,0 +1,12 @@ +using CreativeCoders.Core; + +namespace CreativeCoders.CakeBuild; + +public class ToolInstallation(string toolKind, string name, string version) +{ + public string ToolKind { get; set; } = Ensure.IsNotNullOrWhitespace(toolKind); + + public string Name { get; set; } = Ensure.IsNotNullOrWhitespace(name); + + public string Version { get; set; } = Ensure.IsNotNullOrWhitespace(version); +} \ No newline at end of file From 9ecf0328b38a98ab7ed8cc00f34a8baaf8ca6008 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 10 Jan 2026 17:13:09 +0100 Subject: [PATCH 53/73] Refactor `BuildContext` to `CakeBuildContext` for improved clarity and consistency in context naming. --- samples/CakeBuildSample/SampleBuildContext.cs | 2 +- .../{BuildContext.cs => CakeBuildContext.cs} | 6 +++--- .../CreativeCoders.CakeBuild/CakeContextExtensions.cs | 2 +- .../CakeBuild/CreativeCoders.CakeBuild/CakeHostBuilder.cs | 6 +++--- .../CreativeCoders.CakeBuild/CakeHostExtensions.cs | 2 +- .../CreativeCoders.CakeBuild/IBuildContextAccessor.cs | 2 +- .../{IBuildContext.cs => ICakeBuildContext.cs} | 2 +- .../CakeBuild/CreativeCoders.CakeBuild/ICakeHostBuilder.cs | 2 +- .../CreativeCoders.CakeBuild/Tasks/Defaults/BuildTask.cs | 2 +- .../CreativeCoders.CakeBuild/Tasks/Defaults/CleanTask.cs | 2 +- .../Tasks/Defaults/CodeCoverageTask.cs | 2 +- .../Tasks/Defaults/NuGetPushTask.cs | 2 +- .../CreativeCoders.CakeBuild/Tasks/Defaults/PackTask.cs | 2 +- .../CreativeCoders.CakeBuild/Tasks/Defaults/RestoreTask.cs | 2 +- .../CreativeCoders.CakeBuild/Tasks/Defaults/TestTask.cs | 2 +- .../CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs | 2 +- .../CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs | 2 +- .../CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs | 2 +- .../Tasks/Templates/CodeCoverageTask.cs | 2 +- .../Tasks/Templates/NuGetPushTask.cs | 2 +- .../CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs | 2 +- .../CreativeCoders.CakeBuild/Tasks/Templates/RestoreTask.cs | 2 +- .../CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs | 2 +- 23 files changed, 27 insertions(+), 27 deletions(-) rename source/CakeBuild/CreativeCoders.CakeBuild/{BuildContext.cs => CakeBuildContext.cs} (95%) rename source/CakeBuild/CreativeCoders.CakeBuild/{IBuildContext.cs => ICakeBuildContext.cs} (93%) diff --git a/samples/CakeBuildSample/SampleBuildContext.cs b/samples/CakeBuildSample/SampleBuildContext.cs index 90c8b099..398b52bb 100644 --- a/samples/CakeBuildSample/SampleBuildContext.cs +++ b/samples/CakeBuildSample/SampleBuildContext.cs @@ -11,7 +11,7 @@ namespace CakeBuildSample; [UsedImplicitly] -public class SampleBuildContext(ICakeContext context) : BuildContext(context), IDefaultTaskSettings +public class SampleBuildContext(ICakeContext context) : CakeBuildContext(context), IDefaultTaskSettings { public IList DirectoriesToClean => this.CastAs() .GetDefaultDirectoriesToClean().AddRange(RootDir.Combine(".tests")); diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs b/source/CakeBuild/CreativeCoders.CakeBuild/CakeBuildContext.cs similarity index 95% rename from source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs rename to source/CakeBuild/CreativeCoders.CakeBuild/CakeBuildContext.cs index 5efe947f..b1997cb6 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/BuildContext.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/CakeBuildContext.cs @@ -10,11 +10,11 @@ namespace CreativeCoders.CakeBuild; [PublicAPI] -public class BuildContext : FrostingContext, IBuildContext, IBuildContextAccessor +public class CakeBuildContext : FrostingContext, ICakeBuildContext, IBuildContextAccessor { private readonly List _executedTasks = []; - public BuildContext(ICakeContext context) + public CakeBuildContext(ICakeContext context) : base(context) { RootDir = FindGitRootPath(context.Environment.WorkingDirectory) ?? @@ -133,5 +133,5 @@ public T GetRequiredSettings() .FirstOrDefault(); } - public IBuildContext Context => this; + public ICakeBuildContext Context => this; } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/CakeContextExtensions.cs b/source/CakeBuild/CreativeCoders.CakeBuild/CakeContextExtensions.cs index 512d5a28..06b3eb9b 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/CakeContextExtensions.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/CakeContextExtensions.cs @@ -9,7 +9,7 @@ namespace CreativeCoders.CakeBuild; [PublicAPI] public static class CakeContextExtensions { - public static bool TaskHasRun(this BuildContext context) + public static bool TaskHasRun(this CakeBuildContext context) where TTask : IFrostingTask { return context.ExecutedTasks.Any(x => x.GetType() == typeof(TTask)); diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostBuilder.cs b/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostBuilder.cs index f292be52..04bd1eb4 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostBuilder.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostBuilder.cs @@ -20,7 +20,7 @@ public static ICakeHostBuilder Create() } public ICakeHostBuilder UseBuildContext() - where TBuildContext : BuildContext + where TBuildContext : CakeBuildContext { _buildContextIsSet = true; @@ -85,7 +85,7 @@ public CakeHost Build() { if (!_buildContextIsSet) { - _cakeHost.UseContext(); + _cakeHost.UseContext(); } _cakeHost.UseSetup(); @@ -99,7 +99,7 @@ public class DefaultHostSetup : IFrostingSetup { public void Setup(ICakeContext context, ISetupContext info) { - if (context is not BuildContext buildContext) + if (context is not CakeBuildContext buildContext) { return; } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs b/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs index 07a84a8c..edb6dcbf 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostExtensions.cs @@ -76,7 +76,7 @@ public static CakeHost AddBuildServerIntegration(this CakeHost host) public static CakeHost SetupHost(this CakeHost host) where TBuildSetup : class - where TBuildContext : BuildContext + where TBuildContext : CakeBuildContext { return host .UseContext() diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/IBuildContextAccessor.cs b/source/CakeBuild/CreativeCoders.CakeBuild/IBuildContextAccessor.cs index 203b5571..fe5ec9ab 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/IBuildContextAccessor.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/IBuildContextAccessor.cs @@ -2,5 +2,5 @@ namespace CreativeCoders.CakeBuild; public interface IBuildContextAccessor { - IBuildContext Context { get; } + ICakeBuildContext Context { get; } } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/IBuildContext.cs b/source/CakeBuild/CreativeCoders.CakeBuild/ICakeBuildContext.cs similarity index 93% rename from source/CakeBuild/CreativeCoders.CakeBuild/IBuildContext.cs rename to source/CakeBuild/CreativeCoders.CakeBuild/ICakeBuildContext.cs index 01c4e2ed..7e8f3b04 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/IBuildContext.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/ICakeBuildContext.cs @@ -5,7 +5,7 @@ namespace CreativeCoders.CakeBuild; -public interface IBuildContext : ICakeContext +public interface ICakeBuildContext : ICakeContext { FilePath SolutionFile { get; } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/ICakeHostBuilder.cs b/source/CakeBuild/CreativeCoders.CakeBuild/ICakeHostBuilder.cs index dbd97fd1..1a0978f8 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/ICakeHostBuilder.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/ICakeHostBuilder.cs @@ -18,7 +18,7 @@ ICakeHostBuilder AddTask() ICakeHostBuilder ConfigureHost(Action configure); ICakeHostBuilder UseBuildContext() - where TBuildContext : BuildContext; + where TBuildContext : CakeBuildContext; ICakeHostBuilder InstallTools(params ToolInstallation[] tools); diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/BuildTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/BuildTask.cs index 814d08c1..a113fe98 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/BuildTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/BuildTask.cs @@ -5,4 +5,4 @@ namespace CreativeCoders.CakeBuild.Tasks.Defaults; [TaskName("Build")] [IsDependentOn(typeof(RestoreTask))] -public class BuildTask() : BuildTask(); +public class BuildTask() : BuildTask(); diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CleanTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CleanTask.cs index 43fcf543..4676747a 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CleanTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CleanTask.cs @@ -4,4 +4,4 @@ namespace CreativeCoders.CakeBuild.Tasks.Defaults; [TaskName("Clean")] -public class CleanTask : CleanTask { } +public class CleanTask : CleanTask { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CodeCoverageTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CodeCoverageTask.cs index 7f979ecc..665a99de 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CodeCoverageTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CodeCoverageTask.cs @@ -5,4 +5,4 @@ namespace CreativeCoders.CakeBuild.Tasks.Defaults; [TaskName("CodeCoverage")] [IsDependentOn(typeof(TestTask))] -public class CodeCoverageTask : CodeCoverageTask { } +public class CodeCoverageTask : CodeCoverageTask { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/NuGetPushTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/NuGetPushTask.cs index 4b45190d..a1c140af 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/NuGetPushTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/NuGetPushTask.cs @@ -5,4 +5,4 @@ namespace CreativeCoders.CakeBuild.Tasks.Defaults; [TaskName("NuGetPush")] [IsDependentOn(typeof(PackTask))] -public class NuGetPushTask : NuGetPushTask { } +public class NuGetPushTask : NuGetPushTask { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/PackTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/PackTask.cs index 7ccadcbf..22a41bbf 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/PackTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/PackTask.cs @@ -5,4 +5,4 @@ namespace CreativeCoders.CakeBuild.Tasks.Defaults; [TaskName("Pack")] [IsDependentOn(typeof(CodeCoverageTask))] -public class PackTask : PackTask { } +public class PackTask : PackTask { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/RestoreTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/RestoreTask.cs index 62a60423..6d4d5a96 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/RestoreTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/RestoreTask.cs @@ -5,4 +5,4 @@ namespace CreativeCoders.CakeBuild.Tasks.Defaults; [TaskName("Restore")] [IsDependentOn(typeof(CleanTask))] -public class RestoreTask : RestoreTask; +public class RestoreTask : RestoreTask; diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/TestTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/TestTask.cs index 288f4098..8d6b8863 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/TestTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/TestTask.cs @@ -5,4 +5,4 @@ namespace CreativeCoders.CakeBuild.Tasks.Defaults; [TaskName("Test")] [IsDependentOn(typeof(BuildTask))] -public class TestTask : TestTask { } +public class TestTask : TestTask { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs index e239822d..3f174630 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/FrostingTaskBase.cs @@ -7,7 +7,7 @@ namespace CreativeCoders.CakeBuild.Tasks; [PublicAPI] public abstract class FrostingTaskBase : AsyncFrostingTask - where T : BuildContext + where T : CakeBuildContext { public sealed override async Task RunAsync(T context) { diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs index e4bad9b8..755cb13e 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/BuildTask.cs @@ -9,7 +9,7 @@ namespace CreativeCoders.CakeBuild.Tasks.Templates; [PublicAPI] public class BuildTask : FrostingTaskBase - where T : BuildContext + where T : CakeBuildContext { protected virtual void ApplyDotNetBuildSettings(T context, DotNetBuildSettings dotNetBuildSettings) { } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs index 664d384f..e35304a5 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CleanTask.cs @@ -5,7 +5,7 @@ namespace CreativeCoders.CakeBuild.Tasks.Templates; -public class CleanTask : FrostingTaskBase where T : BuildContext +public class CleanTask : FrostingTaskBase where T : CakeBuildContext { protected override Task RunAsyncCore(T context) { diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs index bc9e297d..77b73c7e 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs @@ -6,7 +6,7 @@ namespace CreativeCoders.CakeBuild.Tasks.Templates; public class CodeCoverageTask : FrostingTaskBase - where T : BuildContext + where T : CakeBuildContext { protected override Task RunAsyncCore(T context) { diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/NuGetPushTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/NuGetPushTask.cs index 0395c426..688fc212 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/NuGetPushTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/NuGetPushTask.cs @@ -5,7 +5,7 @@ namespace CreativeCoders.CakeBuild.Tasks.Templates; -public class NuGetPushTask : FrostingTaskBase where T : BuildContext +public class NuGetPushTask : FrostingTaskBase where T : CakeBuildContext { protected override Task RunAsyncCore(T context) { diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs index 2a1105a6..fba6628f 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs @@ -6,7 +6,7 @@ namespace CreativeCoders.CakeBuild.Tasks.Templates; public class PackTask : FrostingTaskBase - where T : BuildContext + where T : CakeBuildContext { protected override Task RunAsyncCore(T context) { diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/RestoreTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/RestoreTask.cs index bb171337..99eaa2d6 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/RestoreTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/RestoreTask.cs @@ -3,7 +3,7 @@ namespace CreativeCoders.CakeBuild.Tasks.Templates; public class RestoreTask : FrostingTaskBase - where T : BuildContext + where T : CakeBuildContext { protected override Task RunAsyncCore(T context) { diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs index b19f263b..e3fcc887 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/TestTask.cs @@ -8,7 +8,7 @@ namespace CreativeCoders.CakeBuild.Tasks.Templates; [PublicAPI] -public class TestTask : FrostingTaskBase where T : BuildContext +public class TestTask : FrostingTaskBase where T : CakeBuildContext { protected override Task RunAsyncCore(T context) { From 33691b94a32151d8e734bc50aaaecaaeea0c604e Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 10 Jan 2026 17:36:16 +0100 Subject: [PATCH 54/73] Replace Nuke build system with Cake.build and migrate corresponding build logic, settings, and configurations. --- .github/workflows/integration.yml | 84 +++--- Core.sln | 48 ++-- build.sh | 40 +-- build/.editorconfig | 11 - build/Build.cs | 116 -------- build/Build.csproj | 14 + build/BuildContext.cs | 33 +++ build/Directory.Build.props | 8 - build/Directory.Build.targets | 8 - build/Program.cs | 19 ++ build/_build.csproj | 25 -- build/_build.csproj.DotSettings | 31 -- .../CreativeCoders.MiscTest.UnitTests.csproj | 10 +- .../NukeBuild/GitVersionWrapperTests.cs | 270 ------------------ .../CreativeCoders.NukeBuild.Tests.csproj | 4 - 15 files changed, 125 insertions(+), 596 deletions(-) delete mode 100644 build/.editorconfig delete mode 100644 build/Build.cs create mode 100644 build/Build.csproj create mode 100644 build/BuildContext.cs delete mode 100644 build/Directory.Build.props delete mode 100644 build/Directory.Build.targets create mode 100644 build/Program.cs delete mode 100644 build/_build.csproj delete mode 100644 build/_build.csproj.DotSettings delete mode 100644 tests/CreativeCoders.MiscTest.UnitTests/NukeBuild/GitVersionWrapperTests.cs diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index a159b902..9f734b4c 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -16,27 +16,20 @@ jobs: - uses: actions/checkout@v5 with: fetch-depth: 0 - # - name: 'Cache: .nuke/temp, ~/.nuget/packages' - # uses: actions/cache@v4 - # with: - # path: | - # .nuke/temp - # ~/.nuget/packages - # key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} + - name: 'Cache: ~/.nuget/packages' + uses: actions/cache@v4 + with: + path: | + ~/.nuget/packages + key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} - name: 'Run: DeployNuGet' env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NUGET_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - cd ./samples/CakeBuildSample - dotnet run -- -t nugetpush - cd ~/.nuget/packages - ls -l + run: sh ./build.sh -t nugetpush - name: 'Publish: coverage-report' uses: actions/upload-artifact@v4 - if: runner.os == 'Linux' with: - name: coverage_report + name: coverage-report-linux path: .tests/coverage-report windows-latest: name: windows-latest @@ -52,38 +45,29 @@ jobs: ~/.nuget/packages key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} - name: 'Run: DeployNuGet' - run: | - cd ./samples/CakeBuildSample - dotnet run -- -t nugetpush - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -# - name: 'Publish: coverage_report' -# uses: actions/upload-artifact@v4 -# if: runner.os == 'Linux' -# with: -# name: coverage_report -# path: .tests/coverage_report -# macos-latest: -# name: macos-latest -# runs-on: macos-latest -# steps: -# - uses: actions/checkout@v4 -# with: -# fetch-depth: 0 -# - name: 'Cache: .nuke/temp, ~/.nuget/packages' -# uses: actions/cache@v4 -# with: -# path: | -# .nuke/temp -# ~/.nuget/packages -# key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} -# - name: 'Run: DeployNuGet' -# run: ./build.cmd DeployNuGet -# env: -# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -# - name: 'Publish: coverage_report' -# uses: actions/upload-artifact@v4 -# if: runner.os == 'Linux' -# with: -# name: coverage_report -# path: .tests/coverage_report + run: sh ./build.sh -t pack + - name: 'Publish: coverage_report' + uses: actions/upload-artifact@v4 + with: + name: coverage-report-windows + path: .tests/coverage_report + macos-latest: + name: macos-latest + runs-on: macos-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: 'Cache: ~/.nuget/packages' + uses: actions/cache@v4 + with: + path: | + ~/.nuget/packages + key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} + - name: 'Run: DeployNuGet' + run: sh ./build.sh -t pack + - name: 'Publish: coverage_report' + uses: actions/upload-artifact@v4 + with: + name: coverage-report-macos + path: .tests/coverage_report diff --git a/Core.sln b/Core.sln index 60e35041..f0ff9a93 100644 --- a/Core.sln +++ b/Core.sln @@ -63,13 +63,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CreativeCoders.Net.Servers. EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CreativeCoders.Data.EfCore.SqlServer", "source\Data\CreativeCoders.Data.EfCore.SqlServer\CreativeCoders.Data.EfCore.SqlServer.csproj", "{C57A6AD0-A0AB-45F3-BC32-58E469CACC15}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "_build", "build\_build.csproj", "{02EB95BA-07BE-441F-ADC7-3363AC17814C}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_build", "_build", "{DB7A40EE-F469-4B87-A629-250BBB9ECC92}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NukeBuild", "NukeBuild", "{20FCFF4D-882F-4663-81F4-A146D17B62A0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CreativeCoders.NukeBuild", "source\NukeBuild\CreativeCoders.NukeBuild\CreativeCoders.NukeBuild.csproj", "{4687771E-6F0E-40C8-8C0A-DEDC20260604}" + ProjectSection(SolutionItems) = preProject + build.cmd = build.cmd + build.ps1 = build.ps1 + build.sh = build.sh + EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{72E179CA-7AE6-412A-856D-7BD13838E8E3}" ProjectSection(SolutionItems) = preProject @@ -146,8 +145,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CreativeCoders.Daemon.Linux EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CreativeCoders.Daemon.Windows", "source\Daemon\CreativeCoders.Daemon.Windows\CreativeCoders.Daemon.Windows.csproj", "{30E75E1A-146F-422E-8C14-3AE0F7FB99B1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CreativeCoders.NukeBuild.Components", "source\NukeBuild\CreativeCoders.NukeBuild.Components\CreativeCoders.NukeBuild.Components.csproj", "{5D68956E-580F-4A2A-B13F-1477E6DE6FCF}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "IO", "IO", "{F31389F0-613B-48B1-AA99-6BFC3D8D7D1A}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CreativeCoders.IO", "source\IO\CreativeCoders.IO\CreativeCoders.IO.csproj", "{3B1E60AF-5B5C-4BED-8AAF-79167CF5E2C0}" @@ -207,8 +204,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CreativeCoders.AspNetCore.T EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CreativeCoders.AspNetCore.Tests", "tests\CreativeCoders.AspNetCore.Tests\CreativeCoders.AspNetCore.Tests.csproj", "{9A2200C2-46F7-447A-8B9C-40A81D03D0B6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CreativeCoders.NukeBuild.Tests", "tests\CreativeCoders.NukeBuild.Tests\CreativeCoders.NukeBuild.Tests.csproj", "{FC343B26-4AB3-47E7-B9EE-9EFFF0E02C7D}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleTestApp", "samples\ConsoleTestApp\ConsoleTestApp.csproj", "{037EDB81-3473-4EF6-82A9-BCE5FAE1DE00}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Options", "Options", "{23126211-23BF-4399-A227-6C609FB7505E}" @@ -253,6 +248,16 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CreativeCoders.CakeBuild", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CakeBuildSample", "samples\CakeBuildSample\CakeBuildSample.csproj", "{58C01CB8-B65A-44FE-9BE0-22929CD474A2}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ci", "ci", "{F3331DB3-C40A-4712-A545-EE5C628B0F39}" + ProjectSection(SolutionItems) = preProject + .github\workflows\integration.yml = .github\workflows\integration.yml + .github\workflows\release.yml = .github\workflows\release.yml + .github\workflows\main.yml = .github\workflows\main.yml + .github\workflows\pull-request.yml = .github\workflows\pull-request.yml + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Build", "build\Build.csproj", "{4A397E49-CB4F-4348-9798-A7F2B5F276DA}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -331,12 +336,6 @@ Global {C57A6AD0-A0AB-45F3-BC32-58E469CACC15}.Debug|Any CPU.Build.0 = Debug|Any CPU {C57A6AD0-A0AB-45F3-BC32-58E469CACC15}.Release|Any CPU.ActiveCfg = Release|Any CPU {C57A6AD0-A0AB-45F3-BC32-58E469CACC15}.Release|Any CPU.Build.0 = Release|Any CPU - {02EB95BA-07BE-441F-ADC7-3363AC17814C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {02EB95BA-07BE-441F-ADC7-3363AC17814C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4687771E-6F0E-40C8-8C0A-DEDC20260604}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4687771E-6F0E-40C8-8C0A-DEDC20260604}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4687771E-6F0E-40C8-8C0A-DEDC20260604}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4687771E-6F0E-40C8-8C0A-DEDC20260604}.Release|Any CPU.Build.0 = Release|Any CPU {A815C965-84FF-4880-800E-CCFEEF017A41}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A815C965-84FF-4880-800E-CCFEEF017A41}.Debug|Any CPU.Build.0 = Debug|Any CPU {A815C965-84FF-4880-800E-CCFEEF017A41}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -429,10 +428,6 @@ Global {30E75E1A-146F-422E-8C14-3AE0F7FB99B1}.Debug|Any CPU.Build.0 = Debug|Any CPU {30E75E1A-146F-422E-8C14-3AE0F7FB99B1}.Release|Any CPU.ActiveCfg = Release|Any CPU {30E75E1A-146F-422E-8C14-3AE0F7FB99B1}.Release|Any CPU.Build.0 = Release|Any CPU - {5D68956E-580F-4A2A-B13F-1477E6DE6FCF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5D68956E-580F-4A2A-B13F-1477E6DE6FCF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5D68956E-580F-4A2A-B13F-1477E6DE6FCF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5D68956E-580F-4A2A-B13F-1477E6DE6FCF}.Release|Any CPU.Build.0 = Release|Any CPU {3B1E60AF-5B5C-4BED-8AAF-79167CF5E2C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3B1E60AF-5B5C-4BED-8AAF-79167CF5E2C0}.Debug|Any CPU.Build.0 = Debug|Any CPU {3B1E60AF-5B5C-4BED-8AAF-79167CF5E2C0}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -533,10 +528,6 @@ Global {9A2200C2-46F7-447A-8B9C-40A81D03D0B6}.Debug|Any CPU.Build.0 = Debug|Any CPU {9A2200C2-46F7-447A-8B9C-40A81D03D0B6}.Release|Any CPU.ActiveCfg = Release|Any CPU {9A2200C2-46F7-447A-8B9C-40A81D03D0B6}.Release|Any CPU.Build.0 = Release|Any CPU - {FC343B26-4AB3-47E7-B9EE-9EFFF0E02C7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FC343B26-4AB3-47E7-B9EE-9EFFF0E02C7D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FC343B26-4AB3-47E7-B9EE-9EFFF0E02C7D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FC343B26-4AB3-47E7-B9EE-9EFFF0E02C7D}.Release|Any CPU.Build.0 = Release|Any CPU {037EDB81-3473-4EF6-82A9-BCE5FAE1DE00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {037EDB81-3473-4EF6-82A9-BCE5FAE1DE00}.Debug|Any CPU.Build.0 = Debug|Any CPU {037EDB81-3473-4EF6-82A9-BCE5FAE1DE00}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -583,6 +574,8 @@ Global {EB88412B-8523-4DA4-8FF9-CACECA0969E6}.Release|Any CPU.Build.0 = Release|Any CPU {58C01CB8-B65A-44FE-9BE0-22929CD474A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {58C01CB8-B65A-44FE-9BE0-22929CD474A2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4A397E49-CB4F-4348-9798-A7F2B5F276DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4A397E49-CB4F-4348-9798-A7F2B5F276DA}.Release|Any CPU.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -616,9 +609,6 @@ Global {44D2EC83-4BC6-4C69-88BF-924A3FCAA1F6} = {354E69EA-9EA1-4F7E-A3C2-372DFB259C35} {B022D220-EEE7-4FBC-A7D5-FC00F16C1A36} = {354E69EA-9EA1-4F7E-A3C2-372DFB259C35} {C57A6AD0-A0AB-45F3-BC32-58E469CACC15} = {D913C0D3-85B9-4E89-82D6-8371FB6C99E7} - {02EB95BA-07BE-441F-ADC7-3363AC17814C} = {DB7A40EE-F469-4B87-A629-250BBB9ECC92} - {20FCFF4D-882F-4663-81F4-A146D17B62A0} = {2A7105AA-05B6-469A-93F5-719723A4D90D} - {4687771E-6F0E-40C8-8C0A-DEDC20260604} = {20FCFF4D-882F-4663-81F4-A146D17B62A0} {A815C965-84FF-4880-800E-CCFEEF017A41} = {9A3F55B8-E867-4EA2-B1FA-0C01DE79463E} {61B4DBCC-2F85-4F8F-9DF9-E5A4EC17334B} = {72E179CA-7AE6-412A-856D-7BD13838E8E3} {7B596434-1314-49F9-B31C-F09D9CC288E0} = {2A7105AA-05B6-469A-93F5-719723A4D90D} @@ -646,7 +636,6 @@ Global {3D078D4E-0437-4AD1-90DE-1FD858DA595B} = {99FFD9AA-7AEB-4A9D-881D-00B7277C3494} {74B31A58-28CB-4B90-B2A4-C64F339FC93D} = {99FFD9AA-7AEB-4A9D-881D-00B7277C3494} {30E75E1A-146F-422E-8C14-3AE0F7FB99B1} = {99FFD9AA-7AEB-4A9D-881D-00B7277C3494} - {5D68956E-580F-4A2A-B13F-1477E6DE6FCF} = {20FCFF4D-882F-4663-81F4-A146D17B62A0} {F31389F0-613B-48B1-AA99-6BFC3D8D7D1A} = {2A7105AA-05B6-469A-93F5-719723A4D90D} {3B1E60AF-5B5C-4BED-8AAF-79167CF5E2C0} = {F31389F0-613B-48B1-AA99-6BFC3D8D7D1A} {0D77E6F7-5D76-4DF0-BE57-BA459951CD2F} = {354E69EA-9EA1-4F7E-A3C2-372DFB259C35} @@ -675,7 +664,6 @@ Global {9357DAC0-2E7B-4394-AD43-305DE5AC2DF1} = {B485D7EE-B71A-41DE-9518-60F9B7FA8AE4} {6C2862AB-9938-4802-8B90-6454CE24198D} = {B485D7EE-B71A-41DE-9518-60F9B7FA8AE4} {9A2200C2-46F7-447A-8B9C-40A81D03D0B6} = {5A3FFD14-2258-4007-AC77-BAFB3B3EB26F} - {FC343B26-4AB3-47E7-B9EE-9EFFF0E02C7D} = {5A3FFD14-2258-4007-AC77-BAFB3B3EB26F} {037EDB81-3473-4EF6-82A9-BCE5FAE1DE00} = {72E179CA-7AE6-412A-856D-7BD13838E8E3} {23126211-23BF-4399-A227-6C609FB7505E} = {2A7105AA-05B6-469A-93F5-719723A4D90D} {70C54624-CAE5-4ED6-A087-88CD1470E2B7} = {23126211-23BF-4399-A227-6C609FB7505E} @@ -694,6 +682,8 @@ Global {E8EF00ED-01FA-4F51-A668-5AF8B6C0F09E} = {2A7105AA-05B6-469A-93F5-719723A4D90D} {EB88412B-8523-4DA4-8FF9-CACECA0969E6} = {E8EF00ED-01FA-4F51-A668-5AF8B6C0F09E} {58C01CB8-B65A-44FE-9BE0-22929CD474A2} = {72E179CA-7AE6-412A-856D-7BD13838E8E3} + {F3331DB3-C40A-4712-A545-EE5C628B0F39} = {92288F2D-DE57-4018-855B-BD7F2344265F} + {4A397E49-CB4F-4348-9798-A7F2B5F276DA} = {DB7A40EE-F469-4B87-A629-250BBB9ECC92} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {EE24476B-9A4C-4146-B982-3461FAF8B3B0} diff --git a/build.sh b/build.sh index fdff0c62..c70522ec 100755 --- a/build.sh +++ b/build.sh @@ -9,12 +9,8 @@ SCRIPT_DIR=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd) # CONFIGURATION ########################################################################### -BUILD_PROJECT_FILE="$SCRIPT_DIR/build/_build.csproj" -TEMP_DIRECTORY="$SCRIPT_DIR//.nuke/temp" - +BUILD_PROJECT_FILE="$SCRIPT_DIR/build/Build.csproj" DOTNET_GLOBAL_FILE="$SCRIPT_DIR//global.json" -DOTNET_INSTALL_URL="https://dot.net/v1/dotnet-install.sh" -DOTNET_CHANNEL="STS" export DOTNET_CLI_TELEMETRY_OPTOUT=1 export DOTNET_NOLOGO=1 @@ -23,45 +19,15 @@ export DOTNET_NOLOGO=1 # EXECUTION ########################################################################### -function FirstJsonValue { - perl -nle 'print $1 if m{"'"$1"'": "([^"]+)",?}' <<< "${@:2}" -} - # If dotnet CLI is installed globally and it matches requested version, use for execution if [ -x "$(command -v dotnet)" ] && dotnet --version &>/dev/null; then export DOTNET_EXE="$(command -v dotnet)" else - # Download install script - DOTNET_INSTALL_FILE="$TEMP_DIRECTORY/dotnet-install.sh" - mkdir -p "$TEMP_DIRECTORY" - curl -Lsfo "$DOTNET_INSTALL_FILE" "$DOTNET_INSTALL_URL" - chmod +x "$DOTNET_INSTALL_FILE" - - # If global.json exists, load expected version - if [[ -f "$DOTNET_GLOBAL_FILE" ]]; then - DOTNET_VERSION=$(FirstJsonValue "version" "$(cat "$DOTNET_GLOBAL_FILE")") - if [[ "$DOTNET_VERSION" == "" ]]; then - unset DOTNET_VERSION - fi - fi - - # Install by channel or version - DOTNET_DIRECTORY="$TEMP_DIRECTORY/dotnet-unix" - if [[ -z ${DOTNET_VERSION+x} ]]; then - "$DOTNET_INSTALL_FILE" --install-dir "$DOTNET_DIRECTORY" --channel "$DOTNET_CHANNEL" --no-path - else - "$DOTNET_INSTALL_FILE" --install-dir "$DOTNET_DIRECTORY" --version "$DOTNET_VERSION" --no-path - fi - export DOTNET_EXE="$DOTNET_DIRECTORY/dotnet" - export PATH="$DOTNET_DIRECTORY:$PATH" + echo "No matching dotnet version found" + exit 1 fi echo "Microsoft (R) .NET SDK version $("$DOTNET_EXE" --version)" -if [[ ! -z ${NUKE_ENTERPRISE_TOKEN+x} && "$NUKE_ENTERPRISE_TOKEN" != "" ]]; then - "$DOTNET_EXE" nuget remove source "nuke-enterprise" &>/dev/null || true - "$DOTNET_EXE" nuget add source "https://f.feedz.io/nuke/enterprise/nuget" --name "nuke-enterprise" --username "PAT" --password "$NUKE_ENTERPRISE_TOKEN" --store-password-in-clear-text &>/dev/null || true -fi - "$DOTNET_EXE" build "$BUILD_PROJECT_FILE" /nodeReuse:false /p:UseSharedCompilation=false -nologo -clp:NoSummary --verbosity quiet "$DOTNET_EXE" run --project "$BUILD_PROJECT_FILE" --no-build -- "$@" diff --git a/build/.editorconfig b/build/.editorconfig deleted file mode 100644 index 31e43dcd..00000000 --- a/build/.editorconfig +++ /dev/null @@ -1,11 +0,0 @@ -[*.cs] -dotnet_style_qualification_for_field = false:warning -dotnet_style_qualification_for_property = false:warning -dotnet_style_qualification_for_method = false:warning -dotnet_style_qualification_for_event = false:warning -dotnet_style_require_accessibility_modifiers = never:warning - -csharp_style_expression_bodied_methods = true:silent -csharp_style_expression_bodied_properties = true:warning -csharp_style_expression_bodied_indexers = true:warning -csharp_style_expression_bodied_accessors = true:warning diff --git a/build/Build.cs b/build/Build.cs deleted file mode 100644 index c29722d2..00000000 --- a/build/Build.cs +++ /dev/null @@ -1,116 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using CreativeCoders.Core; -using CreativeCoders.Core.Collections; -using CreativeCoders.NukeBuild.BuildActions; -using CreativeCoders.NukeBuild.Components; -using CreativeCoders.NukeBuild.Components.Parameters; -using CreativeCoders.NukeBuild.Components.Targets; -using CreativeCoders.NukeBuild.Components.Targets.Settings; -using JetBrains.Annotations; -using Nuke.Common; -using Nuke.Common.CI.GitHubActions; -using Nuke.Common.Execution; -using Nuke.Common.IO; -using Nuke.Common.ProjectModel; -using Serilog; - -#pragma warning disable S1144 // remove unused private members -#pragma warning disable S3903 // move class to namespace -[PublicAPI] -[UnsetVisualStudioEnvironmentVariables] -[GitHubActions("integration", - GitHubActionsImage.UbuntuLatest, GitHubActionsImage.WindowsLatest, GitHubActionsImage.MacOsLatest, - OnPushBranches = ["feature/**"], - InvokedTargets = [NukeTargets.DeployNuGet], - EnableGitHubToken = true, - PublishArtifacts = true, - PublishCondition = "runner.os == 'Linux'", - FetchDepth = 0 -)] -[GitHubActions("pull-request", - GitHubActionsImage.UbuntuLatest, GitHubActionsImage.WindowsLatest, GitHubActionsImage.MacOsLatest, - OnPullRequestBranches = ["main"], - InvokedTargets = [NukeTargets.Rebuild, NukeTargets.CodeCoverage, NukeTargets.Pack], - EnableGitHubToken = true, - PublishArtifacts = true, - PublishCondition = "runner.os == 'Linux'", - FetchDepth = 0 -)] -[GitHubActions("main", - GitHubActionsImage.UbuntuLatest, GitHubActionsImage.WindowsLatest, GitHubActionsImage.MacOsLatest, - OnPushBranches = ["main"], - InvokedTargets = [NukeTargets.DeployNuGet], - EnableGitHubToken = true, - PublishArtifacts = true, - PublishCondition = "runner.os == 'Linux'", - FetchDepth = 0 -)] -[GitHubActions(ReleaseWorkflow, GitHubActionsImage.UbuntuLatest, - OnPushTags = ["v**"], - InvokedTargets = [NukeTargets.DeployNuGet], - ImportSecrets = ["NUGET_ORG_TOKEN"], - EnableGitHubToken = true, - PublishArtifacts = true, - FetchDepth = 0 -)] -class Build : NukeBuild, - IGitRepositoryParameter, - IConfigurationParameter, - IGitVersionParameter, - ISourceDirectoryParameter, - IArtifactsSettings, - ICleanTarget, IBuildTarget, IRestoreTarget, ICodeCoverageTarget, IPushNuGetTarget, IRebuildTarget, - IDeployNuGetTarget -{ - public const string ReleaseWorkflow = "release"; - - readonly GitHubActions GitHubActions = GitHubActions.Instance; - - [Parameter(Name = "GITHUB_TOKEN")] string DevNuGetApiKey; - - [Parameter(Name = "NUGET_ORG_TOKEN")] string NuGetOrgApiKey; - - IList ICleanSettings.DirectoriesToClean => - this.As().DefaultDirectoriesToClean - .AddRange(this.As().TestBaseDirectory); - - public IEnumerable TestProjects => GetTestProjects(); - - bool IPushNuGetSettings.SkipPush => GitHubActions?.IsPullRequest == true || - !(GitHubActions.IsLocalBuild() || GitHubActions?.GetRunnerOs() == GitHubActionsRunnerOs.Linux); - - string IPushNuGetSettings.NuGetFeedUrl => - GitHubActions?.Workflow == ReleaseWorkflow - ? "nuget.org" - : "https://nuget.pkg.github.com/CreativeCodersTeam/index.json"; - - string IPushNuGetSettings.NuGetApiKey => - GitHubActions?.Workflow == ReleaseWorkflow - ? NuGetOrgApiKey - : DevNuGetApiKey; - - string IPackSettings.PackageProjectUrl => "https://github.com/CreativeCodersTeam/Core"; - - string IPackSettings.PackageLicenseExpression => PackageLicenseExpressions.ApacheLicense20; - - string IPackSettings.Copyright => $"{DateTime.Now.Year} CreativeCoders"; - - Project[] GetTestProjects() => - this.TryAs(out var solutionParameter) - ? solutionParameter.Solution.GetAllProjects("*") - .Where(x => ((string)x.Path)?.StartsWith(RootDirectory / "tests") ?? false).ToArray() - : []; - - public static int Main() => Execute(x => ((ICodeCoverageTarget)x).CodeCoverage); - - protected override void OnBuildInitialized() - { - base.OnBuildInitialized(); - - Log.Information("Build initialized"); - Log.Information("Skip Nuget Push: {SkipPush}", (this as IPushNuGetSettings).SkipPush); - - } -} diff --git a/build/Build.csproj b/build/Build.csproj new file mode 100644 index 00000000..858d37ec --- /dev/null +++ b/build/Build.csproj @@ -0,0 +1,14 @@ + + + + Exe + net10.0 + enable + enable + + + + + + + diff --git a/build/BuildContext.cs b/build/BuildContext.cs new file mode 100644 index 00000000..b41eeabd --- /dev/null +++ b/build/BuildContext.cs @@ -0,0 +1,33 @@ +using Cake.Common.Build; +using Cake.Core; +using Cake.Core.IO; +using CreativeCoders.CakeBuild; +using CreativeCoders.CakeBuild.Tasks.Defaults; +using CreativeCoders.CakeBuild.Tasks.Templates.Settings; +using CreativeCoders.Core; +using CreativeCoders.Core.Collections; +using JetBrains.Annotations; + +namespace Build; + +[UsedImplicitly] +public class BuildContext(ICakeContext context) : CakeBuildContext(context), IDefaultTaskSettings +{ + public IList DirectoriesToClean => this.CastAs() + .GetDefaultDirectoriesToClean().AddRange(RootDir.Combine(".tests")); + + + public string Copyright => $"{DateTime.Now.Year} CreativeCoders"; + + public string PackageProjectUrl => "https://github.com/CreativeCodersTeam/Core"; + + public string PackageLicenseExpression => PackageLicenseExpressions.ApacheLicense20; + + public string NuGetFeedUrl => this.GitHubActions().Environment.Workflow.Workflow == "release" + ? "nuget.org" + : "https://nuget.pkg.github.com/CreativeCodersTeam/index.json"; + + public bool SkipPush => this.BuildSystem().IsPullRequest || + this.BuildSystem().IsLocalBuild || + this.GitHubActions().Environment.Runner.OS != "Linux"; +} diff --git a/build/Directory.Build.props b/build/Directory.Build.props deleted file mode 100644 index e147d635..00000000 --- a/build/Directory.Build.props +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/build/Directory.Build.targets b/build/Directory.Build.targets deleted file mode 100644 index 25326095..00000000 --- a/build/Directory.Build.targets +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/build/Program.cs b/build/Program.cs new file mode 100644 index 00000000..34637f16 --- /dev/null +++ b/build/Program.cs @@ -0,0 +1,19 @@ +using CreativeCoders.CakeBuild; + +namespace Build; + +internal static class Program +{ + internal static int Main(string[] args) + { + return CakeHostBuilder.Create() + .UseBuildContext() + .AddDefaultTasks() + .AddBuildServerIntegration() + .InstallTools( + new DotNetToolInstallation("GitVersion.Tool", "6.5.1"), + new DotNetToolInstallation("dotnet-reportgenerator-globaltool", "5.5.1")) + .Build() + .Run(args); + } +} diff --git a/build/_build.csproj b/build/_build.csproj deleted file mode 100644 index c76d93b9..00000000 --- a/build/_build.csproj +++ /dev/null @@ -1,25 +0,0 @@ - - - - Exe - net10.0 - - CS0649;CS0169;CA1050;CA1822;CA2211;IDE1006 - .. - .. - 1 - false - - - - - - - - - - - - - - diff --git a/build/_build.csproj.DotSettings b/build/_build.csproj.DotSettings deleted file mode 100644 index c815d363..00000000 --- a/build/_build.csproj.DotSettings +++ /dev/null @@ -1,31 +0,0 @@ - - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - Implicit - Implicit - ExpressionBody - 0 - NEXT_LINE - True - False - 120 - IF_OWNER_IS_SINGLE_LINE - WRAP_IF_LONG - False - <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> - <Policy><Descriptor Staticness="Instance" AccessRightKinds="Private" Description="Instance fields (private)"><ElementKinds><Kind Name="FIELD" /><Kind Name="READONLY_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /></Policy> - <Policy><Descriptor Staticness="Static" AccessRightKinds="Private" Description="Static fields (private)"><ElementKinds><Kind Name="FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /></Policy> - True - True - True - True - True - True - True - True - True - True diff --git a/tests/CreativeCoders.MiscTest.UnitTests/CreativeCoders.MiscTest.UnitTests.csproj b/tests/CreativeCoders.MiscTest.UnitTests/CreativeCoders.MiscTest.UnitTests.csproj index d35fcf4b..df0ffd91 100644 --- a/tests/CreativeCoders.MiscTest.UnitTests/CreativeCoders.MiscTest.UnitTests.csproj +++ b/tests/CreativeCoders.MiscTest.UnitTests/CreativeCoders.MiscTest.UnitTests.csproj @@ -10,8 +10,8 @@ - - + + @@ -22,11 +22,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all - - - - - + diff --git a/tests/CreativeCoders.MiscTest.UnitTests/NukeBuild/GitVersionWrapperTests.cs b/tests/CreativeCoders.MiscTest.UnitTests/NukeBuild/GitVersionWrapperTests.cs deleted file mode 100644 index b1d1cbaa..00000000 --- a/tests/CreativeCoders.MiscTest.UnitTests/NukeBuild/GitVersionWrapperTests.cs +++ /dev/null @@ -1,270 +0,0 @@ -using CreativeCoders.NukeBuild; -using FakeItEasy; -using AwesomeAssertions; -using Nuke.Common.Tools.GitVersion; -using Xunit; - -namespace CreativeCoders.MiscTest.UnitTests.NukeBuild; - -public class GitVersionWrapperTests -{ - [Theory] - [InlineData("1", 1, 1, 1, 0, "")] - [InlineData("1.0", 1, 1, 0, 1, "")] - [InlineData("1.0.1", 1, 1, 1, 1, "1")] - public void GetAssemblySemVer_GitVersionThrowsException_ReturnsDefaultVersion( - string defaultVersion, int defaultBuildRevision, int expectedMajor, - int expectedMinor, int expectedPatch, string expectedBuildMetaData) - { - var gitVersion = CreateGitVersion(expectedMajor, expectedMinor, expectedPatch, expectedBuildMetaData); - - var versionWrapper = new GitVersionWrapper(gitVersion, defaultVersion, defaultBuildRevision); - - // Act - var actualVersion = versionWrapper.GetAssemblySemVer(); - - // Assert - actualVersion - .Should() - .Be($"{expectedMajor}.{expectedMinor}.{expectedPatch}-{expectedBuildMetaData}"); - } - - [Theory] - [InlineData("1", 1, 1, 1, 0, "")] - [InlineData("1.0", 1, 1, 0, 1, "")] - [InlineData("1.0.1", 1, 1, 1, 1, "1")] - public void GetAssemblySemVer_GitVersionReturnsNull_ReturnsDefaultVersion( - string defaultVersion, int defaultBuildRevision, int expectedMajor, - int expectedMinor, int expectedPatch, string expectedBuildMetaData) - { - var gitVersion = CreateGitVersion(expectedMajor, expectedMinor, expectedPatch, expectedBuildMetaData); - - var versionWrapper = new GitVersionWrapper(gitVersion, defaultVersion, defaultBuildRevision); - - // Act - var actualVersion = versionWrapper.GetAssemblySemVer(); - - // Assert - actualVersion - .Should() - .Be($"{expectedMajor}.{expectedMinor}.{expectedPatch}-{expectedBuildMetaData}"); - } - - [Theory] - [InlineData(1, 1, 0, "")] - [InlineData(1, 0, 1, "")] - [InlineData(1, 1, 1, "1")] - public void GetAssemblySemVer_GitVersionReturnsVersion_ReturnsVersion(int expectedMajor, - int expectedMinor, int expectedPatch, string expectedBuildMetaData) - { - var gitVersion = CreateGitVersion(expectedMajor, expectedMinor, expectedPatch, expectedBuildMetaData); - - var versionWrapper = new GitVersionWrapper(gitVersion, "2.0", 2); - - // Act - var actualVersion = versionWrapper.GetAssemblySemVer(); - - // Assert - actualVersion - .Should() - .Be($"{expectedMajor}.{expectedMinor}.{expectedPatch}-{expectedBuildMetaData}"); - } - - [Theory] - [InlineData("1", 1)] - [InlineData("1.0", 1)] - [InlineData("1.0.1", 1)] - public void GetAssemblySemFileVer_GitVersionReturnsNull_ReturnsDefaultVersion( - string defaultVersion, int defaultBuildRevision) - { - var gitVersion = CreateGitVersionWithEmptyProps(); - - var versionWrapper = new GitVersionWrapper(gitVersion, defaultVersion, defaultBuildRevision); - - // Act - var actualVersion = versionWrapper.GetAssemblySemFileVer(); - - // Assert - actualVersion - .Should() - .Be(defaultVersion + $".{defaultBuildRevision}"); - } - - [Theory] - [InlineData(1, 0, 0, "")] - [InlineData(1, 2, 3, "b12")] - public void GetAssemblySemFileVer_GitVersionReturnsVersion_ReturnsVersion(int expectedMajor, - int expectedMinor, int expectedPatch, string expectedBuildMetaData) - { - var gitVersion = CreateGitVersion(expectedMajor, expectedMinor, expectedPatch, expectedBuildMetaData); - - var versionWrapper = new GitVersionWrapper(gitVersion, "2.0", 2); - - // Act - var actualVersion = versionWrapper.GetAssemblySemFileVer(); - - // Assert - actualVersion - .Should() - .Be($"{expectedMajor}.{expectedMinor}.{expectedPatch}-{expectedBuildMetaData}"); - } - - [Theory] - [InlineData("1", 1, "1.1-unknown")] - [InlineData("1.0", 1, "1.0.1-unknown")] - [InlineData("1.0.1", 1, "1.0.1.1-unknown")] - public void InformationalVersion_GitVersionReturnsNull_ReturnsDefaultVersion( - string defaultVersion, int defaultBuildRevision, string expectedVersion) - { - var gitVersion = CreateGitVersionWithEmptyProps(); - - var versionWrapper = new GitVersionWrapper(gitVersion, defaultVersion, defaultBuildRevision); - - // Act - var actualVersion = versionWrapper.InformationalVersion; - - // Assert - actualVersion - .Should() - .Be(expectedVersion); - } - - [Theory] - [InlineData(1, 0, 0, "")] - [InlineData(1, 2, 3, "b12")] - public void InformationalVersion_GitVersionReturnsVersion_ReturnsVersion(int expectedMajor, - int expectedMinor, int expectedPatch, string expectedBuildMetaData) - { - var gitVersion = CreateGitVersion(expectedMajor, expectedMinor, expectedPatch, expectedBuildMetaData); - - var versionWrapper = new GitVersionWrapper(gitVersion, "2.0", 2); - - // Act - var actualVersion = versionWrapper.InformationalVersion; - - // Assert - actualVersion - .Should() - .Be($"{expectedMajor}.{expectedMinor}.{expectedPatch}-{expectedBuildMetaData}"); - } - - [Theory] - [InlineData("1", 1, "1-unknown")] - [InlineData("1.0", 1, "1.0-unknown")] - [InlineData("1.0.1", 1, "1.0.1-unknown")] - public void NuGetVersionV2_GitVersionReturnsNull_ReturnsDefaultVersion( - string defaultVersion, int defaultBuildRevision, string expectedVersion) - { - var gitVersion = CreateGitVersionWithEmptyProps(); - - var versionWrapper = new GitVersionWrapper(gitVersion, defaultVersion, defaultBuildRevision); - - // Act - var actualVersion = versionWrapper.NuGetVersionV2; - - // Assert - actualVersion - .Should() - .Be(expectedVersion); - } - - [Theory] - [InlineData(1, 0, 0, "")] - [InlineData(1, 2, 3, "b12")] - public void NuGetVersionV2_GitVersionReturnsVersion_ReturnsVersion(int expectedMajor, - int expectedMinor, int expectedPatch, string expectedBuildMetaData) - { - var gitVersion = CreateGitVersion(expectedMajor, expectedMinor, expectedPatch, expectedBuildMetaData); - - var versionWrapper = new GitVersionWrapper(gitVersion, "2.0", 2); - - // Act - var actualVersion = versionWrapper.NuGetVersionV2; - - // Assert - actualVersion - .Should() - .Be($"{expectedMajor}.{expectedMinor}.{expectedPatch}"); - } - - private GitVersion CreateGitVersionWithEmptyProps() - { - return new GitVersion( - BranchName: "main", - Sha: "dummySha", - ShortSha: "dummy", - Major: 0, - Minor: 0, - Patch: 0, - PreReleaseTag: string.Empty, - PreReleaseTagWithDash: string.Empty, - PreReleaseLabel: string.Empty, - PreReleaseLabelWithDash: string.Empty, - PreReleaseNumber: null, - WeightedPreReleaseNumber: null, - BuildMetaData: null, - BuildMetaDataPadded: string.Empty, - FullBuildMetaData: string.Empty, - MajorMinorPatch: null, - SemVer: null, - LegacySemVer: null, - LegacySemVerPadded: null, - AssemblySemVer: null, - AssemblySemFileVer: null, - FullSemVer: null, - InformationalVersion: null, - EscapedBranchName: "main", - CommitDate: DateTimeOffset.Now.ToString(), - CommitsSinceVersionSource: "0", - CommitsSinceVersionSourcePadded: "0000", - UncommittedChanges: 0, - VersionSourceSha: "dummySourceSha", - NuGetVersionV2: null, - NuGetVersion: null, - NuGetPreReleaseTagV2: string.Empty, - NuGetPreReleaseTag: string.Empty - ); - } - - private GitVersion CreateGitVersion(int major, int minor, int patch, string buildMetaData) - { - var shortVersion = $"{major}.{minor}.{patch}"; - var fullVersion = $"{major}.{minor}.{patch}-{buildMetaData}"; - - return new GitVersion( - BranchName: "main", - Sha: "dummySha", - ShortSha: "dummy", - Major: major, - Minor: minor, - Patch: patch, - PreReleaseTag: string.Empty, - PreReleaseTagWithDash: string.Empty, - PreReleaseLabel: string.Empty, - PreReleaseLabelWithDash: string.Empty, - PreReleaseNumber: null, - WeightedPreReleaseNumber: null, - BuildMetaData: buildMetaData, - BuildMetaDataPadded: string.Empty, - FullBuildMetaData: string.Empty, - MajorMinorPatch: shortVersion, - SemVer: shortVersion, - LegacySemVer: shortVersion, - LegacySemVerPadded: shortVersion, - AssemblySemVer: fullVersion, - AssemblySemFileVer: fullVersion, - FullSemVer: shortVersion, - InformationalVersion: fullVersion, - EscapedBranchName: "main", - CommitDate: DateTimeOffset.Now.ToString(), - CommitsSinceVersionSource: "0", - CommitsSinceVersionSourcePadded: "0000", - UncommittedChanges: 0, - VersionSourceSha: "dummySourceSha", - NuGetVersionV2: shortVersion, - NuGetVersion: shortVersion, - NuGetPreReleaseTagV2: string.Empty, - NuGetPreReleaseTag: string.Empty - ); - } -} diff --git a/tests/CreativeCoders.NukeBuild.Tests/CreativeCoders.NukeBuild.Tests.csproj b/tests/CreativeCoders.NukeBuild.Tests/CreativeCoders.NukeBuild.Tests.csproj index b6c59270..61fc06fa 100644 --- a/tests/CreativeCoders.NukeBuild.Tests/CreativeCoders.NukeBuild.Tests.csproj +++ b/tests/CreativeCoders.NukeBuild.Tests/CreativeCoders.NukeBuild.Tests.csproj @@ -29,8 +29,4 @@ - - - - From dee41a2b11b8f5a42815b643e400004c10376be5 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 10 Jan 2026 17:37:12 +0100 Subject: [PATCH 55/73] Set `TERM=xterm` and enable ANSI color redirection in integration workflow environments --- .github/workflows/integration.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 9f734b4c..ca481932 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -34,6 +34,9 @@ jobs: windows-latest: name: windows-latest runs-on: windows-latest + env: + TERM: xterm + DOTNET_SYSTEM_CONSOLE_ALLOW_ANSI_COLOR_REDIRECTION: 1 steps: - uses: actions/checkout@v5 with: @@ -54,6 +57,9 @@ jobs: macos-latest: name: macos-latest runs-on: macos-latest + env: + TERM: xterm + DOTNET_SYSTEM_CONSOLE_ALLOW_ANSI_COLOR_REDIRECTION: 1 steps: - uses: actions/checkout@v4 with: From f13ccadab06b45b45636532d8911e24854e333eb Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 10 Jan 2026 18:01:03 +0100 Subject: [PATCH 56/73] Refactor `TestServerContext` to use `IHost` instead of `TestServer`'s built-in hosting and clean up unused package references in projects. --- ...oders.Messaging.DefaultMessageQueue.csproj | 4 --- .../TokenAuth/Jwt/TestServerContext.cs | 25 ++++++++++++++----- .../CreativeCoders.MiscTest.UnitTests.csproj | 1 - 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/source/Messaging/CreativeCoders.Messaging.DefaultMessageQueue/CreativeCoders.Messaging.DefaultMessageQueue.csproj b/source/Messaging/CreativeCoders.Messaging.DefaultMessageQueue/CreativeCoders.Messaging.DefaultMessageQueue.csproj index 7690a83b..77f02e75 100644 --- a/source/Messaging/CreativeCoders.Messaging.DefaultMessageQueue/CreativeCoders.Messaging.DefaultMessageQueue.csproj +++ b/source/Messaging/CreativeCoders.Messaging.DefaultMessageQueue/CreativeCoders.Messaging.DefaultMessageQueue.csproj @@ -5,10 +5,6 @@ Default message queue implementation for CreativeCoders.Messaging.Core - - - - diff --git a/tests/CreativeCoders.AspNetCore.Tests/TokenAuth/Jwt/TestServerContext.cs b/tests/CreativeCoders.AspNetCore.Tests/TokenAuth/Jwt/TestServerContext.cs index f5f72cf2..3096e573 100644 --- a/tests/CreativeCoders.AspNetCore.Tests/TokenAuth/Jwt/TestServerContext.cs +++ b/tests/CreativeCoders.AspNetCore.Tests/TokenAuth/Jwt/TestServerContext.cs @@ -15,6 +15,8 @@ public sealed class TestServerContext : IAsyncDisposable { private readonly TestServer _testServer; + private readonly IHost _host; + public TestServerContext(Action? configureServices = null, Action? configureJwtApiOptions = null, Action? configureTokenApiOptions = null, @@ -52,7 +54,11 @@ public TestServerContext(Action? configureServices = null, }); }); - _testServer = new TestServer(webHostBuilder); + _host = webHostBuilder.Build(); + + _host.StartAsync().Wait(); + + _testServer = _host.GetTestServer(); HttpClient = _testServer.CreateClient(); } @@ -67,15 +73,22 @@ public TestServerContext(Action? configureServices = null, public async ValueTask DisposeAsync() { - await _testServer.Host.StopAsync(); + await _host.StopAsync(); + _host.Dispose(); _testServer.Dispose(); } - private static IWebHostBuilder SetupWebHostBuilder(Action? configureServices) + private static IHostBuilder SetupWebHostBuilder(Action? configureServices) { - return new WebHostBuilder() - .ConfigureServices(services => configureServices?.Invoke(services)) - .UseStartup(); + return new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .ConfigureServices(services => configureServices?.Invoke(services)) + .UseTestServer() // If using TestServer + .UseContentRoot(Directory.GetCurrentDirectory()) + .UseStartup(); + }); } } diff --git a/tests/CreativeCoders.MiscTest.UnitTests/CreativeCoders.MiscTest.UnitTests.csproj b/tests/CreativeCoders.MiscTest.UnitTests/CreativeCoders.MiscTest.UnitTests.csproj index df0ffd91..c6287dab 100644 --- a/tests/CreativeCoders.MiscTest.UnitTests/CreativeCoders.MiscTest.UnitTests.csproj +++ b/tests/CreativeCoders.MiscTest.UnitTests/CreativeCoders.MiscTest.UnitTests.csproj @@ -9,7 +9,6 @@ - From c2f49ba67e17b13adff39c0a3a1ed1d73c24e5f2 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 10 Jan 2026 18:03:56 +0100 Subject: [PATCH 57/73] Simplify build script by removing `pipefail` option in `set` command. --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index c70522ec..35eaabae 100755 --- a/build.sh +++ b/build.sh @@ -2,7 +2,7 @@ bash --version 2>&1 | head -n 1 -set -eo pipefail +set -e SCRIPT_DIR=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd) ########################################################################### From c9f46a53b02daacf8a54ccfa741bfc333f5cfc6d Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 10 Jan 2026 18:08:58 +0100 Subject: [PATCH 58/73] Refactor build script to simplify .NET SDK setup and update integration workflow to use PowerShell build script --- .github/workflows/integration.yml | 2 +- build.ps1 | 35 +++---------------------------- 2 files changed, 4 insertions(+), 33 deletions(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index ca481932..bacce75f 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -48,7 +48,7 @@ jobs: ~/.nuget/packages key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} - name: 'Run: DeployNuGet' - run: sh ./build.sh -t pack + run: ./build.ps1 -t pack - name: 'Publish: coverage_report' uses: actions/upload-artifact@v4 with: diff --git a/build.ps1 b/build.ps1 index 4634dc03..1b91f63a 100644 --- a/build.ps1 +++ b/build.ps1 @@ -13,12 +13,8 @@ $PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent # CONFIGURATION ########################################################################### -$BuildProjectFile = "$PSScriptRoot\build\_build.csproj" -$TempDirectory = "$PSScriptRoot\\.nuke\temp" - +$BuildProjectFile = "$PSScriptRoot\build\Build.csproj" $DotNetGlobalFile = "$PSScriptRoot\\global.json" -$DotNetInstallUrl = "https://dot.net/v1/dotnet-install.ps1" -$DotNetChannel = "STS" $env:DOTNET_CLI_TELEMETRY_OPTOUT = 1 $env:DOTNET_NOLOGO = 1 @@ -38,37 +34,12 @@ if ($null -ne (Get-Command "dotnet" -ErrorAction SilentlyContinue) -and ` $env:DOTNET_EXE = (Get-Command "dotnet").Path } else { - # Download install script - $DotNetInstallFile = "$TempDirectory\dotnet-install.ps1" - New-Item -ItemType Directory -Path $TempDirectory -Force | Out-Null - [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 - (New-Object System.Net.WebClient).DownloadFile($DotNetInstallUrl, $DotNetInstallFile) - - # If global.json exists, load expected version - if (Test-Path $DotNetGlobalFile) { - $DotNetGlobal = $(Get-Content $DotNetGlobalFile | Out-String | ConvertFrom-Json) - if ($DotNetGlobal.PSObject.Properties["sdk"] -and $DotNetGlobal.sdk.PSObject.Properties["version"]) { - $DotNetVersion = $DotNetGlobal.sdk.version - } - } + Write-Host "No matching dotnet version found" - # Install by channel or version - $DotNetDirectory = "$TempDirectory\dotnet-win" - if (!(Test-Path variable:DotNetVersion)) { - ExecSafe { & powershell $DotNetInstallFile -InstallDir $DotNetDirectory -Channel $DotNetChannel -NoPath } - } else { - ExecSafe { & powershell $DotNetInstallFile -InstallDir $DotNetDirectory -Version $DotNetVersion -NoPath } - } - $env:DOTNET_EXE = "$DotNetDirectory\dotnet.exe" - $env:PATH = "$DotNetDirectory;$env:PATH" + exit 1 } Write-Output "Microsoft (R) .NET SDK version $(& $env:DOTNET_EXE --version)" -if (Test-Path env:NUKE_ENTERPRISE_TOKEN) { - & $env:DOTNET_EXE nuget remove source "nuke-enterprise" > $null - & $env:DOTNET_EXE nuget add source "https://f.feedz.io/nuke/enterprise/nuget" --name "nuke-enterprise" --username "PAT" --password $env:NUKE_ENTERPRISE_TOKEN > $null -} - ExecSafe { & $env:DOTNET_EXE build $BuildProjectFile /nodeReuse:false /p:UseSharedCompilation=false -nologo -clp:NoSummary --verbosity quiet } ExecSafe { & $env:DOTNET_EXE run --project $BuildProjectFile --no-build -- $BuildArguments } From 58a2b3d948b9973876520f7132e5ffb4f568530a Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 10 Jan 2026 18:11:49 +0100 Subject: [PATCH 59/73] Update integration workflow to use `bash` instead of `sh` for NuGet push --- .github/workflows/integration.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index bacce75f..f80e4d47 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -25,7 +25,7 @@ jobs: - name: 'Run: DeployNuGet' env: NUGET_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: sh ./build.sh -t nugetpush + run: bash ./build.sh -t nugetpush - name: 'Publish: coverage-report' uses: actions/upload-artifact@v4 with: From 04dc7fd2e0115446ffa9fe3df02f0b5def4bc078 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 10 Jan 2026 18:14:59 +0100 Subject: [PATCH 60/73] Update integration workflow step names for consistency and clarity in build targets --- .github/workflows/integration.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index f80e4d47..48ff8415 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -22,7 +22,7 @@ jobs: path: | ~/.nuget/packages key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} - - name: 'Run: DeployNuGet' + - name: 'Build with target: NuGetPush' env: NUGET_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: bash ./build.sh -t nugetpush @@ -47,7 +47,7 @@ jobs: path: | ~/.nuget/packages key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} - - name: 'Run: DeployNuGet' + - name: 'Build with target: Pack' run: ./build.ps1 -t pack - name: 'Publish: coverage_report' uses: actions/upload-artifact@v4 @@ -70,7 +70,7 @@ jobs: path: | ~/.nuget/packages key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} - - name: 'Run: DeployNuGet' + - name: 'Build with target: Pack' run: sh ./build.sh -t pack - name: 'Publish: coverage_report' uses: actions/upload-artifact@v4 From dfc336dfab847434995f9dc7c6c1de69840e4270 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 10 Jan 2026 18:20:25 +0100 Subject: [PATCH 61/73] Update integration workflow to use `cmd` for build commands instead of `sh` and `ps1` --- .github/workflows/integration.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 48ff8415..26e4f516 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -25,7 +25,7 @@ jobs: - name: 'Build with target: NuGetPush' env: NUGET_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: bash ./build.sh -t nugetpush + run: ./build.cmd -t nugetpush - name: 'Publish: coverage-report' uses: actions/upload-artifact@v4 with: @@ -48,7 +48,7 @@ jobs: ~/.nuget/packages key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} - name: 'Build with target: Pack' - run: ./build.ps1 -t pack + run: ./build.cmd -t pack - name: 'Publish: coverage_report' uses: actions/upload-artifact@v4 with: @@ -71,7 +71,7 @@ jobs: ~/.nuget/packages key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} - name: 'Build with target: Pack' - run: sh ./build.sh -t pack + run: ./build.cmd -t pack - name: 'Publish: coverage_report' uses: actions/upload-artifact@v4 with: From eec4e7ea6715e2cecf3112c2b1d09364834df5ab Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 10 Jan 2026 18:28:36 +0100 Subject: [PATCH 62/73] Add "samples" as default source directory in `ICleanTaskSettings` and fix coverage report path in integration workflow --- .github/workflows/integration.yml | 4 ++-- .../Tasks/Templates/Settings/ICleanTaskSettings.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 26e4f516..f71cd5c1 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -53,7 +53,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: coverage-report-windows - path: .tests/coverage_report + path: .tests/coverage-report macos-latest: name: macos-latest runs-on: macos-latest @@ -76,4 +76,4 @@ jobs: uses: actions/upload-artifact@v4 with: name: coverage-report-macos - path: .tests/coverage_report + path: .tests/coverage-report diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs index 8797e211..199f69b7 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs @@ -11,7 +11,7 @@ IList GetDefaultDirectoriesToClean() { var dirs = new List(); - string[] defaultSourceDirs = ["source", "src", "tests"]; + string[] defaultSourceDirs = ["source", "src", "samples", "tests"]; foreach (var defaultSourceDir in defaultSourceDirs) { From 8d17e07abde2aaa62345c26b678922883c1d9004 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 10 Jan 2026 18:37:10 +0100 Subject: [PATCH 63/73] Remove deprecated Nuke build system configurations and update workflows for Cake.build integration. --- .github/workflows/main.yml | 58 ++++--------- .github/workflows/pull-request.yml | 58 ++++--------- .github/workflows/release.yml | 30 ++----- .nuke/build.schema.json | 133 ----------------------------- .nuke/parameters.json | 4 - 5 files changed, 37 insertions(+), 246 deletions(-) delete mode 100644 .nuke/build.schema.json delete mode 100644 .nuke/parameters.json diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 071377c0..60afb089 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,19 +1,3 @@ -# ------------------------------------------------------------------------------ -# -# -# This code was generated. -# -# - To turn off auto-generation set: -# -# [GitHubActions (AutoGenerate = false)] -# -# - To trigger manual generation invoke: -# -# nuke --generate-configuration GitHubActions_main --host GitHubActions -# -# -# ------------------------------------------------------------------------------ - name: main on: @@ -29,23 +13,21 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 - - name: 'Cache: .nuke/temp, ~/.nuget/packages' + - name: 'Cache: ~/.nuget/packages' uses: actions/cache@v4 with: path: | - .nuke/temp ~/.nuget/packages key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} - - name: 'Run: DeployNuGet' - run: ./build.cmd DeployNuGet + - name: 'Build with target: NuGetPush' + run: ./build.cmd -t nugetpush env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NUGET_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: 'Publish: coverage_report' uses: actions/upload-artifact@v4 - if: runner.os == 'Linux' with: - name: coverage_report - path: .tests/coverage_report + name: coverage-report-linux + path: .tests/coverage-report windows-latest: name: windows-latest runs-on: windows-latest @@ -53,23 +35,19 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 - - name: 'Cache: .nuke/temp, ~/.nuget/packages' + - name: 'Cache: ~/.nuget/packages' uses: actions/cache@v4 with: path: | - .nuke/temp ~/.nuget/packages key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} - - name: 'Run: DeployNuGet' - run: ./build.cmd DeployNuGet - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: 'Build with target: Pack' + run: ./build.cmd -t pack - name: 'Publish: coverage_report' uses: actions/upload-artifact@v4 - if: runner.os == 'Linux' with: - name: coverage_report - path: .tests/coverage_report + name: coverage-report-windows + path: .tests/coverage-report macos-latest: name: macos-latest runs-on: macos-latest @@ -77,20 +55,16 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 - - name: 'Cache: .nuke/temp, ~/.nuget/packages' + - name: 'Cache: ~/.nuget/packages' uses: actions/cache@v4 with: path: | - .nuke/temp ~/.nuget/packages key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} - - name: 'Run: DeployNuGet' - run: ./build.cmd DeployNuGet - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: 'Build with target: Pack' + run: ./build.cmd -t pack - name: 'Publish: coverage_report' uses: actions/upload-artifact@v4 - if: runner.os == 'Linux' with: - name: coverage_report - path: .tests/coverage_report + name: coverage-report-macos + path: .tests/coverage-report diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 9da0231a..1436ef8a 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -1,19 +1,3 @@ -# ------------------------------------------------------------------------------ -# -# -# This code was generated. -# -# - To turn off auto-generation set: -# -# [GitHubActions (AutoGenerate = false)] -# -# - To trigger manual generation invoke: -# -# nuke --generate-configuration GitHubActions_pull-request --host GitHubActions -# -# -# ------------------------------------------------------------------------------ - name: pull-request on: @@ -29,23 +13,19 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 - - name: 'Cache: .nuke/temp, ~/.nuget/packages' + - name: 'Cache: ~/.nuget/packages' uses: actions/cache@v4 with: path: | - .nuke/temp ~/.nuget/packages key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} - - name: 'Run: Rebuild, CodeCoverage, Pack' - run: ./build.cmd Rebuild CodeCoverage Pack - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: 'Build with target: Pack' + run: ./build.cmd -t pack - name: 'Publish: coverage_report' uses: actions/upload-artifact@v4 - if: runner.os == 'Linux' with: - name: coverage_report - path: .tests/coverage_report + name: coverage-report-linux + path: .tests/coverage-report windows-latest: name: windows-latest runs-on: windows-latest @@ -53,23 +33,19 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 - - name: 'Cache: .nuke/temp, ~/.nuget/packages' + - name: 'Cache: ~/.nuget/packages' uses: actions/cache@v4 with: path: | - .nuke/temp ~/.nuget/packages key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} - - name: 'Run: Rebuild, CodeCoverage, Pack' - run: ./build.cmd Rebuild CodeCoverage Pack - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: 'Build with target: Pack' + run: ./build.cmd -t pack - name: 'Publish: coverage_report' uses: actions/upload-artifact@v4 - if: runner.os == 'Linux' with: - name: coverage_report - path: .tests/coverage_report + name: coverage-report-windows + path: .tests/coverage-report macos-latest: name: macos-latest runs-on: macos-latest @@ -77,20 +53,16 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 - - name: 'Cache: .nuke/temp, ~/.nuget/packages' + - name: 'Cache: ~/.nuget/packages' uses: actions/cache@v4 with: path: | - .nuke/temp ~/.nuget/packages key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} - - name: 'Run: Rebuild, CodeCoverage, Pack' - run: ./build.cmd Rebuild CodeCoverage Pack - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: 'Build with target: Pack' + run: ./build.cmd pack - name: 'Publish: coverage_report' uses: actions/upload-artifact@v4 - if: runner.os == 'Linux' with: - name: coverage_report - path: .tests/coverage_report + name: coverage-report-macos + path: .tests/coverage-report diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e420f1a9..696c1ab6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,19 +1,3 @@ -# ------------------------------------------------------------------------------ -# -# -# This code was generated. -# -# - To turn off auto-generation set: -# -# [GitHubActions (AutoGenerate = false)] -# -# - To trigger manual generation invoke: -# -# nuke --generate-configuration GitHubActions_release --host GitHubActions -# -# -# ------------------------------------------------------------------------------ - name: release on: @@ -29,20 +13,18 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 - - name: 'Cache: .nuke/temp, ~/.nuget/packages' + - name: 'Cache: ~/.nuget/packages' uses: actions/cache@v4 with: path: | - .nuke/temp ~/.nuget/packages key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} - - name: 'Run: DeployNuGet' - run: ./build.cmd DeployNuGet + - name: 'Build with target: NuGetPush' + run: ./build.cmd -t nugetpush env: - NUGET_ORG_TOKEN: ${{ secrets.NUGET_ORG_TOKEN }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NUGET_TOKEN: ${{ secrets.NUGET_ORG_TOKEN }} - name: 'Publish: coverage_report' uses: actions/upload-artifact@v4 with: - name: coverage_report - path: .tests/coverage_report + name: coverage-report-linux + path: .tests/coverage-report diff --git a/.nuke/build.schema.json b/.nuke/build.schema.json deleted file mode 100644 index be4fe84f..00000000 --- a/.nuke/build.schema.json +++ /dev/null @@ -1,133 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": { - "Host": { - "type": "string", - "enum": [ - "AppVeyor", - "AzurePipelines", - "Bamboo", - "Bitbucket", - "Bitrise", - "GitHubActions", - "GitLab", - "Jenkins", - "Rider", - "SpaceAutomation", - "TeamCity", - "Terminal", - "TravisCI", - "VisualStudio", - "VSCode" - ] - }, - "ExecutableTarget": { - "type": "string", - "enum": [ - "Build", - "Clean", - "CodeCoverage", - "DeployNuGet", - "Pack", - "PushNuGet", - "Rebuild", - "Restore", - "Test" - ] - }, - "Verbosity": { - "type": "string", - "description": "", - "enum": [ - "Verbose", - "Normal", - "Minimal", - "Quiet" - ] - }, - "NukeBuild": { - "properties": { - "Continue": { - "type": "boolean", - "description": "Indicates to continue a previously failed build attempt" - }, - "Help": { - "type": "boolean", - "description": "Shows the help text for this build assembly" - }, - "Host": { - "description": "Host for execution. Default is 'automatic'", - "$ref": "#/definitions/Host" - }, - "NoLogo": { - "type": "boolean", - "description": "Disables displaying the NUKE logo" - }, - "Partition": { - "type": "string", - "description": "Partition to use on CI" - }, - "Plan": { - "type": "boolean", - "description": "Shows the execution plan (HTML)" - }, - "Profile": { - "type": "array", - "description": "Defines the profiles to load", - "items": { - "type": "string" - } - }, - "Root": { - "type": "string", - "description": "Root directory during build execution" - }, - "Skip": { - "type": "array", - "description": "List of targets to be skipped. Empty list skips all dependencies", - "items": { - "$ref": "#/definitions/ExecutableTarget" - } - }, - "Target": { - "type": "array", - "description": "List of targets to be invoked. Default is '{default_target}'", - "items": { - "$ref": "#/definitions/ExecutableTarget" - } - }, - "Verbosity": { - "description": "Logging verbosity during build execution. Default is 'Normal'", - "$ref": "#/definitions/Verbosity" - } - } - } - }, - "allOf": [ - { - "properties": { - "Configuration": { - "type": "string", - "description": "Configuration to build - Default is 'Debug' (local) or 'Release' (server)", - "enum": [ - "Debug", - "Release" - ] - }, - "GITHUB_TOKEN": { - "type": "string" - }, - "NUGET_ORG_TOKEN": { - "type": "string" - }, - "Solution": { - "type": "string", - "description": "Path to a solution file that is automatically loaded" - } - } - }, - { - "$ref": "#/definitions/NukeBuild" - } - ] -} diff --git a/.nuke/parameters.json b/.nuke/parameters.json deleted file mode 100644 index 4eb7c338..00000000 --- a/.nuke/parameters.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "$schema": "./build.schema.json", - "Solution": "Core.sln" -} From 60cdb7919727d43e2ebd879656998224331b8458 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 10 Jan 2026 18:46:50 +0100 Subject: [PATCH 64/73] Refactor tasks and settings to simplify syntax, enforce immutability, and add JetBrains annotations. --- Core.sln.DotSettings | 3 ++- .../DotNetMSBuildSettingsExtensions.cs | 2 ++ .../DotNetToolInstallation.cs | 5 +++- .../ICakeBuildContext.cs | 2 ++ .../NuGetToolInstallation.cs | 5 +++- .../Tasks/Defaults/BuildTask.cs | 2 +- .../Tasks/Defaults/CleanTask.cs | 2 +- .../Tasks/Defaults/CodeCoverageTask.cs | 2 +- .../Tasks/Defaults/NuGetPushTask.cs | 2 +- .../Tasks/Defaults/PackTask.cs | 2 +- .../Tasks/Defaults/TestTask.cs | 2 +- .../Tasks/Templates/CodeCoverageTask.cs | 3 +-- .../Tasks/Templates/PackTask.cs | 2 +- .../Settings/CakeTaskSettingsAttribute.cs | 2 +- .../Templates/Settings/ICleanTaskSettings.cs | 24 +++++++++---------- .../ToolInstallation.cs | 8 +++---- 16 files changed, 39 insertions(+), 29 deletions(-) diff --git a/Core.sln.DotSettings b/Core.sln.DotSettings index 20d15ded..c36b219f 100644 --- a/Core.sln.DotSettings +++ b/Core.sln.DotSettings @@ -47,7 +47,8 @@ IO LGPL MIT - MPL + MPL + MS OS False <Policy Inspect="True" Prefix="__" Suffix="" Style="aaBb"><ExtraRule Prefix="Command" Suffix="" Style="AaBb" /></Policy> diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/DotNetMSBuildSettingsExtensions.cs b/source/CakeBuild/CreativeCoders.CakeBuild/DotNetMSBuildSettingsExtensions.cs index d69b2589..9d5b24e4 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/DotNetMSBuildSettingsExtensions.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/DotNetMSBuildSettingsExtensions.cs @@ -1,7 +1,9 @@ using Cake.Common.Tools.DotNet.MSBuild; +using JetBrains.Annotations; namespace CreativeCoders.CakeBuild; +[PublicAPI] public static class DotNetMSBuildSettingsExtensions { public static DotNetMSBuildSettings WithPackageProjectUrl(this DotNetMSBuildSettings settings, diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/DotNetToolInstallation.cs b/source/CakeBuild/CreativeCoders.CakeBuild/DotNetToolInstallation.cs index e883127b..7c672625 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/DotNetToolInstallation.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/DotNetToolInstallation.cs @@ -1,3 +1,6 @@ +using JetBrains.Annotations; + namespace CreativeCoders.CakeBuild; -public class DotNetToolInstallation(string name, string version) : ToolInstallation("dotnet", name, version); \ No newline at end of file +[PublicAPI] +public class DotNetToolInstallation(string name, string version) : ToolInstallation("dotnet", name, version); diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/ICakeBuildContext.cs b/source/CakeBuild/CreativeCoders.CakeBuild/ICakeBuildContext.cs index 7e8f3b04..26990553 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/ICakeBuildContext.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/ICakeBuildContext.cs @@ -2,9 +2,11 @@ using Cake.Core; using Cake.Core.IO; using Cake.Frosting; +using JetBrains.Annotations; namespace CreativeCoders.CakeBuild; +[PublicAPI] public interface ICakeBuildContext : ICakeContext { FilePath SolutionFile { get; } diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/NuGetToolInstallation.cs b/source/CakeBuild/CreativeCoders.CakeBuild/NuGetToolInstallation.cs index a7b53873..e29dfe5c 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/NuGetToolInstallation.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/NuGetToolInstallation.cs @@ -1,3 +1,6 @@ +using JetBrains.Annotations; + namespace CreativeCoders.CakeBuild; -public class NuGetToolInstallation(string name, string version) : ToolInstallation("nuget", name, version); \ No newline at end of file +[PublicAPI] +public class NuGetToolInstallation(string name, string version) : ToolInstallation("nuget", name, version); diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/BuildTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/BuildTask.cs index a113fe98..f58f0c69 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/BuildTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/BuildTask.cs @@ -5,4 +5,4 @@ namespace CreativeCoders.CakeBuild.Tasks.Defaults; [TaskName("Build")] [IsDependentOn(typeof(RestoreTask))] -public class BuildTask() : BuildTask(); +public class BuildTask : BuildTask; diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CleanTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CleanTask.cs index 4676747a..9fc7d34d 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CleanTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CleanTask.cs @@ -4,4 +4,4 @@ namespace CreativeCoders.CakeBuild.Tasks.Defaults; [TaskName("Clean")] -public class CleanTask : CleanTask { } +public class CleanTask : CleanTask; diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CodeCoverageTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CodeCoverageTask.cs index 665a99de..1469fd88 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CodeCoverageTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/CodeCoverageTask.cs @@ -5,4 +5,4 @@ namespace CreativeCoders.CakeBuild.Tasks.Defaults; [TaskName("CodeCoverage")] [IsDependentOn(typeof(TestTask))] -public class CodeCoverageTask : CodeCoverageTask { } +public class CodeCoverageTask : CodeCoverageTask; diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/NuGetPushTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/NuGetPushTask.cs index a1c140af..9706cf88 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/NuGetPushTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/NuGetPushTask.cs @@ -5,4 +5,4 @@ namespace CreativeCoders.CakeBuild.Tasks.Defaults; [TaskName("NuGetPush")] [IsDependentOn(typeof(PackTask))] -public class NuGetPushTask : NuGetPushTask { } +public class NuGetPushTask : NuGetPushTask; diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/PackTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/PackTask.cs index 22a41bbf..452bbe86 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/PackTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/PackTask.cs @@ -5,4 +5,4 @@ namespace CreativeCoders.CakeBuild.Tasks.Defaults; [TaskName("Pack")] [IsDependentOn(typeof(CodeCoverageTask))] -public class PackTask : PackTask { } +public class PackTask : PackTask; diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/TestTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/TestTask.cs index 8d6b8863..780a6e81 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/TestTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Defaults/TestTask.cs @@ -5,4 +5,4 @@ namespace CreativeCoders.CakeBuild.Tasks.Defaults; [TaskName("Test")] [IsDependentOn(typeof(BuildTask))] -public class TestTask : TestTask { } +public class TestTask : TestTask; diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs index 77b73c7e..3ef801b5 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/CodeCoverageTask.cs @@ -1,5 +1,4 @@ -using Cake.Common.Diagnostics; -using Cake.Common.Tools.ReportGenerator; +using Cake.Common.Tools.ReportGenerator; using Cake.Core.IO; using CreativeCoders.CakeBuild.Tasks.Templates.Settings; diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs index fba6628f..8c418331 100755 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/PackTask.cs @@ -32,7 +32,7 @@ private DotNetPackSettings CreateDotNetPackSettings(T context, IPackTaskSettings InformationalVersion = context.Version.InformationalVersion, AssemblyVersion = context.Version.AssemblySemVer, FileVersion = context.Version.AssemblySemFileVer, - PackageVersion = context.Version.SemVer, + PackageVersion = context.Version.SemVer } }; diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/CakeTaskSettingsAttribute.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/CakeTaskSettingsAttribute.cs index 794e2faa..caa24a5f 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/CakeTaskSettingsAttribute.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/CakeTaskSettingsAttribute.cs @@ -1,4 +1,4 @@ namespace CreativeCoders.CakeBuild.Tasks.Templates.Settings; [AttributeUsage(AttributeTargets.Interface)] -public class CakeTaskSettingsAttribute : Attribute { } +public class CakeTaskSettingsAttribute : Attribute; diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs index 199f69b7..d94c0675 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/Tasks/Templates/Settings/ICleanTaskSettings.cs @@ -13,22 +13,22 @@ IList GetDefaultDirectoriesToClean() string[] defaultSourceDirs = ["source", "src", "samples", "tests"]; - foreach (var defaultSourceDir in defaultSourceDirs) - { - var sourceDir = Context.RootDir.Combine(defaultSourceDir); + var sourceDirs = defaultSourceDirs + .Select(x => Context.RootDir.Combine(x)) + .Where(Context.FileSystem.Exist) + .Select(x => x.FullPath); - if (Context.FileSystem.Exist(sourceDir)) - { - var binDirs = Context.Globber.Match(sourceDir.FullPath + "/**/bin") - .OfType(); + foreach (var sourceDir in sourceDirs) + { + var binDirs = Context.Globber.Match(sourceDir + "/**/bin") + .OfType(); - dirs.AddRange(binDirs); + dirs.AddRange(binDirs); - var objDirs = Context.Globber.Match(sourceDir.FullPath + "/**/obj") - .OfType(); + var objDirs = Context.Globber.Match(sourceDir + "/**/obj") + .OfType(); - dirs.AddRange(objDirs); - } + dirs.AddRange(objDirs); } dirs.AddRange([Context.ArtifactsDir, Context.TestOutputBasePath]); diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/ToolInstallation.cs b/source/CakeBuild/CreativeCoders.CakeBuild/ToolInstallation.cs index 9bfd55c5..1ba24b45 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/ToolInstallation.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/ToolInstallation.cs @@ -4,9 +4,9 @@ namespace CreativeCoders.CakeBuild; public class ToolInstallation(string toolKind, string name, string version) { - public string ToolKind { get; set; } = Ensure.IsNotNullOrWhitespace(toolKind); + public string ToolKind { get; } = Ensure.IsNotNullOrWhitespace(toolKind); - public string Name { get; set; } = Ensure.IsNotNullOrWhitespace(name); + public string Name { get; } = Ensure.IsNotNullOrWhitespace(name); - public string Version { get; set; } = Ensure.IsNotNullOrWhitespace(version); -} \ No newline at end of file + public string Version { get; } = Ensure.IsNotNullOrWhitespace(version); +} From 8ce0b6de236ec6b642453b165446f98ad3d64925 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sun, 11 Jan 2026 10:24:13 +0100 Subject: [PATCH 65/73] Set `TERM` and enable ANSI color redirection in all workflow environments; update GitVersion config for streamlined branch handling --- .github/workflows/main.yml | 9 +++++++++ .github/workflows/pull-request.yml | 9 +++++++++ .github/workflows/release.yml | 3 +++ GitVersion.yml | 17 +++-------------- 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 60afb089..474ef63e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -9,6 +9,9 @@ jobs: ubuntu-latest: name: ubuntu-latest runs-on: ubuntu-latest + env: + TERM: xterm + DOTNET_SYSTEM_CONSOLE_ALLOW_ANSI_COLOR_REDIRECTION: 1 steps: - uses: actions/checkout@v4 with: @@ -31,6 +34,9 @@ jobs: windows-latest: name: windows-latest runs-on: windows-latest + env: + TERM: xterm + DOTNET_SYSTEM_CONSOLE_ALLOW_ANSI_COLOR_REDIRECTION: 1 steps: - uses: actions/checkout@v4 with: @@ -51,6 +57,9 @@ jobs: macos-latest: name: macos-latest runs-on: macos-latest + env: + TERM: xterm + DOTNET_SYSTEM_CONSOLE_ALLOW_ANSI_COLOR_REDIRECTION: 1 steps: - uses: actions/checkout@v4 with: diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 1436ef8a..8193c58e 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -9,6 +9,9 @@ jobs: ubuntu-latest: name: ubuntu-latest runs-on: ubuntu-latest + env: + TERM: xterm + DOTNET_SYSTEM_CONSOLE_ALLOW_ANSI_COLOR_REDIRECTION: 1 steps: - uses: actions/checkout@v4 with: @@ -29,6 +32,9 @@ jobs: windows-latest: name: windows-latest runs-on: windows-latest + env: + TERM: xterm + DOTNET_SYSTEM_CONSOLE_ALLOW_ANSI_COLOR_REDIRECTION: 1 steps: - uses: actions/checkout@v4 with: @@ -49,6 +55,9 @@ jobs: macos-latest: name: macos-latest runs-on: macos-latest + env: + TERM: xterm + DOTNET_SYSTEM_CONSOLE_ALLOW_ANSI_COLOR_REDIRECTION: 1 steps: - uses: actions/checkout@v4 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 696c1ab6..1718a627 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,6 +9,9 @@ jobs: ubuntu-latest: name: ubuntu-latest runs-on: ubuntu-latest + env: + TERM: xterm + DOTNET_SYSTEM_CONSOLE_ALLOW_ANSI_COLOR_REDIRECTION: 1 steps: - uses: actions/checkout@v4 with: diff --git a/GitVersion.yml b/GitVersion.yml index cc29f663..df80f0e7 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -9,7 +9,7 @@ no-bump-message: '\+semver:\s?(none|skip)' mode: ContinuousDeployment branches: feature: - mode: ManualDeployment + mode: ContinuousDelivery label: feature.{BranchName} increment: Minor track-merge-target: false @@ -28,24 +28,14 @@ branches: increment: Patch track-merge-target: false regex: ^master$|^main$ + prevent-increment: + when-current-commit-tagged: false source-branches: - develop - release tracks-release-branches: false is-release-branch: false pre-release-weight: 55000 - release: - mode: ContinuousDeployment - label: beta - increment: None - track-merge-target: false - regex: ^releases?[/-] - source-branches: - - main - - release - tracks-release-branches: false - is-release-branch: true - pre-release-weight: 30000 pull-request: mode: ContinuousDeployment label: PR @@ -54,7 +44,6 @@ branches: regex: ^(pull|pull\-requests|pr)[/-] source-branches: - main - - release - feature tracks-release-branches: false is-release-branch: false From 9278add7d6123a4f9da8893552763e1b7353aa2d Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sun, 11 Jan 2026 11:20:36 +0100 Subject: [PATCH 66/73] Update release workflow to use `pack` target instead of `nugetpush` for build command for check functionality --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1718a627..70f1df0c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -23,7 +23,7 @@ jobs: ~/.nuget/packages key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} - name: 'Build with target: NuGetPush' - run: ./build.cmd -t nugetpush + run: ./build.cmd -t pack env: NUGET_TOKEN: ${{ secrets.NUGET_ORG_TOKEN }} - name: 'Publish: coverage_report' From 8418488e8637cb8caf356d8569a9d29c79dbe5dd Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sun, 11 Jan 2026 11:36:46 +0100 Subject: [PATCH 67/73] Log version information (informational, assembly, file, and package versions) in build context output. --- .../CreativeCoders.CakeBuild/CakeHostBuilder.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostBuilder.cs b/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostBuilder.cs index 04bd1eb4..54d777fc 100644 --- a/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostBuilder.cs +++ b/source/CakeBuild/CreativeCoders.CakeBuild/CakeHostBuilder.cs @@ -115,5 +115,14 @@ public void Setup(ICakeContext context, ISetupContext info) { context.Information($"Skip Push: {pushSettings.SkipPush}"); } + + var version = buildContext.Version; + + context.Information("Version Info"); + + context.Information($"Informational Version: {version.InformationalVersion}"); + context.Information($"Assembly Version: {version.AssemblySemVer}"); + context.Information($"File Version: {version.AssemblySemFileVer}"); + context.Information($"Package Version: {version.SemVer}"); } } From 3b4135204b6b658c239d0b5347052e58b5b07677 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sun, 11 Jan 2026 11:46:10 +0100 Subject: [PATCH 68/73] Remove CreativeCoders.NukeBuild and related components, actions, and configurations. Migrate to alternative build system. --- ...CreativeCoders.NukeBuild.Components.csproj | 19 --- .../GitHubActionsExtensions.cs | 27 ---- .../GitHubActionsRunnerOs.cs | 13 -- .../GithubReleaseTasks.cs | 79 ----------- .../Global.cs | 3 - .../NukeBuildExtensions.cs | 60 -------- .../Parameters/Configuration.cs | 17 --- .../Parameters/IConfigurationParameter.cs | 10 -- .../Parameters/IGitRepositoryParameter.cs | 13 -- .../Parameters/IGitVersionParameter.cs | 10 -- .../Parameters/ISolutionParameter.cs | 11 -- .../Parameters/ISourceDirectoryParameter.cs | 13 -- .../Targets/CommonTargetTasks.cs | 25 ---- .../Targets/IBuildTarget.cs | 39 ------ .../Targets/ICleanTarget.cs | 37 ----- .../Targets/ICodeCoverageTarget.cs | 26 ---- .../Targets/ICreateDistPackagesTarget.cs | 38 ----- .../Targets/ICreateGithubReleaseTarget.cs | 25 ---- .../Targets/IDeployNuGetTarget.cs | 13 -- .../Targets/IPackTarget.cs | 50 ------- .../Targets/IPublishTarget.cs | 74 ---------- .../Targets/IPushNuGetTarget.cs | 42 ------ .../Targets/IRebuildTarget.cs | 13 -- .../Targets/IRestoreTarget.cs | 33 ----- .../Targets/ITestTarget.cs | 49 ------- .../Targets/NukeTargets.cs | 31 ----- .../Targets/Settings/DistPackage.cs | 14 -- .../Targets/Settings/DistPackageFormat.cs | 7 - .../Targets/Settings/GithubReleaseAsset.cs | 9 -- .../Targets/Settings/IArtifactsSettings.cs | 9 -- .../Targets/Settings/ICleanSettings.cs | 28 ---- .../Targets/Settings/ICodeCoverageSettings.cs | 20 --- .../Settings/ICreateDistPackagesSettings.cs | 10 -- .../Settings/ICreateGithubReleaseSettings.cs | 19 --- .../Targets/Settings/IPackSettings.cs | 20 --- .../Targets/Settings/IPublishSettings.cs | 14 -- .../Targets/Settings/IPushNuGetSettings.cs | 14 -- .../Targets/Settings/ITestSettings.cs | 18 --- .../Targets/Settings/PublishingItem.cs | 18 --- .../ToolSettingsExtensions.cs | 12 -- .../BuildActions/BuildActionBase.cs | 38 ----- .../BuildActions/CleanBuildAction.cs | 34 ----- .../CopyToArtifactsBuildAction.cs | 43 ------ .../BuildActions/CoverageReportAction.cs | 47 ------- .../BuildActions/DotNetCompileBuildAction.cs | 21 --- .../BuildActions/DotNetPublishBuildAction.cs | 66 --------- .../BuildActions/DotNetRuntime.cs | 25 ---- .../BuildActions/DotNetTestAction.cs | 130 ------------------ .../BuildActions/IBuildAction.cs | 14 -- .../BuildActions/MsBuildCompileBuildAction.cs | 21 --- .../BuildActions/PackBuildAction.cs | 86 ------------ .../BuildActions/PackageLicenseExpressions.cs | 23 ---- .../BuildActions/PushBuildAction.cs | 73 ---------- .../BuildActions/RestoreBuildAction.cs | 16 --- .../CreativeCoders.NukeBuild.csproj | 16 --- .../GitVersionWrapper.cs | 42 ------ .../CreativeCoders.NukeBuild/IBuildInfo.cs | 22 --- .../CreativeCoders.NukeBuild/IVersionInfo.cs | 12 -- .../TargetDefinitionExtensions.cs | 56 -------- 59 files changed, 1767 deletions(-) delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/CreativeCoders.NukeBuild.Components.csproj delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/GitHubActionsExtensions.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/GitHubActionsRunnerOs.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/GithubReleaseTasks.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Global.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/NukeBuildExtensions.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Parameters/Configuration.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Parameters/IConfigurationParameter.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Parameters/IGitRepositoryParameter.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Parameters/IGitVersionParameter.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Parameters/ISolutionParameter.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Parameters/ISourceDirectoryParameter.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/CommonTargetTasks.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IBuildTarget.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/ICleanTarget.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/ICodeCoverageTarget.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/ICreateDistPackagesTarget.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/ICreateGithubReleaseTarget.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IDeployNuGetTarget.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IPackTarget.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IPublishTarget.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IPushNuGetTarget.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IRebuildTarget.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IRestoreTarget.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/ITestTarget.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/NukeTargets.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/DistPackage.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/DistPackageFormat.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/GithubReleaseAsset.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/IArtifactsSettings.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/ICleanSettings.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/ICodeCoverageSettings.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/ICreateDistPackagesSettings.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/ICreateGithubReleaseSettings.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/IPackSettings.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/IPublishSettings.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/IPushNuGetSettings.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/ITestSettings.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/PublishingItem.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild.Components/ToolSettingsExtensions.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/BuildActionBase.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/CleanBuildAction.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/CopyToArtifactsBuildAction.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/CoverageReportAction.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/DotNetCompileBuildAction.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/DotNetPublishBuildAction.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/DotNetRuntime.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/DotNetTestAction.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/IBuildAction.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/MsBuildCompileBuildAction.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/PackBuildAction.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/PackageLicenseExpressions.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/PushBuildAction.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/RestoreBuildAction.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild/CreativeCoders.NukeBuild.csproj delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild/GitVersionWrapper.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild/IBuildInfo.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild/IVersionInfo.cs delete mode 100644 source/NukeBuild/CreativeCoders.NukeBuild/TargetDefinitionExtensions.cs diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/CreativeCoders.NukeBuild.Components.csproj b/source/NukeBuild/CreativeCoders.NukeBuild.Components/CreativeCoders.NukeBuild.Components.csproj deleted file mode 100644 index ab039504..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/CreativeCoders.NukeBuild.Components.csproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - Library - enable - enable - - - - - - - - - - - - - diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/GitHubActionsExtensions.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/GitHubActionsExtensions.cs deleted file mode 100644 index d8f11a1c..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/GitHubActionsExtensions.cs +++ /dev/null @@ -1,27 +0,0 @@ -using CreativeCoders.Core.SysEnvironment; -using JetBrains.Annotations; -using Nuke.Common.CI.GitHubActions; - -namespace CreativeCoders.NukeBuild.Components; - -[PublicAPI] -public static class GitHubActionsExtensions -{ - public static bool IsRunnerOs(this GitHubActions gitHubActions, string runnerOs) - { - return gitHubActions.GetRunnerOs() - .Equals(runnerOs, StringComparison.OrdinalIgnoreCase); - } - - public static string GetRunnerOs(this GitHubActions gitHubActions) - { - return Env.GetEnvironmentVariable("RUNNER_OS") ?? string.Empty; - } - - public static bool IsLocalBuild(this GitHubActions? gitHubActions) - { - return gitHubActions == null || - Env.GetEnvironmentVariable("GITHUB_ACTIONS")? - .Equals("true", StringComparison.OrdinalIgnoreCase) == false; - } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/GitHubActionsRunnerOs.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/GitHubActionsRunnerOs.cs deleted file mode 100644 index 8ec7bcd3..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/GitHubActionsRunnerOs.cs +++ /dev/null @@ -1,13 +0,0 @@ -using JetBrains.Annotations; - -namespace CreativeCoders.NukeBuild.Components; - -[PublicAPI] -public static class GitHubActionsRunnerOs -{ - public const string Windows = "Windows"; - - public const string Linux = "Linux"; - - public const string MacOs = "macOS"; -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/GithubReleaseTasks.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/GithubReleaseTasks.cs deleted file mode 100644 index 6f7e8149..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/GithubReleaseTasks.cs +++ /dev/null @@ -1,79 +0,0 @@ -using CreativeCoders.Core.IO; -using CreativeCoders.NukeBuild.Components.Targets.Settings; -using Nuke.Common.CI.GitHubActions; -using Octokit; -using Serilog; - -namespace CreativeCoders.NukeBuild.Components; - -public class GithubReleaseTasks(string githubToken) -{ - private readonly GitHubClient _githubClient = - new GitHubClient(new ProductHeaderValue("CreativeCoders.Nuke")) - { - Credentials = new Credentials(githubToken) - }; - - public async Task CreateReleaseAsync(string releaseVersion, string name, string body, bool isPreRelease, - IEnumerable releaseAssets) - { - var release = await CreateReleaseDraftAsync(releaseVersion, name, body, isPreRelease) - .ConfigureAwait(false); - - await UploadReleaseAssets(release, releaseAssets).ConfigureAwait(false); - - await _githubClient.Repository.Release - .Edit(GitHubActions.Instance.RepositoryOwner, GetRepositoryName(), release.Id, - new ReleaseUpdate { Draft = false }).ConfigureAwait(false); - } - - private async Task UploadReleaseAssets(Release release, - IEnumerable githubReleaseAssets) - { - foreach (var releaseAssetUpload in githubReleaseAssets.Select(releaseAsset => new ReleaseAssetUpload - { - ContentType = MimeMapping.MimeUtility.GetMimeMapping(releaseAsset.FileName), - FileName = FileSys.Path.GetFileName(releaseAsset.FileName), - RawData = FileSys.File.OpenRead(releaseAsset.FileName) - })) - { - _ = await _githubClient.Repository.Release.UploadAsset(release, releaseAssetUpload) - .ConfigureAwait(false); - } - } - - private async Task CreateReleaseDraftAsync(string releaseVersion, string name, string body, - bool isPreRelease) - { - var repositoryOwner = GitHubActions.Instance.RepositoryOwner; - var repositoryName = GetRepositoryName(); - - Log.Debug("Create github release"); - Log.Debug("Repo Owner: {RepositoryOwner}", repositoryOwner); - Log.Debug("Repo name: {RepositoryName}", repositoryName); - Log.Debug("Version: {ReleaseVersion}", releaseVersion); - Log.Debug("Name: {Name}", name); - Log.Debug("Body: {Body}", body); - - return await _githubClient.Repository.Release - .Create(repositoryOwner, repositoryName, - new NewRelease(releaseVersion) - { - Name = name, - Body = body, - Draft = true, - Prerelease = isPreRelease - }) - .ConfigureAwait(false); - } - - private static string GetRepositoryName() - { - var index = GitHubActions.Instance.Repository.LastIndexOf('/'); - - return index > -1 - ? GitHubActions.Instance.Repository[(index + 1)..] - : throw new InvalidOperationException( - $"No repository name found in '{GitHubActions.Instance.Repository}'"); - } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Global.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Global.cs deleted file mode 100644 index 87ebd04c..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Global.cs +++ /dev/null @@ -1,3 +0,0 @@ -using System.Diagnostics.CodeAnalysis; - -[assembly: ExcludeFromCodeCoverage] diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/NukeBuildExtensions.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/NukeBuildExtensions.cs deleted file mode 100644 index 67f7c955..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/NukeBuildExtensions.cs +++ /dev/null @@ -1,60 +0,0 @@ -using CreativeCoders.Core; -using CreativeCoders.NukeBuild.Components.Parameters; -using CreativeCoders.NukeBuild.Components.Targets.Settings; -using JetBrains.Annotations; -using Nuke.Common; -using Nuke.Common.Git; -using Nuke.Common.IO; -using Nuke.Common.ProjectModel; -using Nuke.Common.Tools.GitVersion; - -namespace CreativeCoders.NukeBuild.Components; - -[PublicAPI] -public static class NukeBuildExtensions -{ - public static GitVersion? GetGitVersion(this INukeBuild build) - { - return build.As()?.GitVersion; - } - - public static AbsolutePath GetArtifactsDirectory(this INukeBuild build) - { - return build.As()?.ArtifactsDirectory ?? - throw new InvalidOperationException("No artifacts directory specified"); - } - - public static Configuration GetConfiguration(this INukeBuild build) - { - return build.As()?.Configuration ?? - (build.IsLocalBuild ? Configuration.Debug : Configuration.Release); - } - - public static GitRepository GetGitRepository(this INukeBuild build) - { - return build.As()?.GitRepository ?? - throw new InvalidOperationException("No GitRepository present"); - } - - public static Solution GetSolution(this INukeBuild build) - { - return build.As()?.Solution ?? - throw new InvalidOperationException("No Solution present"); - } - - public static void DisableAllTelemetry(this INukeBuild build) - { - build.DisableDotnetTelemetry(); - build.DisableNukeTelemetry(); - } - - public static void DisableDotnetTelemetry(this INukeBuild build) - { - Environment.SetEnvironmentVariable("DOTNET_CLI_TELEMETRY_OPTOUT", "1"); - } - - public static void DisableNukeTelemetry(this INukeBuild build) - { - Environment.SetEnvironmentVariable("NUKE_TELEMETRY_OPTOUT", "1"); - } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Parameters/Configuration.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Parameters/Configuration.cs deleted file mode 100644 index 7147027a..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Parameters/Configuration.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.ComponentModel; -using Nuke.Common.Tooling; - -namespace CreativeCoders.NukeBuild.Components.Parameters; - -[TypeConverter(typeof(TypeConverter))] -public class Configuration : Enumeration -{ - public static readonly Configuration Debug = new Configuration { Value = nameof(Debug) }; - - public static readonly Configuration Release = new Configuration { Value = nameof(Release) }; - - public static implicit operator string(Configuration configuration) - { - return configuration.Value; - } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Parameters/IConfigurationParameter.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Parameters/IConfigurationParameter.cs deleted file mode 100644 index 24be7ca9..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Parameters/IConfigurationParameter.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Nuke.Common; - -namespace CreativeCoders.NukeBuild.Components.Parameters; - -public interface IConfigurationParameter : INukeBuild -{ - [Parameter("Configuration to build - Default is 'Debug' (local) or 'Release' (server)")] - Configuration Configuration => TryGetValue(() => Configuration) ?? - (IsLocalBuild ? Configuration.Debug : Configuration.Release); -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Parameters/IGitRepositoryParameter.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Parameters/IGitRepositoryParameter.cs deleted file mode 100644 index 8f2e2549..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Parameters/IGitRepositoryParameter.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Nuke.Common; -using Nuke.Common.Git; - -namespace CreativeCoders.NukeBuild.Components.Parameters; - -public interface IGitRepositoryParameter : INukeBuild -{ - [GitRepository] - GitRepository GitRepository => TryGetValue(() => GitRepository) ?? - throw new MissingMemberException( - nameof(IGitRepositoryParameter), - nameof(GitRepository)); -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Parameters/IGitVersionParameter.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Parameters/IGitVersionParameter.cs deleted file mode 100644 index 2f7f1272..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Parameters/IGitVersionParameter.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Nuke.Common; -using Nuke.Common.Tools.GitVersion; - -namespace CreativeCoders.NukeBuild.Components.Parameters; - -public interface IGitVersionParameter : INukeBuild -{ - [GitVersion] - GitVersion? GitVersion => TryGetValue(() => GitVersion); -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Parameters/ISolutionParameter.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Parameters/ISolutionParameter.cs deleted file mode 100644 index b2dd6e5d..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Parameters/ISolutionParameter.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Nuke.Common; -using Nuke.Common.ProjectModel; - -namespace CreativeCoders.NukeBuild.Components.Parameters; - -public interface ISolutionParameter : INukeBuild -{ - [Solution] - [Required] - Solution Solution => TryGetValue(() => Solution) ?? throw new ArgumentNullException(nameof(Solution)); -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Parameters/ISourceDirectoryParameter.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Parameters/ISourceDirectoryParameter.cs deleted file mode 100644 index fff663e0..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Parameters/ISourceDirectoryParameter.cs +++ /dev/null @@ -1,13 +0,0 @@ -using JetBrains.Annotations; -using Nuke.Common; -using Nuke.Common.IO; - -namespace CreativeCoders.NukeBuild.Components.Parameters; - -[PublicAPI] -public interface ISourceDirectoryParameter : INukeBuild -{ - string SourceDirectoryRelativePath => "source"; - - AbsolutePath SourceDirectory => RootDirectory / SourceDirectoryRelativePath; -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/CommonTargetTasks.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/CommonTargetTasks.cs deleted file mode 100644 index c7b329ef..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/CommonTargetTasks.cs +++ /dev/null @@ -1,25 +0,0 @@ -using CreativeCoders.Core.Collections; -using CreativeCoders.Core.IO; -using JetBrains.Annotations; -using Nuke.Common.IO; - -namespace CreativeCoders.NukeBuild.Components.Targets; - -[PublicAPI] -public static class CommonTargetTasks -{ - public static void SafeDeleteDirectory(AbsolutePath directory) - { - if (!FileSys.Directory.Exists(directory)) - { - return; - } - - directory.DeleteDirectory(); - } - - public static void SafeDeleteDirectories(this IEnumerable directories) - { - directories.ForEach(SafeDeleteDirectory); - } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IBuildTarget.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IBuildTarget.cs deleted file mode 100644 index ef3a7b89..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IBuildTarget.cs +++ /dev/null @@ -1,39 +0,0 @@ -using CreativeCoders.Core; -using CreativeCoders.NukeBuild.Components.Parameters; -using JetBrains.Annotations; -using Nuke.Common; -using Nuke.Common.Tooling; -using Nuke.Common.Tools.DotNet; - -namespace CreativeCoders.NukeBuild.Components.Targets; - -[PublicAPI] -public interface IBuildTarget : ISolutionParameter -{ - Target Build => d => d - .TryBefore() - .TryDependsOn() - .Executes(() => DotNetTasks.DotNetBuild(x => x - .Apply(ConfigureCompileSettings) - )); - - DotNetBuildSettings ConfigureCompileSettings(DotNetBuildSettings buildSettings) - => ConfigureDefaultCompileSettings(buildSettings); - - sealed DotNetBuildSettings ConfigureDefaultCompileSettings(DotNetBuildSettings buildSettings) - { - var solutionParameter = this.As(); - - return buildSettings - .When(_ => solutionParameter != null, x => x - // ReSharper disable once NullableWarningSuppressionIsUsed - .SetProjectFile(solutionParameter!.Solution)) - .WhenNotNull(this as IConfigurationParameter, (x, configuration) => x - .SetConfiguration(configuration.Configuration)) - .WhenNotNull((this as IGitVersionParameter)?.GitVersion, (x, gitVersion) => x - .SetAssemblyVersion(gitVersion.AssemblySemVer) - .SetFileVersion(gitVersion.AssemblySemFileVer) - .SetInformationalVersion(gitVersion.InformationalVersion)) - .SetNoRestore(SucceededTargets.Contains(this.As()?.Restore)); - } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/ICleanTarget.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/ICleanTarget.cs deleted file mode 100644 index 82fb183c..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/ICleanTarget.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using CreativeCoders.Core; -using CreativeCoders.NukeBuild.Components.Parameters; -using CreativeCoders.NukeBuild.Components.Targets.Settings; -using JetBrains.Annotations; -using Nuke.Common; -using Nuke.Common.Tooling; -using Nuke.Common.Tools.DotNet; - -namespace CreativeCoders.NukeBuild.Components.Targets; - -[PublicAPI] -public interface ICleanTarget : INukeBuild, ICleanSettings -{ - Target Clean => d => d - .TryBefore() - .Executes(() => - { - DotNetTasks.DotNetClean(x => x - .Apply(ConfigureCleanSettings)); - - DirectoriesToClean.SafeDeleteDirectories(); - }); - - DotNetCleanSettings ConfigureCleanSettings(DotNetCleanSettings cleanSettings) - => ConfigureDefaultCleanSettings(cleanSettings); - - [SuppressMessage("ReSharper", "NullableWarningSuppressionIsUsed")] - sealed DotNetCleanSettings ConfigureDefaultCleanSettings(DotNetCleanSettings cleanSettings) - { - var solutionParameter = this.As(); - - return cleanSettings - .When(_ => solutionParameter != null, - x => x.SetProject(solutionParameter!.Solution)); - } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/ICodeCoverageTarget.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/ICodeCoverageTarget.cs deleted file mode 100644 index a635ffca..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/ICodeCoverageTarget.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.IO.Compression; -using CreativeCoders.NukeBuild.Components.Targets.Settings; -using JetBrains.Annotations; -using Nuke.Common; -using Nuke.Common.Tooling; -using Nuke.Common.Tools.ReportGenerator; - -namespace CreativeCoders.NukeBuild.Components.Targets; - -[PublicAPI] -public interface ICodeCoverageTarget : ITestTarget, ICodeCoverageSettings -{ - Target CodeCoverage => d => d - .TryBefore() - .DependsOn() - .Produces(TargetDirectory / "*.*") - .Executes(() => - { - ReportGeneratorTasks.ReportGenerator(x => x - .SetFramework(Framework) - .SetReports(Reports) - .SetTargetDirectory(TargetDirectory)); - - ZipFile.CreateFromDirectory(TargetDirectory, CoverageReportArchive); - }); -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/ICreateDistPackagesTarget.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/ICreateDistPackagesTarget.cs deleted file mode 100644 index e9a78293..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/ICreateDistPackagesTarget.cs +++ /dev/null @@ -1,38 +0,0 @@ -using CreativeCoders.Core.Collections; -using CreativeCoders.IO.Archives; -using CreativeCoders.NukeBuild.Components.Targets.Settings; -using JetBrains.Annotations; -using Nuke.Common; - -namespace CreativeCoders.NukeBuild.Components.Targets; - -[PublicAPI] -public interface ICreateDistPackagesTarget : INukeBuild, ICreateDistPackagesSettings -{ - Target CreateDistPackages => d => d - .TryAfter() - .Executes(() => - { - DistPackages.ForEach(distPackage => - { - switch (distPackage.Format) - { - case DistPackageFormat.TarGz: - new TarArchiveCreator() - .SetArchiveFileName(DistOutputPath / $"{distPackage.Name}.tar.gz") - .AddFromDirectory(distPackage.DistFolder, "*.*", true) - .Create(true); - break; - case DistPackageFormat.Zip: - new ZipArchiveCreator() - .SetArchiveFileName(DistOutputPath / $"{distPackage.Name}.zip") - .AddFromDirectory(distPackage.DistFolder, "*.*", true) - .Create(); - break; - default: - throw new ArgumentOutOfRangeException(nameof(distPackage), - "Package format not supported"); - } - }); - }); -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/ICreateGithubReleaseTarget.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/ICreateGithubReleaseTarget.cs deleted file mode 100644 index 389fac94..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/ICreateGithubReleaseTarget.cs +++ /dev/null @@ -1,25 +0,0 @@ -using CreativeCoders.NukeBuild.Components.Targets.Settings; -using JetBrains.Annotations; -using Nuke.Common; - -namespace CreativeCoders.NukeBuild.Components.Targets; - -[PublicAPI] -public interface ICreateGithubReleaseTarget : ICreateGithubReleaseSettings -{ - Target CreateGithubRelease => d => d - .TryAfter() - .TryAfter() - .TryAfter() - .Executes(async () => - { - await new GithubReleaseTasks(GithubToken) - .CreateReleaseAsync( - ReleaseVersion, - ReleaseName, - ReleaseBody, - IsPreRelease, - ReleaseAssets) - .ConfigureAwait(false); - }); -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IDeployNuGetTarget.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IDeployNuGetTarget.cs deleted file mode 100644 index fd2f40f8..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IDeployNuGetTarget.cs +++ /dev/null @@ -1,13 +0,0 @@ -using JetBrains.Annotations; -using Nuke.Common; - -namespace CreativeCoders.NukeBuild.Components.Targets; - -[PublicAPI] -public interface IDeployNuGetTarget -{ - Target DeployNuGet => d => d - .DependsOn() - .DependsOn() - .DependsOn(); -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IPackTarget.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IPackTarget.cs deleted file mode 100644 index db855967..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IPackTarget.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using CreativeCoders.Core; -using CreativeCoders.NukeBuild.Components.Parameters; -using CreativeCoders.NukeBuild.Components.Targets.Settings; -using JetBrains.Annotations; -using Nuke.Common; -using Nuke.Common.Tooling; -using Nuke.Common.Tools.DotNet; - -namespace CreativeCoders.NukeBuild.Components.Targets; - -[PublicAPI] -public interface IPackTarget : IPackSettings, ISolutionParameter -{ - Target Pack => d => d - .TryDependsOn() - .Executes(() => - { - DotNetTasks.DotNetPack(s => s - .Apply(ConfigurePackSettings) - ); - }); - - DotNetPackSettings ConfigurePackSettings(DotNetPackSettings packSettings) - => ConfigureDefaultPackSettings(packSettings); - - [SuppressMessage("ReSharper", "SuspiciousTypeConversion.Global")] - DotNetPackSettings ConfigureDefaultPackSettings(DotNetPackSettings packSettings) - { - return packSettings - .SetSymbolPackageFormat(DotNetSymbolPackageFormat.snupkg) - .SetProject(Solution) - .WhenNotNull(this as IConfigurationParameter, (x, configurationParameter) => x - .SetConfiguration(configurationParameter.Configuration)) - .EnableIncludeSymbols() - .When(_ => !string.IsNullOrWhiteSpace(OutputDirectory), x => x - .SetOutputDirectory(OutputDirectory)) - .WhenNotNull(this as IGitVersionParameter, (x, gitVersionParameter) => x - .SetVersion(gitVersionParameter.GitVersion?.NuGetVersionV2)) - .SetNoBuild(SucceededTargets.Contains(this.As()?.Build)) - .When(_ => !string.IsNullOrWhiteSpace(Copyright), x => x - .SetCopyright(Copyright)) - .When(_ => !string.IsNullOrWhiteSpace(PackageProjectUrl), x => x - .SetPackageProjectUrl(PackageProjectUrl)) - .When(_ => !string.IsNullOrWhiteSpace(PackageLicenseUrl), x => x - .SetPackageLicenseUrl(PackageLicenseUrl)) - .When(_ => !string.IsNullOrWhiteSpace(PackageLicenseExpression), x => x - .SetProperty("PackageLicenseExpression", PackageLicenseExpression)); - } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IPublishTarget.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IPublishTarget.cs deleted file mode 100644 index 86b8b529..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IPublishTarget.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using CreativeCoders.Core; -using CreativeCoders.NukeBuild.Components.Parameters; -using CreativeCoders.NukeBuild.Components.Targets.Settings; -using JetBrains.Annotations; -using Nuke.Common; -using Nuke.Common.Tooling; -using Nuke.Common.Tools.DotNet; - -namespace CreativeCoders.NukeBuild.Components.Targets; - -[PublicAPI] -public interface IPublishTarget : IPublishSettings -{ - Target Publish => d => d - .TryAfter() - .TryAfter() - .DependsOn() - .Produces(PublishingItems.Any() - ? PublishingItems - .Where(x => x.ProduceArtifact) - .Select(x => x.OutputPath.ToString()) - .ToArray() - : [PublishOutputPath]) - .Executes(() => - { - if (PublishingItems.Any()) - { - DotNetTasks.DotNetPublish(x => x - .Apply(ConfigurePublishSettings) - .CombineWith(PublishingItems, ConfigurePublishItemSettings)); - } - else - { - DotNetTasks.DotNetPublish(x => x - .Apply(ConfigurePublishSettings)); - } - }); - - DotNetPublishSettings ConfigurePublishSettings(DotNetPublishSettings publishSettings) - => ConfigureDefaultPublishSettings(publishSettings); - - [SuppressMessage("ReSharper", "SuspiciousTypeConversion.Global")] - sealed DotNetPublishSettings ConfigureDefaultPublishSettings(DotNetPublishSettings publishSettings) - { - return publishSettings - .SetNoBuild(SucceededTargets.Contains(this.As()?.Build)) - .WhenNotNull(this as ISolutionParameter, (x, solutionParameter) => x - .SetProject(solutionParameter.Solution)) - .SetOutput(PublishOutputPath) - .WhenNotNull(this as IConfigurationParameter, (x, configuration) => x - .SetConfiguration(configuration.Configuration)) - .WhenNotNull((this as IGitVersionParameter)?.GitVersion, (x, gitVersion) => x - .SetAssemblyVersion(gitVersion.AssemblySemVer) - .SetFileVersion(gitVersion.AssemblySemFileVer) - .SetInformationalVersion(gitVersion.InformationalVersion) - .SetVersion(gitVersion.FullSemVer)); - } - - DotNetPublishSettings ConfigurePublishItemSettings(DotNetPublishSettings publishSettings, - PublishingItem publishingItem) - => ConfigureDefaultPublishItemSettings(publishSettings, publishingItem); - - static DotNetPublishSettings ConfigureDefaultPublishItemSettings(DotNetPublishSettings publishSettings, - PublishingItem publishingItem) - { - return publishSettings - .SetProject(publishingItem.ProjectPath) - .SetOutput(publishingItem.OutputPath) - .SetSelfContained(publishingItem.SelfContained) - .When(_ => !string.IsNullOrWhiteSpace(publishingItem.Runtime), x => x - .SetRuntime(publishingItem.Runtime)); - } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IPushNuGetTarget.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IPushNuGetTarget.cs deleted file mode 100644 index 62d7bc78..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IPushNuGetTarget.cs +++ /dev/null @@ -1,42 +0,0 @@ -using CreativeCoders.Core.Collections; -using CreativeCoders.NukeBuild.Components.Targets.Settings; -using JetBrains.Annotations; -using Nuke.Common; -using Nuke.Common.IO; -using Nuke.Common.Tooling; -using Nuke.Common.Tools.DotNet; - -namespace CreativeCoders.NukeBuild.Components.Targets; - -[PublicAPI] -public interface IPushNuGetTarget : IPackTarget, IPushNuGetSettings -{ - Target PushNuGet => d => d - .OnlyWhenDynamic(() => !SkipPush) - .DependsOn() - .Executes(() => - { - OutputDirectory - .GlobFiles("*.nupkg") - .ForEach(packagePath => - { - DotNetTasks.DotNetNuGetPush(x => x - .Apply(ConfigureNuGetPushSettings, packagePath)); - }); - }); - - DotNetNuGetPushSettings ConfigureNuGetPushSettings(DotNetNuGetPushSettings nuGetPushSettings, - AbsolutePath packagePath) - => ConfigureDefaultNuGetPushSettings(nuGetPushSettings, packagePath); - - sealed DotNetNuGetPushSettings ConfigureDefaultNuGetPushSettings( - DotNetNuGetPushSettings nuGetPushSettings, AbsolutePath packagePath) - { - return nuGetPushSettings - .SetTargetPath(packagePath) - .When(_ => !string.IsNullOrWhiteSpace(NuGetFeedUrl), x => x - .SetSource(NuGetFeedUrl)) - .When(_ => !string.IsNullOrWhiteSpace(NuGetApiKey), x => x - .SetApiKey(NuGetApiKey)); - } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IRebuildTarget.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IRebuildTarget.cs deleted file mode 100644 index ee729cf4..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IRebuildTarget.cs +++ /dev/null @@ -1,13 +0,0 @@ -using JetBrains.Annotations; -using Nuke.Common; - -namespace CreativeCoders.NukeBuild.Components.Targets; - -[PublicAPI] -public interface IRebuildTarget -{ - Target Rebuild => d => d - .DependsOn() - .DependsOn() - .DependsOn(); -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IRestoreTarget.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IRestoreTarget.cs deleted file mode 100644 index 2af438df..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/IRestoreTarget.cs +++ /dev/null @@ -1,33 +0,0 @@ -using CreativeCoders.Core; -using CreativeCoders.NukeBuild.Components.Parameters; -using JetBrains.Annotations; -using Nuke.Common; -using Nuke.Common.Tooling; -using Nuke.Common.Tools.DotNet; - -namespace CreativeCoders.NukeBuild.Components.Targets; - -[PublicAPI] -public interface IRestoreTarget : INukeBuild -{ - Target Restore => d => d - .TryBefore() - .Executes(() => - { - DotNetTasks.DotNetRestore(x => x - .Apply(ConfigureRestoreSettings)); - }); - - DotNetRestoreSettings ConfigureRestoreSettings(DotNetRestoreSettings buildSettings) - => ConfigureDefaultRestoreSettings(buildSettings); - - sealed DotNetRestoreSettings ConfigureDefaultRestoreSettings(DotNetRestoreSettings buildSettings) - { - var solutionParameter = this.As(); - - return buildSettings - .When(_ => solutionParameter != null, x => x - // ReSharper disable once NullableWarningSuppressionIsUsed - .SetProjectFile(solutionParameter!.Solution)); - } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/ITestTarget.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/ITestTarget.cs deleted file mode 100644 index 6dfb6858..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/ITestTarget.cs +++ /dev/null @@ -1,49 +0,0 @@ -using CreativeCoders.Core; -using CreativeCoders.NukeBuild.Components.Parameters; -using CreativeCoders.NukeBuild.Components.Targets.Settings; -using JetBrains.Annotations; -using Nuke.Common; -using Nuke.Common.ProjectModel; -using Nuke.Common.Tooling; -using Nuke.Common.Tools.DotNet; - -namespace CreativeCoders.NukeBuild.Components.Targets; - -[PublicAPI] -public interface ITestTarget : ITestSettings -{ - Target Test => d => d - .TryBefore() - .Executes(() => - { - DotNetTasks.DotNetTest(x => x - .Apply(ConfigureTestSettings) - .CombineWith(TestProjects, ConfigureTestProjectSettings)); - }); - - DotNetTestSettings ConfigureTestProjectSettings(DotNetTestSettings settings, Project project) - => ConfigureDefaultTestProjectSettings(settings, project); - - sealed DotNetTestSettings ConfigureDefaultTestProjectSettings(DotNetTestSettings settings, - Project project) - { - var testResultFile = Path.Combine(TestResultsDirectory, $"{project.Name}.trx"); - return settings - .SetProjectFile(project) - .SetLoggers($"trx;LogFileName={testResultFile}"); - } - - DotNetTestSettings ConfigureTestSettings(DotNetTestSettings testSettings) - => ConfigureDefaultTestSettings(testSettings); - - sealed DotNetTestSettings ConfigureDefaultTestSettings(DotNetTestSettings testSettings) - { - return testSettings - .SetNoBuild(SucceededTargets.Contains(this.As()?.Build)) - .WhenNotNull(this as IConfigurationParameter, (x, configurationParameter) => x - .SetConfiguration(configurationParameter.Configuration)) - .When(_ => GenerateCodeCoverage, x => x - .SetDataCollector("XPlat Code Coverage") - .SetResultsDirectory(CoverageDirectory)); - } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/NukeTargets.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/NukeTargets.cs deleted file mode 100644 index 5f525657..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/NukeTargets.cs +++ /dev/null @@ -1,31 +0,0 @@ -using JetBrains.Annotations; - -namespace CreativeCoders.NukeBuild.Components.Targets; - -[PublicAPI] -public static class NukeTargets -{ - public const string Restore = nameof(IRestoreTarget.Restore); - - public const string Clean = nameof(ICleanTarget.Clean); - - public const string Build = nameof(IBuildTarget.Build); - - public const string Rebuild = nameof(IRebuildTarget.Rebuild); - - public const string Test = nameof(ITestTarget.Test); - - public const string CodeCoverage = nameof(ICodeCoverageTarget.CodeCoverage); - - public const string Pack = nameof(IPackTarget.Pack); - - public const string PushNuGet = nameof(IPushNuGetTarget.PushNuGet); - - public const string DeployNuGet = nameof(IDeployNuGetTarget.DeployNuGet); - - public const string Publish = nameof(IPublishTarget.Publish); - - public const string CreateDistPackages = nameof(ICreateDistPackagesTarget.CreateDistPackages); - - public const string CreateGitHubRelease = nameof(ICreateGithubReleaseTarget.CreateGithubRelease); -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/DistPackage.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/DistPackage.cs deleted file mode 100644 index 09857ee7..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/DistPackage.cs +++ /dev/null @@ -1,14 +0,0 @@ -using JetBrains.Annotations; -using Nuke.Common.IO; - -namespace CreativeCoders.NukeBuild.Components.Targets.Settings; - -[PublicAPI] -public class DistPackage(string name, AbsolutePath distFolder) -{ - public DistPackageFormat Format { get; set; } - - public string Name { get; } = name; - - public AbsolutePath DistFolder { get; } = distFolder; -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/DistPackageFormat.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/DistPackageFormat.cs deleted file mode 100644 index 8698dfb1..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/DistPackageFormat.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace CreativeCoders.NukeBuild.Components.Targets.Settings; - -public enum DistPackageFormat -{ - TarGz, - Zip -} \ No newline at end of file diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/GithubReleaseAsset.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/GithubReleaseAsset.cs deleted file mode 100644 index 01c8f803..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/GithubReleaseAsset.cs +++ /dev/null @@ -1,9 +0,0 @@ -using JetBrains.Annotations; - -namespace CreativeCoders.NukeBuild.Components.Targets.Settings; - -[PublicAPI] -public class GithubReleaseAsset(string fileName) -{ - public string FileName { get; } = fileName; -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/IArtifactsSettings.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/IArtifactsSettings.cs deleted file mode 100644 index 31a118ab..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/IArtifactsSettings.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Nuke.Common; -using Nuke.Common.IO; - -namespace CreativeCoders.NukeBuild.Components.Targets.Settings; - -public interface IArtifactsSettings : INukeBuild -{ - AbsolutePath ArtifactsDirectory => RootDirectory / ".artifacts"; -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/ICleanSettings.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/ICleanSettings.cs deleted file mode 100644 index 66bb075e..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/ICleanSettings.cs +++ /dev/null @@ -1,28 +0,0 @@ -using CreativeCoders.Core; -using CreativeCoders.Core.Collections; -using CreativeCoders.NukeBuild.Components.Parameters; -using Nuke.Common.IO; - -namespace CreativeCoders.NukeBuild.Components.Targets.Settings; - -public interface ICleanSettings -{ - IList DirectoriesToClean => DefaultDirectoriesToClean; - - IList DefaultDirectoriesToClean - { - get - { - IList dirs = new List(); - - if (this.TryAs(out var sourceDirectoryParameter)) - { - dirs.AddRange(sourceDirectoryParameter - .SourceDirectory - .GlobDirectories("**/bin", "**/obj")); - } - - return dirs; - } - } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/ICodeCoverageSettings.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/ICodeCoverageSettings.cs deleted file mode 100644 index 78009fbe..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/ICodeCoverageSettings.cs +++ /dev/null @@ -1,20 +0,0 @@ -using CreativeCoders.Core; -using CreativeCoders.Core.IO; -using CreativeCoders.Core.SysEnvironment; -using Nuke.Common.IO; - -namespace CreativeCoders.NukeBuild.Components.Targets.Settings; - -public interface ICodeCoverageSettings : ITestSettings -{ - AbsolutePath TargetDirectory => this.TryAs(out var testSettings) - ? testSettings.TestBaseDirectory / "coverage_report" - : TemporaryDirectory / "coverage_report"; - - AbsolutePath CoverageReportArchive => - TargetDirectory.Parent / FileSys.Path.ChangeExtension(TargetDirectory.Name, "zip"); - - string Framework => $"net{Env.Version.Major}.0"; - - IEnumerable Reports => [TestBaseDirectory / "coverage" / "**" / "*.xml"]; -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/ICreateDistPackagesSettings.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/ICreateDistPackagesSettings.cs deleted file mode 100644 index 16fc7084..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/ICreateDistPackagesSettings.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Nuke.Common.IO; - -namespace CreativeCoders.NukeBuild.Components.Targets.Settings; - -public interface ICreateDistPackagesSettings -{ - IEnumerable DistPackages { get; } - - AbsolutePath DistOutputPath { get; } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/ICreateGithubReleaseSettings.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/ICreateGithubReleaseSettings.cs deleted file mode 100644 index 99896a6a..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/ICreateGithubReleaseSettings.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Nuke.Common; - -namespace CreativeCoders.NukeBuild.Components.Targets.Settings; - -public interface ICreateGithubReleaseSettings : INukeBuild -{ - [Parameter(Name = "GITHUB_TOKEN")] - string GithubToken => TryGetValue(() => GithubToken) ?? string.Empty; - - string ReleaseName { get; } - - string ReleaseBody { get; } - - bool IsPreRelease => false; - - string ReleaseVersion { get; } - - IEnumerable ReleaseAssets { get; } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/IPackSettings.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/IPackSettings.cs deleted file mode 100644 index 861e4e94..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/IPackSettings.cs +++ /dev/null @@ -1,20 +0,0 @@ -using CreativeCoders.Core; -using Nuke.Common; -using Nuke.Common.IO; - -namespace CreativeCoders.NukeBuild.Components.Targets.Settings; - -public interface IPackSettings : INukeBuild -{ - AbsolutePath OutputDirectory => this.TryAs(out var artifactsSettings) - ? artifactsSettings.ArtifactsDirectory / "nuget" - : TemporaryDirectory / "nuget"; - - string Copyright => string.Empty; - - string PackageProjectUrl => string.Empty; - - string PackageLicenseUrl => string.Empty; - - string PackageLicenseExpression => string.Empty; -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/IPublishSettings.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/IPublishSettings.cs deleted file mode 100644 index 7172495b..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/IPublishSettings.cs +++ /dev/null @@ -1,14 +0,0 @@ -using CreativeCoders.Core; -using Nuke.Common; -using Nuke.Common.IO; - -namespace CreativeCoders.NukeBuild.Components.Targets.Settings; - -public interface IPublishSettings : INukeBuild -{ - AbsolutePath PublishOutputPath => this.TryAs(out var artifactsSettings) - ? artifactsSettings.ArtifactsDirectory / "dist" - : TemporaryDirectory / "dist"; - - IEnumerable PublishingItems => []; -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/IPushNuGetSettings.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/IPushNuGetSettings.cs deleted file mode 100644 index 8de525d8..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/IPushNuGetSettings.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Nuke.Common; - -namespace CreativeCoders.NukeBuild.Components.Targets.Settings; - -public interface IPushNuGetSettings : INukeBuild -{ - [Parameter(Name = "NuGetFeedUrl")] - string NuGetFeedUrl => TryGetValue(() => NuGetFeedUrl) ?? string.Empty; - - [Parameter(Name = "NuGetApiKey")] - string NuGetApiKey => TryGetValue(() => NuGetApiKey) ?? string.Empty; - - bool SkipPush => false; -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/ITestSettings.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/ITestSettings.cs deleted file mode 100644 index ba319013..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/ITestSettings.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Nuke.Common; -using Nuke.Common.IO; -using Nuke.Common.ProjectModel; - -namespace CreativeCoders.NukeBuild.Components.Targets.Settings; - -public interface ITestSettings : INukeBuild -{ - IEnumerable TestProjects { get; } - - AbsolutePath TestBaseDirectory => RootDirectory / ".tests"; - - AbsolutePath TestResultsDirectory => TestBaseDirectory / "results"; - - bool GenerateCodeCoverage => true; - - AbsolutePath CoverageDirectory => TestBaseDirectory / "coverage"; -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/PublishingItem.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/PublishingItem.cs deleted file mode 100644 index 3704cd7b..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/Targets/Settings/PublishingItem.cs +++ /dev/null @@ -1,18 +0,0 @@ -using JetBrains.Annotations; -using Nuke.Common.IO; - -namespace CreativeCoders.NukeBuild.Components.Targets.Settings; - -[PublicAPI] -public class PublishingItem(AbsolutePath projectPath, AbsolutePath outputPath) -{ - public AbsolutePath ProjectPath { get; } = projectPath; - - public AbsolutePath OutputPath { get; } = outputPath; - - public string? Runtime { get; set; } - - public bool SelfContained { get; set; } - - public bool ProduceArtifact { get; set; } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild.Components/ToolSettingsExtensions.cs b/source/NukeBuild/CreativeCoders.NukeBuild.Components/ToolSettingsExtensions.cs deleted file mode 100644 index 83a27bcb..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild.Components/ToolSettingsExtensions.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace CreativeCoders.NukeBuild.Components; - -public static class ToolSettingsExtensions -{ - public static T WhenNotNull(this T settings, TObject? instance, Func configure) - where TObject : class - { - return instance != null - ? configure(settings, instance) - : settings; - } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/BuildActionBase.cs b/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/BuildActionBase.cs deleted file mode 100644 index d8346c4f..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/BuildActionBase.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Diagnostics.CodeAnalysis; -using Nuke.Common; - -namespace CreativeCoders.NukeBuild.BuildActions; - -[ExcludeFromCodeCoverage] -public abstract class BuildActionBase : IBuildAction - where TBuildAction : BuildActionBase, new() -{ - public ITargetDefinition Setup(ITargetDefinition targetDefinition) - { - return Setup(targetDefinition, null); - } - - public ITargetDefinition Setup(ITargetDefinition targetDefinition, Action configureAction) - { - targetDefinition.Executes(() => ExecuteAction(configureAction)); - - return targetDefinition; - } - - private void ExecuteAction(Action configureAction) - { - configureAction((TBuildAction) this); - - OnExecute(); - } - - public void SetBuildInfo(IBuildInfo buildInfo) - { - BuildInfo = buildInfo; - } - - protected abstract void OnExecute(); - - protected IBuildInfo BuildInfo { get; private set; } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/CleanBuildAction.cs b/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/CleanBuildAction.cs deleted file mode 100644 index 24cabd35..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/CleanBuildAction.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using JetBrains.Annotations; -using Nuke.Common.IO; -using Nuke.Common.Utilities.Collections; - -namespace CreativeCoders.NukeBuild.BuildActions; - -[ExcludeFromCodeCoverage] -[PublicAPI] -public class CleanBuildAction : BuildActionBase -{ - private readonly List _cleanDirectories = []; - - protected override void OnExecute() - { - BuildInfo.SourceDirectory.GlobDirectories("**/bin", "**/obj").ForEach(SafeDeleteDirectory); - - _cleanDirectories.ForEach(SafeDeleteDirectory); - } - - private static void SafeDeleteDirectory(AbsolutePath directory) - { - directory.CreateOrCleanDirectory(); - directory.DeleteDirectory(); - } - - public CleanBuildAction AddDirectoryForClean(AbsolutePath directory) - { - _cleanDirectories.Add(directory); - - return this; - } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/CopyToArtifactsBuildAction.cs b/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/CopyToArtifactsBuildAction.cs deleted file mode 100644 index 22bc8ea7..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/CopyToArtifactsBuildAction.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Diagnostics.CodeAnalysis; -using System.IO; -using JetBrains.Annotations; -using Nuke.Common.IO; -using Nuke.Common.Utilities.Collections; - -namespace CreativeCoders.NukeBuild.BuildActions; - -[ExcludeFromCodeCoverage] -[PublicAPI] -public class CopyToArtifactsBuildAction : BuildActionBase -{ - private string _fileMask; - - protected override void OnExecute() - { - if (string.IsNullOrEmpty(_fileMask)) - { - throw new ArgumentException("file mask must not be null or empty"); - } - - BuildInfo.SourceDirectory.GlobFiles(_fileMask).ForEach(CopyFileToArtifacts); - } - - private void CopyFileToArtifacts(AbsolutePath fullFileName) - { - var fileName = Path.GetFileName(fullFileName); - - if (string.IsNullOrEmpty(fileName)) - { - return; - } - - var targetFile = Path.Combine(BuildInfo.ArtifactsDirectory, fileName); - fullFileName.Copy(targetFile, ExistsPolicy.FileOverwrite); - } - - public void SetFileMask(string fileMask) - { - _fileMask = fileMask; - } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/CoverageReportAction.cs b/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/CoverageReportAction.cs deleted file mode 100644 index 3eba2518..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/CoverageReportAction.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using CreativeCoders.Core.SysEnvironment; -using JetBrains.Annotations; -using Nuke.Common.Tooling; -using Nuke.Common.Tools.ReportGenerator; - -namespace CreativeCoders.NukeBuild.BuildActions; - -[ExcludeFromCodeCoverage] -[PublicAPI] -public class CoverageReportAction : BuildActionBase -{ - private string _framework = $"net{Env.Version.Major}.0"; - - private string[] _reports; - - private string _targetDirectory; - - protected override void OnExecute() - { - ReportGeneratorTasks.ReportGenerator(x => x - .SetFramework(_framework) - .SetReports(_reports) - .SetTargetDirectory(_targetDirectory)); - } - - public CoverageReportAction SetFramework(string framework) - { - _framework = framework; - - return this; - } - - public CoverageReportAction SetReports(params string[] reports) - { - _reports = reports; - - return this; - } - - public CoverageReportAction SetTargetDirectory(string targetDirectory) - { - _targetDirectory = targetDirectory; - - return this; - } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/DotNetCompileBuildAction.cs b/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/DotNetCompileBuildAction.cs deleted file mode 100644 index 5eb7e15f..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/DotNetCompileBuildAction.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using JetBrains.Annotations; -using Nuke.Common.Tools.DotNet; - -namespace CreativeCoders.NukeBuild.BuildActions; - -[ExcludeFromCodeCoverage] -[PublicAPI] -public class DotNetCompileBuildAction : BuildActionBase -{ - protected override void OnExecute() - { - DotNetTasks.DotNetBuild(s => s - .SetProjectFile(BuildInfo.Solution) - .SetConfiguration(BuildInfo.Configuration) - .SetAssemblyVersion(BuildInfo.VersionInfo.GetAssemblySemVer()) - .SetFileVersion(BuildInfo.VersionInfo.GetAssemblySemFileVer()) - .SetInformationalVersion(BuildInfo.VersionInfo.InformationalVersion) - .EnableNoRestore()); - } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/DotNetPublishBuildAction.cs b/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/DotNetPublishBuildAction.cs deleted file mode 100644 index 9abd2900..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/DotNetPublishBuildAction.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using JetBrains.Annotations; -using Nuke.Common.Tools.DotNet; - -namespace CreativeCoders.NukeBuild.BuildActions; - -[ExcludeFromCodeCoverage] -[PublicAPI] -public class DotNetPublishBuildAction : BuildActionBase -{ - private string _projectFile; - - private string _output; - - private string _runtime; - - private bool _selfContained; - - protected override void OnExecute() - { - DotNetTasks.DotNetPublish(x => - { - var settings = x - .SetProject(_projectFile) - .SetConfiguration(BuildInfo.Configuration) - .SetOutput(_output) - .SetVersion(BuildInfo.VersionInfo.NuGetVersionV2) - .SetSelfContained(_selfContained); - - if (!string.IsNullOrWhiteSpace(_runtime)) - { - settings = settings.SetRuntime(_runtime); - } - - return settings; - }); - } - - public DotNetPublishBuildAction SetProject(string projectFile) - { - _projectFile = projectFile; - - return this; - } - - public DotNetPublishBuildAction SetOutput(string output) - { - _output = output; - - return this; - } - - public DotNetPublishBuildAction SetRuntime(string runtime) - { - _runtime = runtime; - - return this; - } - - public DotNetPublishBuildAction SetSelfContained(bool selfContained) - { - _selfContained = selfContained; - - return this; - } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/DotNetRuntime.cs b/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/DotNetRuntime.cs deleted file mode 100644 index 7c4dad22..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/DotNetRuntime.cs +++ /dev/null @@ -1,25 +0,0 @@ -using JetBrains.Annotations; - -namespace CreativeCoders.NukeBuild.BuildActions; - -[PublicAPI] -public static class DotNetRuntime -{ - public const string WinX64 = "win-x64"; - - public const string WinX86 = "win-x86"; - - public const string WinArm64 = "win-arm64"; - - public const string WinArm = "win-arm"; - - public const string LinuxX64 = "linux-x64"; - - public const string LinuxMuslX64 = "linux-x64"; - - public const string LinuxArm64 = "linux-arm64"; - - public const string LinuxArm = "linux-arm"; - - public const string MacOsX64 = "osx-x64"; -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/DotNetTestAction.cs b/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/DotNetTestAction.cs deleted file mode 100644 index 57fed972..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/DotNetTestAction.cs +++ /dev/null @@ -1,130 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.IO; -using System.Linq; -using JetBrains.Annotations; -using Nuke.Common.IO; -using Nuke.Common.Tools.DotNet; - -namespace CreativeCoders.NukeBuild.BuildActions; - -[ExcludeFromCodeCoverage] -[PublicAPI] -public class DotNetTestAction : BuildActionBase -{ - private AbsolutePath _coverageDirectory; - - private bool _enableCodeCoverage; - - private string _logger = "xunit"; - private string _projectsPattern; - - private string _resultFileExt = "xml"; - - private string _resultsDirectory; - - private AbsolutePath _testProjectsBaseDirectory; - - protected override void OnExecute() - { - if (!Directory.Exists(_testProjectsBaseDirectory)) - { - return; - } - - var unitTestProjects = _testProjectsBaseDirectory.GlobFiles(_projectsPattern); - - var failedTests = new List<(string UnitTestProject, Exception Exception)>(); - - foreach (var unitTestProject in unitTestProjects) - { - var projectName = Path.GetFileNameWithoutExtension(unitTestProject); - - var testResultFile = Path.Combine(_resultsDirectory, $"{projectName}.{_resultFileExt}"); - - try - { - var testSettings = - CreateTestSettings(unitTestProject, testResultFile); - - DotNetTasks.DotNetTest(testSettings); - } - catch (Exception e) - { - failedTests.Add((UnitTestProject: unitTestProject, Exception: e)); - } - } - - if (failedTests.Count > 0) - { - throw failedTests.First().Exception; - } - } - - private DotNetTestSettings CreateTestSettings(string unitTestProject, string testResultFile) - { - var settings = new DotNetTestSettings() - .SetProjectFile(unitTestProject) - .SetConfiguration(BuildInfo.Configuration) - .SetLoggers($"{_logger};LogFileName={testResultFile}"); - - if (_enableCodeCoverage) - { - return settings - .SetDataCollector("XPlat Code Coverage") - .SetResultsDirectory(_coverageDirectory); - } - - return settings; - } - - public DotNetTestAction SetTestProjectsBaseDirectory(AbsolutePath testProjectsBaseDirectory) - { - _testProjectsBaseDirectory = testProjectsBaseDirectory; - - return this; - } - - public DotNetTestAction SetProjectsPattern(string projectsPattern) - { - _projectsPattern = projectsPattern; - - return this; - } - - public DotNetTestAction SetResultsDirectory(string resultsDirectory) - { - _resultsDirectory = resultsDirectory; - - return this; - } - - public DotNetTestAction SetCoverageDirectory(AbsolutePath coverageDirectory) - { - _coverageDirectory = coverageDirectory; - - return this; - } - - public DotNetTestAction EnableCoverage() - { - _enableCodeCoverage = true; - - return this; - } - - public DotNetTestAction UseLogger(string logger) - { - _logger = logger; - - return this; - } - - public DotNetTestAction SetResultFileExt(string resultFileExt) - { - _resultFileExt = resultFileExt; - - return this; - } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/IBuildAction.cs b/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/IBuildAction.cs deleted file mode 100644 index 52b9dffe..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/IBuildAction.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using Nuke.Common; - -namespace CreativeCoders.NukeBuild.BuildActions; - -public interface IBuildAction - where TBuildAction : IBuildAction -{ - ITargetDefinition Setup(ITargetDefinition targetDefinition); - - ITargetDefinition Setup(ITargetDefinition targetDefinition, Action configureAction); - - void SetBuildInfo(IBuildInfo buildInfo); -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/MsBuildCompileBuildAction.cs b/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/MsBuildCompileBuildAction.cs deleted file mode 100644 index cbb0f969..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/MsBuildCompileBuildAction.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using JetBrains.Annotations; -using Nuke.Common.Tools.MSBuild; - -namespace CreativeCoders.NukeBuild.BuildActions; - -[ExcludeFromCodeCoverage] -[PublicAPI] -public class MsBuildCompileBuildAction : BuildActionBase -{ - protected override void OnExecute() - { - MSBuildTasks.MSBuild(s => s - .SetProjectFile(BuildInfo.Solution) - .SetConfiguration(BuildInfo.Configuration) - .SetAssemblyVersion(BuildInfo.VersionInfo.GetAssemblySemVer()) - .SetFileVersion(BuildInfo.VersionInfo.GetAssemblySemFileVer()) - .SetInformationalVersion(BuildInfo.VersionInfo.InformationalVersion) - .DisableRestore()); - } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/PackBuildAction.cs b/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/PackBuildAction.cs deleted file mode 100644 index 49dcff62..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/PackBuildAction.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using CreativeCoders.Core; -using JetBrains.Annotations; -using Nuke.Common.Tools.DotNet; - -namespace CreativeCoders.NukeBuild.BuildActions; - -[ExcludeFromCodeCoverage] -[PublicAPI] -public class PackBuildAction : BuildActionBase -{ - private DotNetSymbolPackageFormat _symbolPackageFormat = DotNetSymbolPackageFormat.snupkg; - - private string _packageLicenseUrl; - - private string _packageLicenseExpression; - - private string _packageProjectUrl; - - private string _copyright; - - private bool _enableNoBuild; - - protected override void OnExecute() - { - DotNetTasks.DotNetPack(s => s - //.SetWorkingDirectory(BuildInfo.Solution.Directory) - .SetSymbolPackageFormat(_symbolPackageFormat) - .SetProject(BuildInfo.Solution) - .SetConfiguration(BuildInfo.Configuration) - .EnableIncludeSymbols() - .SetOutputDirectory(BuildInfo.ArtifactsDirectory) - .SetVersion(BuildInfo.VersionInfo.NuGetVersionV2) - .FluentIf(_enableNoBuild, x => x.EnableNoBuild()) - .FluentIf(!string.IsNullOrWhiteSpace(_copyright), x => x.SetCopyright(_copyright)) - .FluentIf(!string.IsNullOrWhiteSpace(_packageProjectUrl), - x => x.SetPackageProjectUrl(_packageProjectUrl)) - .FluentIf(!string.IsNullOrEmpty(_packageLicenseUrl), - x => x.SetPackageLicenseUrl(_packageLicenseUrl)) - .FluentIf(!string.IsNullOrWhiteSpace(_packageLicenseExpression), - x => x.SetProperty("PackageLicenseExpression", _packageLicenseExpression)) - ); - } - - public PackBuildAction SetSymbolPackageFormat(DotNetSymbolPackageFormat symbolPackageFormat) - { - _symbolPackageFormat = symbolPackageFormat; - - return this; - } - - public PackBuildAction SetPackageLicenseUrl(string packageLicenseUrl) - { - _packageLicenseUrl = packageLicenseUrl; - - return this; - } - - public PackBuildAction SetPackageLicenseExpression(string packageLicenseExpression) - { - _packageLicenseExpression = packageLicenseExpression; - - return this; - } - - public PackBuildAction SetPackageProjectUrl(string packageProjectUrl) - { - _packageProjectUrl = packageProjectUrl; - - return this; - } - - public PackBuildAction SetCopyright(string copyright) - { - _copyright = copyright; - - return this; - } - - public PackBuildAction SetEnableNoBuild(bool enableNoBuild) - { - _enableNoBuild = enableNoBuild; - - return this; - } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/PackageLicenseExpressions.cs b/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/PackageLicenseExpressions.cs deleted file mode 100644 index 81d301b4..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/PackageLicenseExpressions.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using JetBrains.Annotations; - -namespace CreativeCoders.NukeBuild.BuildActions; - -[ExcludeFromCodeCoverage] -[PublicAPI] -public static class PackageLicenseExpressions -{ - public const string LGPL30Only = "LGPL-3.0-only"; - - public const string LGPL30OrLater = "LGPL-3.0-or-later"; - - public const string MIT = "MIT"; - - public const string GPL30Only = "GPL-3.0-only"; - - public const string GPL30OrLater = "GPL-3.0-or-later"; - - public const string ApacheLicense20 = "Apache-2.0"; - - public const string MPL20 = "MPL-2.0"; -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/PushBuildAction.cs b/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/PushBuildAction.cs deleted file mode 100644 index 23ca79cf..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/PushBuildAction.cs +++ /dev/null @@ -1,73 +0,0 @@ -using System; -using System.Diagnostics.CodeAnalysis; -using CreativeCoders.Core; -using JetBrains.Annotations; -using Nuke.Common.IO; -using Nuke.Common.Tools.DotNet; - -namespace CreativeCoders.NukeBuild.BuildActions; - -[ExcludeFromCodeCoverage] -[PublicAPI] -public class PushBuildAction : BuildActionBase -{ - private string _apiKey; - - private string _source; - - private string _symbolSource; - - private string _symbolApiKey; - - protected override void OnExecute() - { - foreach (var packagePath in BuildInfo.ArtifactsDirectory.GlobFiles("*.nupkg")) - { - PushPackage(packagePath); - } - } - - private void PushPackage(string package) - { - DotNetTasks.DotNetNuGetPush(x => x - .SetTargetPath(package) - .FluentIf(_source != null, config => config.SetSource(_source)) - .FluentIf(_apiKey != null, config => config.SetApiKey(_apiKey)) - .FluentIf(_symbolSource != null, config => config.SetSymbolSource(_symbolSource)) - .FluentIf(_symbolApiKey != null, config => config.SetSymbolApiKey(_symbolApiKey)) - ); - } - - public PushBuildAction SetApiKey(string apiKey) - { - _apiKey = apiKey; - - return this; - } - - public PushBuildAction SetSource(string source) - { - _source = source; - - if (_source != null && !_source.StartsWith("http", StringComparison.InvariantCultureIgnoreCase)) - { - _source = "https://" + _source; - } - - return this; - } - - public PushBuildAction SetSymbolSource(string symbolSource) - { - _symbolSource = symbolSource; - - return this; - } - - public PushBuildAction SetSymbolApiKey(string symbolApiKey) - { - _symbolApiKey = symbolApiKey; - - return this; - } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/RestoreBuildAction.cs b/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/RestoreBuildAction.cs deleted file mode 100644 index 2e5024a4..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild/BuildActions/RestoreBuildAction.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using JetBrains.Annotations; -using Nuke.Common.Tools.DotNet; - -namespace CreativeCoders.NukeBuild.BuildActions; - -[ExcludeFromCodeCoverage] -[PublicAPI] -public class RestoreBuildAction : BuildActionBase -{ - protected override void OnExecute() - { - DotNetTasks.DotNetRestore(s => s - .SetProjectFile(BuildInfo.Solution)); - } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild/CreativeCoders.NukeBuild.csproj b/source/NukeBuild/CreativeCoders.NukeBuild/CreativeCoders.NukeBuild.csproj deleted file mode 100644 index 88dacedf..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild/CreativeCoders.NukeBuild.csproj +++ /dev/null @@ -1,16 +0,0 @@ - - - - Library - Nuke build extensions - - - - - - - - - - - diff --git a/source/NukeBuild/CreativeCoders.NukeBuild/GitVersionWrapper.cs b/source/NukeBuild/CreativeCoders.NukeBuild/GitVersionWrapper.cs deleted file mode 100644 index 9c223b8f..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild/GitVersionWrapper.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using Nuke.Common.Tools.GitVersion; - -#nullable enable - -namespace CreativeCoders.NukeBuild; - -public class GitVersionWrapper(GitVersion? gitVersion, string defaultVersion, int defaultBuildRevision) - : IVersionInfo -{ - private static string SafeCallGitVersion(Func callGitVersion, string defaultGitVersion) - { - try - { - return callGitVersion() ?? defaultGitVersion; - } - catch (Exception) - { - return defaultGitVersion; - } - } - - public string GetAssemblySemVer() - => SafeCallGitVersion( - () => gitVersion?.AssemblySemVer, - $"{defaultVersion}.{defaultBuildRevision}"); - - public string GetAssemblySemFileVer() - => SafeCallGitVersion( - () => gitVersion?.AssemblySemFileVer, - $"{defaultVersion}.{defaultBuildRevision}"); - - public string InformationalVersion - => SafeCallGitVersion( - () => gitVersion?.InformationalVersion, - $"{defaultVersion}.{defaultBuildRevision}-unknown"); - - public string NuGetVersionV2 - => SafeCallGitVersion( - () => gitVersion?.NuGetVersionV2, - $"{defaultVersion}-unknown"); -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild/IBuildInfo.cs b/source/NukeBuild/CreativeCoders.NukeBuild/IBuildInfo.cs deleted file mode 100644 index a307c81e..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild/IBuildInfo.cs +++ /dev/null @@ -1,22 +0,0 @@ -using JetBrains.Annotations; -using Nuke.Common.Git; -using Nuke.Common.IO; -using Nuke.Common.ProjectModel; - -namespace CreativeCoders.NukeBuild; - -[PublicAPI] -public interface IBuildInfo -{ - string Configuration { get; } - - Solution Solution { get; } - - GitRepository GitRepository { get; } - - IVersionInfo VersionInfo { get; } - - AbsolutePath SourceDirectory { get; } - - AbsolutePath ArtifactsDirectory { get; } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild/IVersionInfo.cs b/source/NukeBuild/CreativeCoders.NukeBuild/IVersionInfo.cs deleted file mode 100644 index e138731c..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild/IVersionInfo.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace CreativeCoders.NukeBuild; - -public interface IVersionInfo -{ - string GetAssemblySemVer(); - - string GetAssemblySemFileVer(); - - string InformationalVersion { get; } - - string NuGetVersionV2 { get; } -} diff --git a/source/NukeBuild/CreativeCoders.NukeBuild/TargetDefinitionExtensions.cs b/source/NukeBuild/CreativeCoders.NukeBuild/TargetDefinitionExtensions.cs deleted file mode 100644 index 5b3c241b..00000000 --- a/source/NukeBuild/CreativeCoders.NukeBuild/TargetDefinitionExtensions.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System; -using CreativeCoders.NukeBuild.BuildActions; -using JetBrains.Annotations; -using Nuke.Common; - -namespace CreativeCoders.NukeBuild; - -[PublicAPI] -public static class TargetDefinitionExtensions -{ - public static ITargetDefinition UseBuildAction(this ITargetDefinition targetDefinition) - where TBuildAction : IBuildAction, new() - { - var action = new TBuildAction(); - - return action.Setup(targetDefinition); - } - - public static ITargetDefinition UseBuildAction(this ITargetDefinition targetDefinition, - Action configureAction) - where TBuildAction : IBuildAction, new() - { - var action = new TBuildAction(); - - return action.Setup(targetDefinition, configureAction); - } - - public static ITargetDefinition UseBuildAction(this ITargetDefinition targetDefinition, - IBuildInfo buildInfo) - where TBuildAction : IBuildAction, new() - { - var action = new TBuildAction(); - - return action.Setup(targetDefinition, x => x.SetBuildInfo(buildInfo)); - } - - public static ITargetDefinition UseBuildAction(this ITargetDefinition targetDefinition, - IBuildInfo buildInfo, Action configureAction) - where TBuildAction : IBuildAction, new() - { - var action = new TBuildAction(); - - return action.Setup(targetDefinition, - x => - { - x.SetBuildInfo(buildInfo); - - configureAction(x); - }); - } - - public static ITargetDefinition ExecuteTarget(this ITargetDefinition targetDefinition, Target target) - { - return targetDefinition.Executes(() => target.Invoke(targetDefinition)); - } -} From f737ecc6ef9d3003d165ebf9e38c9b4306b845fb Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sun, 11 Jan 2026 11:54:35 +0100 Subject: [PATCH 69/73] Update pull-request workflow to use `-t pack` syntax for build command --- .github/workflows/pull-request.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 8193c58e..d18d68fb 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -69,7 +69,7 @@ jobs: ~/.nuget/packages key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} - name: 'Build with target: Pack' - run: ./build.cmd pack + run: ./build.cmd -t pack - name: 'Publish: coverage_report' uses: actions/upload-artifact@v4 with: From 93086b4b1f5eb411a182ebb54c9422101a918c2a Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sun, 11 Jan 2026 11:56:44 +0100 Subject: [PATCH 70/73] Remove redundant `_testServer.Dispose()` call in `TestServerContext` deconstruction --- .../TokenAuth/Jwt/TestServerContext.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/CreativeCoders.AspNetCore.Tests/TokenAuth/Jwt/TestServerContext.cs b/tests/CreativeCoders.AspNetCore.Tests/TokenAuth/Jwt/TestServerContext.cs index 3096e573..a223f5d4 100644 --- a/tests/CreativeCoders.AspNetCore.Tests/TokenAuth/Jwt/TestServerContext.cs +++ b/tests/CreativeCoders.AspNetCore.Tests/TokenAuth/Jwt/TestServerContext.cs @@ -75,8 +75,6 @@ public async ValueTask DisposeAsync() { await _host.StopAsync(); _host.Dispose(); - - _testServer.Dispose(); } private static IHostBuilder SetupWebHostBuilder(Action? configureServices) From 203f2d22ffb2c6c846e0c788148ee7288d343347 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sun, 11 Jan 2026 12:04:02 +0100 Subject: [PATCH 71/73] Update GitVersion config: change pull-request mode to ContinuousDelivery, refine label, and set prevent-increment behavior --- GitVersion.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/GitVersion.yml b/GitVersion.yml index df80f0e7..f4d6f0bd 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -37,11 +37,13 @@ branches: is-release-branch: false pre-release-weight: 55000 pull-request: - mode: ContinuousDeployment - label: PR + mode: ContinuousDelivery + label: PR.{BranchName} increment: Inherit track-merge-target: false regex: ^(pull|pull\-requests|pr)[/-] + prevent-increment: + when-current-commit-tagged: false source-branches: - main - feature From a1d91d6ec578614dd4798ed53d1a366c57fde466 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sun, 11 Jan 2026 12:06:51 +0100 Subject: [PATCH 72/73] Refine GitVersion regex to group branch name in pull-request handling --- GitVersion.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GitVersion.yml b/GitVersion.yml index f4d6f0bd..6eba156b 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -41,7 +41,7 @@ branches: label: PR.{BranchName} increment: Inherit track-merge-target: false - regex: ^(pull|pull\-requests|pr)[/-] + regex: ^(pull|pull\-requests|pr)[/-](?.+) prevent-increment: when-current-commit-tagged: false source-branches: From 59322535067fd9423a6aa85806c4c9515862c612 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sun, 11 Jan 2026 12:11:26 +0100 Subject: [PATCH 73/73] Update GitVersion config: revise pull-request label and regex for better name handling --- GitVersion.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GitVersion.yml b/GitVersion.yml index 6eba156b..ebd6e016 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -38,10 +38,10 @@ branches: pre-release-weight: 55000 pull-request: mode: ContinuousDelivery - label: PR.{BranchName} + label: PR-{PullRequestName} increment: Inherit track-merge-target: false - regex: ^(pull|pull\-requests|pr)[/-](?.+) + regex: ^(pull|pull\-requests|pr)[/-](?.+) prevent-increment: when-current-commit-tagged: false source-branches: