diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index da200cd..ff3ff6b 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -2,11 +2,12 @@ "version": 1, "isRoot": true, "tools": { - "cake.tool": { - "version": "4.0.0", + "microsoft.sbom.dotnettool": { + "version": "4.1.0", "commands": [ - "dotnet-cake" - ] + "sbom-tool" + ], + "rollForward": true } } } \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9d673d6..602b8e2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,8 +3,8 @@ name: CI on: [push] env: - xcodeVersion: 16.2 - dotnetVersion: 9.0.200 + xcodeVersion: 16.4 + dotnetVersion: 9.0.304 jobs: build: @@ -33,9 +33,9 @@ jobs: run: dotnet tool restore - name: Run the Cake script - run: dotnet cake + run: dotnet run --project build/Build.csproj --artifactsDir ${{ github.workspace }}/artifacts - uses: actions/upload-artifact@v4 with: name: NugetPackage - path: artifacts + path: ${{ github.workspace }}/artifacts diff --git a/.gitignore b/.gitignore index 7a6533b..7d35514 100644 --- a/.gitignore +++ b/.gitignore @@ -20,7 +20,6 @@ Resource.designer.cs [Rr]eleases/ x64/ x86/ -build/ bld/ [Bb]in/ [Oo]bj/ @@ -260,3 +259,5 @@ artifacts/ .DS_Store .vs/ + +build/artifacts/ \ No newline at end of file diff --git a/build.cake b/build.cake deleted file mode 100644 index 970d0ca..0000000 --- a/build.cake +++ /dev/null @@ -1,79 +0,0 @@ -#tool dotnet:https://api.nuget.org/v3/index.json?package=GitVersion.Tool&version=5.12.0 -#addin nuget:https://api.nuget.org/v3/index.json?package=Cake.Figlet&version=2.0.1 - -var target = Argument("target", "Default"); -var configuration = Argument("configuration", "Release"); -var sln = new FilePath("./BTProgressHUD/BTProgressHUD.csproj"); -var artifactsDir = new DirectoryPath("./artifacts"); -var gitVersionLog = new FilePath("./gitversion.log"); - -GitVersion versionInfo = null; - -Setup(context => -{ - versionInfo = context.GitVersion(new GitVersionSettings - { - UpdateAssemblyInfo = true, - OutputType = GitVersionOutput.Json, - LogFilePath = gitVersionLog.MakeAbsolute(context.Environment) - }); - - var cakeVersion = typeof(ICakeContext).Assembly.GetName().Version.ToString(); - - Information(Figlet("BTProgressHUD")); - Information("Building version {0}, ({1}, {2}) using version {3} of Cake.", - versionInfo.SemVer, - configuration, - target, - cakeVersion); -}); - -Task("Clean") - .Does(() => -{ - CleanDirectories("./BTProgressHUD/bin"); - CleanDirectories("./BTProgressHUD/obj"); - - EnsureDirectoryExists(artifactsDir); -}); - -Task("Restore") - .Does(() => -{ - DotNetRestore(sln.ToString()); -}); - -Task("Build") - .IsDependentOn("Clean") - .IsDependentOn("Restore") - .Does(() => -{ - var msBuildSettings = new DotNetMSBuildSettings - { - Version = versionInfo.SemVer, - PackageVersion = versionInfo.SemVer, - InformationalVersion = versionInfo.InformationalVersion - }; - - var settings = new DotNetBuildSettings - { - Configuration = configuration, - MSBuildSettings = msBuildSettings - }; - - DotNetBuild(sln.ToString(), settings); -}); - -Task("CopyArtifacts") - .IsDependentOn("Build") - .Does(() => -{ - var nugetFiles = GetFiles("BTProgressHUD/bin/" + configuration + "/**/*.nupkg"); - CopyFiles(nugetFiles, artifactsDir); - CopyFileToDirectory(gitVersionLog, artifactsDir); -}); - -Task("Default") - .IsDependentOn("CopyArtifacts"); - -RunTarget(target); diff --git a/build/Build.csproj b/build/Build.csproj new file mode 100644 index 0000000..593d009 --- /dev/null +++ b/build/Build.csproj @@ -0,0 +1,16 @@ + + + + Exe + net9.0 + $(MSBuildProjectDirectory) + + false + + + + + + + + diff --git a/build/Program.cs b/build/Program.cs new file mode 100644 index 0000000..6b43b03 --- /dev/null +++ b/build/Program.cs @@ -0,0 +1,193 @@ +using Cake.Common; +using Cake.Common.Diagnostics; +using Cake.Common.IO; +using Cake.Common.Tools.DotNet; +using Cake.Common.Tools.DotNet.Build; +using Cake.GitVersioning; +using Cake.Core; +using Cake.Core.IO; +using Cake.Frosting; +using Nerdbank.GitVersioning; +using Spectre.Console; +using Cake.Common.Tools.DotNet.MSBuild; +using Cake.Common.Build; +using Cake.Core.Diagnostics; +using Cake.Common.Tools.DotNet.Tool; +using Cake.Common.Tools.DotNet.Run; + +namespace Build; + +public static class Program +{ + public static int Main(string[] args) + { + return new CakeHost() + .UseContext() + .Run(args); + } +} + +public class BuildContext : FrostingContext +{ + public string AppFileRoot { get; } + public string ProjectName { get; set; } = "BTProgressHUD"; + public string Target { get; set; } + public string BuildConfiguration { get; set; } + public string ArtifactsDir { get; set; } + public DirectoryPath OutputDir { get; set; } + public VersionOracle VersionInfo { get; set; } + public FilePath ProjectPath { get; set; } + public DotNetVerbosity VerbosityDotNet { get; set; } + + public BuildContext(ICakeContext context) + : base(context) + { + AppFileRoot = context.Argument("root", ".."); + Target = context.Argument("target", "Default"); + BuildConfiguration = context.Argument("configuration", "Release"); + ArtifactsDir = context.Argument("artifactsDir", $"{AppFileRoot}/artifacts"); + OutputDir = new DirectoryPath(ArtifactsDir); + + ProjectPath = new FilePath($"{AppFileRoot}/{ProjectName}/{ProjectName}.csproj"); + + VersionInfo = context.GitVersioningGetVersion(); + + var cakeVersion = typeof(ICakeContext).Assembly.GetName().Version.ToString(); + + AnsiConsole.Write(new FigletText(ProjectName)); + context.Information("Building version {0}, ({1}, {2}) using version {3} of Cake.", + VersionInfo.SemVer2, + BuildConfiguration, + Target, + cakeVersion); + + if (context.GitHubActions().Environment.PullRequest.IsPullRequest) + { + context.Information("PR HeadRef: {0}", context.GitHubActions().Environment.Workflow.HeadRef); + context.Information("PR BaseRef: {0}", context.GitHubActions().Environment.Workflow.BaseRef); + } + + context.Information("RefName: {0}", context.GitHubActions().Environment.Workflow.RefName); + + VerbosityDotNet = context.Log.Verbosity switch + { + Verbosity.Quiet => DotNetVerbosity.Quiet, + Verbosity.Normal => DotNetVerbosity.Normal, + Verbosity.Verbose => DotNetVerbosity.Detailed, + Verbosity.Diagnostic => DotNetVerbosity.Diagnostic, + _ => DotNetVerbosity.Minimal + }; + } + + public DotNetBuildSettings GetDefaultBuildSettings(DotNetMSBuildSettings msBuildSettings = null) + { + msBuildSettings ??= GetDefaultDotNetMSBuildSettings(); + + var settings = new DotNetBuildSettings + { + Configuration = BuildConfiguration, + MSBuildSettings = msBuildSettings, + Verbosity = VerbosityDotNet + }; + + return settings; + } + + public DotNetMSBuildSettings GetDefaultDotNetMSBuildSettings() + { + var settings = new DotNetMSBuildSettings + { + Version = VersionInfo.SemVer2, + PackageVersion = VersionInfo.NuGetPackageVersion, + InformationalVersion = VersionInfo.AssemblyInformationalVersion + }; + + return settings; + } +} + +[TaskName("Clean")] +public sealed class CleanTask : FrostingTask +{ + public override void Run(BuildContext context) + { + context.CleanDirectories($"{context.AppFileRoot}/{context.ProjectName}*/**/bin"); + context.CleanDirectories($"{context.AppFileRoot}/{context.ProjectName}*/**/obj"); + context.CleanDirectories(context.OutputDir.FullPath); + + context.EnsureDirectoryExists(context.OutputDir); + } +} + +[TaskName("Restore")] +[IsDependentOn(typeof(CleanTask))] +public sealed class RestoreTask : FrostingTask +{ + public override void Run(BuildContext context) + { + context.DotNetRestore(context.ProjectPath.ToString()); + } +} + + +[TaskName("Build")] +[IsDependentOn(typeof(RestoreTask))] +public sealed class BuildTask : FrostingTask +{ + public override void Run(BuildContext context) + { + var settings = context.GetDefaultBuildSettings(); + context.DotNetBuild(context.ProjectPath.ToString(), settings); + } +} + +[TaskName("GenerateSBOM")] +[IsDependentOn(typeof(BuildTask))] +public sealed class GenerateSbomTask : FrostingTask +{ + public override void Run(BuildContext context) + { + ProcessArgumentBuilder PrepareSbomArguments(ProcessArgumentBuilder args) + { + args.Append("generate"); + args.Append("-b {0}", context.OutputDir.FullPath); + args.Append("-bc {0}", context.AppFileRoot); + args.Append("-nsb https://github.com/redth-org/BTProgressHUD"); + args.Append("-ps redth-org"); + args.Append("-pn BTProgressHUD"); + args.Append("-V Verbose"); + args.Append("-pv {0}", context.VersionInfo.SemVer2); + return args; + } + + var settings = new DotNetToolSettings + { + ArgumentCustomization = PrepareSbomArguments + }; + + context.DotNetTool("sbom-tool", settings); + } +} + +[TaskName("CopyPackages")] +[IsDependentOn(typeof(BuildTask))] +public sealed class CopyPackagesTask : FrostingTask +{ + public override void Run(BuildContext context) + { + var packagesDir = context.OutputDir.Combine("NuGet/"); + context.EnsureDirectoryExists(packagesDir); + + var nugetFiles = context.GetFiles($"{context.AppFileRoot}/{context.ProjectName}*/**/bin/{context.BuildConfiguration}/**/*.nupkg"); + context.CopyFiles(nugetFiles, packagesDir); + } +} + +[TaskName("Default")] +[IsDependentOn(typeof(CleanTask))] +[IsDependentOn(typeof(BuildTask))] +[IsDependentOn(typeof(GenerateSbomTask))] +[IsDependentOn(typeof(CopyPackagesTask))] +public sealed class DefaultTask : FrostingTask +{ +} diff --git a/version.json b/version.json new file mode 100644 index 0000000..77d747c --- /dev/null +++ b/version.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/main/src/NerdBank.GitVersioning/version.schema.json", + "version": "2.2", + "publicReleaseRefSpec": [ + "^refs/heads/main$", + "^refs/tags/\\d+\\.\\d+", + "^refs/tags/v\\d+\\.\\d+" + ] +} \ No newline at end of file