build/Build.cs (125 lines of code) (raw):

using Serilog; using Nuke.Common; using Nuke.Common.Execution; using Nuke.Common.IO; using Nuke.Common.ProjectModel; using Nuke.Common.Tooling; using Nuke.Common.Tools.DotNet; using Nuke.Common.Utilities.Collections; using static Nuke.Common.Tools.DotNet.DotNetTasks; namespace _build { [UnsetVisualStudioEnvironmentVariables] class Build : NukeBuild { public static int Main () => Execute<Build>(x => x.Package); [Parameter("Configuration to build - Default is 'Debug' (local) or 'Release' (server)")] readonly string Configuration = IsLocalBuild ? "Debug" : "Release"; [Parameter("Space (Public) - NuGet target URL", Name = "JB_SPACE_PUBLIC_NUGET_URL")] readonly string? NuGetPublicSpaceTargetUrl; [Parameter("Space (Public) - NuGet target API key / access token", Name = "JB_SPACE_PUBLIC_CLIENT_TOKEN")] readonly string? NuGetPublicSpaceTargetApiKey; [Parameter("NuGet.org - NuGet target URL", Name = "JB_SPACE_NUGETORG_NUGET_URL")] readonly string? NuGetOrgTargetUrl; [Parameter("NuGet.org - NuGet target API key / access token", Name = "JB_SPACE_NUGETORG_CLIENT_TOKEN")] readonly string? NuGetOrgTargetApiKey; [Solution] readonly Solution? Solution; [VersionInfo(VersionMajor = 2, VersionMinor = 0)] readonly VersionInfo? VersionInfo; AbsolutePath SourceDirectory => RootDirectory / "src"; AbsolutePath TestsDirectory => RootDirectory / "tests"; AbsolutePath ArtifactsDirectory => RootDirectory / "artifacts"; Target Clean => _ => _ .Executes(() => { SourceDirectory.GlobDirectories("**/bin", "**/obj").ForEach(it => it.DeleteDirectory()); TestsDirectory.GlobDirectories("**/bin", "**/obj").ForEach(it => it.DeleteDirectory()); ArtifactsDirectory.CreateOrCleanDirectory(); }); Target Restore => _ => _ .DependsOn(Clean) .Executes(() => { DotNetRestore(_ => _ .SetProjectFile(Solution)); }); Target Compile => _ => _ .DependsOn(Restore) .Executes(() => { DotNetBuild(_ => _ .SetProjectFile(Solution) .SetConfiguration(Configuration) .SetAssemblyVersion(VersionInfo.AssemblySemVer) .SetFileVersion(VersionInfo.AssemblySemFileVer) .SetInformationalVersion(VersionInfo.InformationalVersion) .SetVersion(VersionInfo.NuGetVersion) .SetProperty("GeneratePackageOnBuild", "False") .EnableNoRestore()); }); Target Test => _ => _ .DependsOn(Compile) .Executes(() => { DotNetTest(_ => _ .SetProjectFile(Solution) .SetConfiguration(Configuration) .EnableNoRestore() .EnableNoBuild()); }); Target Package => _ => _ .DependsOn(Test) .Executes(() => { Log.Information("NuGet package version: {Version}", VersionInfo.NuGetVersion); foreach (var project in Solution.AllProjects.Where(p => p.GetProperty<bool>("GeneratePackageOnBuild")).ToList()) { DotNetPack(_ => _ .SetProject(project) .SetConfiguration(Configuration) .EnableIncludeSource() .EnableIncludeSymbols() .EnableNoRestore() .EnableNoBuild() .SetVersion(VersionInfo.NuGetVersion) .SetOutputDirectory(ArtifactsDirectory)); } }); Target PushPackagesToPublicSpace => _ => _ .TriggeredBy(Package) .OnlyWhenStatic(() => !string.IsNullOrEmpty(NuGetPublicSpaceTargetUrl) && !string.IsNullOrEmpty(NuGetPublicSpaceTargetApiKey) && NuGetPublicSpaceTargetUrl != " ") .WhenSkipped(DependencyBehavior.Execute) .Executes(() => { var packages = ArtifactsDirectory.GlobFiles("*.nupkg"); DotNetNuGetPush(_ => _ .SetSource(NuGetPublicSpaceTargetUrl) .SetApiKey(NuGetPublicSpaceTargetApiKey) .CombineWith(packages, (_, v) => _ .SetTargetPath(v)), degreeOfParallelism: 5, completeOnFailure: true); }); Target PushPackagesToNuGetOrg => _ => _ .TriggeredBy(Package) .OnlyWhenStatic(() => (Environment.GetEnvironmentVariable("JB_SPACE_GIT_BRANCH") ?? "").Contains("main", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(NuGetOrgTargetUrl) && !string.IsNullOrEmpty(NuGetOrgTargetApiKey) && NuGetOrgTargetUrl != " ") .WhenSkipped(DependencyBehavior.Execute) .Executes(() => { var packages = ArtifactsDirectory.GlobFiles("*.nupkg", "*.snupkg"); DotNetNuGetPush(_ => _ .SetSource(NuGetOrgTargetUrl) .SetApiKey(NuGetOrgTargetApiKey) .CombineWith(packages, (_, v) => _ .SetTargetPath(v)), degreeOfParallelism: 5, completeOnFailure: true); }); } }