From 7292724f343b8008a7903b5f0e7dc7ff50e21fd1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 7 Aug 2025 23:53:09 +0000 Subject: [PATCH 1/7] Initial plan From 95ae0180f9163bafd94da207dbef91eec2357d06 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 8 Aug 2025 00:13:01 +0000 Subject: [PATCH 2/7] Reduce pipeline output verbosity for successful operations Co-authored-by: thomhurst <30480171+thomhurst@users.noreply.github.com> --- .github/actions/execute-pipeline/action.yml | 2 +- .github/workflows/dotnet.yml | 2 +- .../Modules/Abstract/TestBaseModule.cs | 17 ++++++++++++++++- TUnit.Pipeline/Modules/PackTUnitFilesModule.cs | 1 + 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/.github/actions/execute-pipeline/action.yml b/.github/actions/execute-pipeline/action.yml index 55e4893bc4f..b434978d63f 100644 --- a/.github/actions/execute-pipeline/action.yml +++ b/.github/actions/execute-pipeline/action.yml @@ -30,7 +30,7 @@ runs: steps: - name: Run Pipeline shell: bash - run: dotnet run -c Release --categories ${{ inputs.categories }} + run: dotnet run -c Release --verbosity quiet --categories ${{ inputs.categories }} working-directory: "TUnit.Pipeline" env: ADMIN_TOKEN: ${{ inputs.admin-token }} diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index f03c901f738..a1065a3250a 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -64,7 +64,7 @@ jobs: run: npx playwright install - name: Build - run: dotnet build -c Release + run: dotnet build -c Release --verbosity quiet - name: Run Pipeline uses: ./.github/actions/execute-pipeline diff --git a/TUnit.Pipeline/Modules/Abstract/TestBaseModule.cs b/TUnit.Pipeline/Modules/Abstract/TestBaseModule.cs index ed495b99224..ab64c8db8f6 100644 --- a/TUnit.Pipeline/Modules/Abstract/TestBaseModule.cs +++ b/TUnit.Pipeline/Modules/Abstract/TestBaseModule.cs @@ -44,18 +44,33 @@ protected virtual IEnumerable TestableFrameworks private DotNetRunOptions SetDefaults(DotNetRunOptions testOptions) { - // Removed --fail-fast to allow all tests to run even if some fail + // Add quiet verbosity to reduce output for successful test runs + var arguments = testOptions.Arguments?.ToList() ?? []; + + // Add TUnit verbosity control (only if not already specified) + if (!arguments.Any(arg => arg.StartsWith("--verbosity"))) + { + arguments.AddRange(["--verbosity", "minimal"]); + } if (testOptions.EnvironmentVariables?.Any(x => x.Key == "NET_VERSION") != true) { testOptions = testOptions with { + Arguments = [.. arguments], EnvironmentVariables = new Dictionary { ["NET_VERSION"] = testOptions.Framework, } }; } + else + { + testOptions = testOptions with + { + Arguments = [.. arguments] + }; + } return testOptions; } diff --git a/TUnit.Pipeline/Modules/PackTUnitFilesModule.cs b/TUnit.Pipeline/Modules/PackTUnitFilesModule.cs index ec49e03e63e..f06125a6224 100644 --- a/TUnit.Pipeline/Modules/PackTUnitFilesModule.cs +++ b/TUnit.Pipeline/Modules/PackTUnitFilesModule.cs @@ -39,6 +39,7 @@ await context.DotNet() ], IncludeSource = project == Sourcy.DotNet.Projects.TUnit_Templates ? false : true, Configuration = Configuration.Release, + Verbosity = "quiet", // Reduce output for successful packs }, cancellationToken); packedProjects.Add(new PackedProject(project.NameWithoutExtension, version.SemVer!)); From 16c9ae3a501f294b7bc914b67eb4d9b3ff701c38 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 8 Aug 2025 06:24:01 +0000 Subject: [PATCH 3/7] Replace verbosity flags approach with CliWrap output suppression for successful operations Co-authored-by: thomhurst <30480171+thomhurst@users.noreply.github.com> --- .github/actions/execute-pipeline/action.yml | 2 +- .github/workflows/dotnet.yml | 2 +- TUnit.Engine.Tests/GlobalHooks.cs | 13 +++++++++++-- .../Modules/Abstract/TestBaseModule.cs | 17 +---------------- TUnit.Pipeline/Modules/PackTUnitFilesModule.cs | 1 - TUnit.Pipeline/Program.cs | 1 + 6 files changed, 15 insertions(+), 21 deletions(-) diff --git a/.github/actions/execute-pipeline/action.yml b/.github/actions/execute-pipeline/action.yml index b434978d63f..55e4893bc4f 100644 --- a/.github/actions/execute-pipeline/action.yml +++ b/.github/actions/execute-pipeline/action.yml @@ -30,7 +30,7 @@ runs: steps: - name: Run Pipeline shell: bash - run: dotnet run -c Release --verbosity quiet --categories ${{ inputs.categories }} + run: dotnet run -c Release --categories ${{ inputs.categories }} working-directory: "TUnit.Pipeline" env: ADMIN_TOKEN: ${{ inputs.admin-token }} diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index a1065a3250a..f03c901f738 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -64,7 +64,7 @@ jobs: run: npx playwright install - name: Build - run: dotnet build -c Release --verbosity quiet + run: dotnet build -c Release - name: Run Pipeline uses: ./.github/actions/execute-pipeline diff --git a/TUnit.Engine.Tests/GlobalHooks.cs b/TUnit.Engine.Tests/GlobalHooks.cs index 8c09e99e4fe..ea0e498fd24 100644 --- a/TUnit.Engine.Tests/GlobalHooks.cs +++ b/TUnit.Engine.Tests/GlobalHooks.cs @@ -5,9 +5,18 @@ public class GlobalHooks [Before(TestSession)] public static async Task BuildTestProject() { - await CliWrap.Cli.Wrap("dotnet") + var result = await CliWrap.Cli.Wrap("dotnet") .WithArguments(["build", "-c", "Release"]) .WithWorkingDirectory(FileSystemHelpers.FindFile(x => x.Name == "TUnit.TestProject.csproj")!.DirectoryName!) - .ExecuteAsync(); + .WithValidation(CliWrap.CommandResultValidation.None) + .ExecuteBufferedAsync(); + + // Only show output if the command failed + if (result.ExitCode != 0) + { + Console.WriteLine(result.StandardOutput); + Console.Error.WriteLine(result.StandardError); + throw new InvalidOperationException($"Build failed with exit code {result.ExitCode}"); + } } } diff --git a/TUnit.Pipeline/Modules/Abstract/TestBaseModule.cs b/TUnit.Pipeline/Modules/Abstract/TestBaseModule.cs index ab64c8db8f6..ed495b99224 100644 --- a/TUnit.Pipeline/Modules/Abstract/TestBaseModule.cs +++ b/TUnit.Pipeline/Modules/Abstract/TestBaseModule.cs @@ -44,33 +44,18 @@ protected virtual IEnumerable TestableFrameworks private DotNetRunOptions SetDefaults(DotNetRunOptions testOptions) { - // Add quiet verbosity to reduce output for successful test runs - var arguments = testOptions.Arguments?.ToList() ?? []; - - // Add TUnit verbosity control (only if not already specified) - if (!arguments.Any(arg => arg.StartsWith("--verbosity"))) - { - arguments.AddRange(["--verbosity", "minimal"]); - } + // Removed --fail-fast to allow all tests to run even if some fail if (testOptions.EnvironmentVariables?.Any(x => x.Key == "NET_VERSION") != true) { testOptions = testOptions with { - Arguments = [.. arguments], EnvironmentVariables = new Dictionary { ["NET_VERSION"] = testOptions.Framework, } }; } - else - { - testOptions = testOptions with - { - Arguments = [.. arguments] - }; - } return testOptions; } diff --git a/TUnit.Pipeline/Modules/PackTUnitFilesModule.cs b/TUnit.Pipeline/Modules/PackTUnitFilesModule.cs index f06125a6224..ec49e03e63e 100644 --- a/TUnit.Pipeline/Modules/PackTUnitFilesModule.cs +++ b/TUnit.Pipeline/Modules/PackTUnitFilesModule.cs @@ -39,7 +39,6 @@ await context.DotNet() ], IncludeSource = project == Sourcy.DotNet.Projects.TUnit_Templates ? false : true, Configuration = Configuration.Release, - Verbosity = "quiet", // Reduce output for successful packs }, cancellationToken); packedProjects.Add(new PackedProject(project.NameWithoutExtension, version.SemVer!)); diff --git a/TUnit.Pipeline/Program.cs b/TUnit.Pipeline/Program.cs index c0de1bb942b..c27c4a650c9 100644 --- a/TUnit.Pipeline/Program.cs +++ b/TUnit.Pipeline/Program.cs @@ -1,6 +1,7 @@ using System.CommandLine; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using ModularPipelines.Extensions; using ModularPipelines.Host; using ModularPipelines.Options; From e2f1d0864dfbb27e502906a86a46f383f518b8a3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 8 Aug 2025 06:28:53 +0000 Subject: [PATCH 4/7] Add ModularPipelines logging configuration to reduce framework output Co-authored-by: thomhurst <30480171+thomhurst@users.noreply.github.com> --- TUnit.Pipeline/Program.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/TUnit.Pipeline/Program.cs b/TUnit.Pipeline/Program.cs index c27c4a650c9..64887826b61 100644 --- a/TUnit.Pipeline/Program.cs +++ b/TUnit.Pipeline/Program.cs @@ -31,6 +31,13 @@ collection.Configure(context.Configuration.GetSection("NuGet")); collection.AddModulesFromAssembly(typeof(Program).Assembly); }) + .ConfigureLogging(logging => + { + // Reduce ModularPipelines framework output + logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Warning); + logging.AddFilter("ModularPipelines", Microsoft.Extensions.Logging.LogLevel.Warning); + logging.AddConsole(); + }) .ConfigurePipelineOptions((_, options) => options.ExecutionMode = ExecutionMode.WaitForAllModules); if (categories.Length > 0) From 83d37ecf5b64ecc5d793b4090b1030a0a0a33c4f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 8 Aug 2025 06:45:53 +0000 Subject: [PATCH 5/7] Implement CliWrap-based output suppression for ModularPipelines DotNet operations Co-authored-by: thomhurst <30480171+thomhurst@users.noreply.github.com> --- .../Extensions/QuietDotNetExtensions.cs | 300 +++++++++++++++++ TUnit.Pipeline/Extensions/test.cs | 301 ++++++++++++++++++ .../Modules/Abstract/TestBaseModule.cs | 3 +- .../Modules/AddLocalNuGetRepositoryModule.cs | 3 +- .../Modules/PackTUnitFilesModule.cs | 3 +- .../Modules/RunAnalyzersTestsModule.cs | 3 +- .../Modules/RunAspNetTestsModule.cs | 3 +- .../RunAssertionsAnalyzersTestsModule.cs | 3 +- .../RunAssertionsCodeFixersTestsModule.cs | 3 +- .../Modules/RunEngineTestsModule.cs | 3 +- .../Modules/RunTemplateTestsModule.cs | 3 +- .../Modules/TestTemplatePackageModule.cs | 11 +- TUnit.Pipeline/Modules/UploadToNuGetModule.cs | 3 +- TUnit.Pipeline/TUnit.Pipeline.csproj | 1 + 14 files changed, 628 insertions(+), 15 deletions(-) create mode 100644 TUnit.Pipeline/Extensions/QuietDotNetExtensions.cs create mode 100644 TUnit.Pipeline/Extensions/test.cs diff --git a/TUnit.Pipeline/Extensions/QuietDotNetExtensions.cs b/TUnit.Pipeline/Extensions/QuietDotNetExtensions.cs new file mode 100644 index 00000000000..1c1b98f263b --- /dev/null +++ b/TUnit.Pipeline/Extensions/QuietDotNetExtensions.cs @@ -0,0 +1,300 @@ +using CliWrap; +using ModularPipelines.Context; +using ModularPipelines.DotNet.Extensions; +using ModularPipelines.DotNet.Options; +using ModularPipelines.Models; + +namespace TUnit.Pipeline.Extensions; + +/// +/// Custom extensions that suppress output for successful DotNet operations +/// +public static class QuietDotNetExtensions +{ + public static async Task RunQuiet(this IDotNetContext dotNet, DotNetRunOptions options, CancellationToken cancellationToken = default) + { + // Build the command similar to how ModularPipelines does it + var command = Cli.Wrap("dotnet") + .WithArguments(BuildRunArguments(options)) + .WithWorkingDirectory(options.WorkingDirectory ?? Environment.CurrentDirectory); + + if (options.EnvironmentVariables?.Any() == true) + { + command = command.WithEnvironmentVariables(options.EnvironmentVariables); + } + + // Execute with buffered output to suppress streaming to console + var result = await command.ExecuteBufferedAsync(cancellationToken); + + // Only show output if the command failed + if (result.ExitCode != 0) + { + Console.WriteLine(result.StandardOutput); + Console.Error.WriteLine(result.StandardError); + } + + return new CommandResult + { + ExitCode = result.ExitCode, + StandardOutput = result.StandardOutput, + StandardError = result.StandardError, + StartTime = result.StartTime, + ExitTime = result.ExitTime + }; + } + + public static async Task TestQuiet(this IDotNetContext dotNet, DotNetTestOptions options, CancellationToken cancellationToken = default) + { + var command = Cli.Wrap("dotnet") + .WithArguments(BuildTestArguments(options)) + .WithWorkingDirectory(options.WorkingDirectory ?? Environment.CurrentDirectory); + + if (options.EnvironmentVariables?.Any() == true) + { + command = command.WithEnvironmentVariables(options.EnvironmentVariables); + } + + var result = await command.ExecuteBufferedAsync(cancellationToken); + + if (result.ExitCode != 0) + { + Console.WriteLine(result.StandardOutput); + Console.Error.WriteLine(result.StandardError); + } + + return new CommandResult + { + ExitCode = result.ExitCode, + StandardOutput = result.StandardOutput, + StandardError = result.StandardError, + StartTime = result.StartTime, + ExitTime = result.ExitTime + }; + } + + public static async Task PackQuiet(this IDotNetContext dotNet, DotNetPackOptions options, CancellationToken cancellationToken = default) + { + var command = Cli.Wrap("dotnet") + .WithArguments(BuildPackArguments(options)) + .WithWorkingDirectory(options.WorkingDirectory ?? Environment.CurrentDirectory); + + if (options.EnvironmentVariables?.Any() == true) + { + command = command.WithEnvironmentVariables(options.EnvironmentVariables); + } + + var result = await command.ExecuteBufferedAsync(cancellationToken); + + if (result.ExitCode != 0) + { + Console.WriteLine(result.StandardOutput); + Console.Error.WriteLine(result.StandardError); + } + + return new CommandResult + { + ExitCode = result.ExitCode, + StandardOutput = result.StandardOutput, + StandardError = result.StandardError, + StartTime = result.StartTime, + ExitTime = result.ExitTime + }; + } + + public static async Task NewQuiet(this IDotNetContext dotNet, DotNetNewOptions options, CancellationToken cancellationToken = default) + { + var command = Cli.Wrap("dotnet") + .WithArguments(BuildNewArguments(options)) + .WithWorkingDirectory(options.WorkingDirectory ?? Environment.CurrentDirectory); + + if (options.EnvironmentVariables?.Any() == true) + { + command = command.WithEnvironmentVariables(options.EnvironmentVariables); + } + + var result = await command.ExecuteBufferedAsync(cancellationToken); + + if (result.ExitCode != 0 || !options.ThrowOnNonZeroExitCode) + { + Console.WriteLine(result.StandardOutput); + Console.Error.WriteLine(result.StandardError); + } + + return new CommandResult + { + ExitCode = result.ExitCode, + StandardOutput = result.StandardOutput, + StandardError = result.StandardError, + StartTime = result.StartTime, + ExitTime = result.ExitTime + }; + } + + public static async Task NugetAddSourceQuiet(this IDotNetContext dotNet, DotNetNugetAddSourceOptions options, CancellationToken cancellationToken = default) + { + var command = Cli.Wrap("dotnet") + .WithArguments(BuildNugetAddSourceArguments(options)) + .WithWorkingDirectory(options.WorkingDirectory ?? Environment.CurrentDirectory); + + if (options.EnvironmentVariables?.Any() == true) + { + command = command.WithEnvironmentVariables(options.EnvironmentVariables); + } + + var result = await command.ExecuteBufferedAsync(cancellationToken); + + if (result.ExitCode != 0) + { + Console.WriteLine(result.StandardOutput); + Console.Error.WriteLine(result.StandardError); + } + + return new CommandResult + { + ExitCode = result.ExitCode, + StandardOutput = result.StandardOutput, + StandardError = result.StandardError, + StartTime = result.StartTime, + ExitTime = result.ExitTime + }; + } + + public static async Task NugetPushQuiet(this IDotNetContext dotNet, DotNetNugetPushOptions options, CancellationToken cancellationToken = default) + { + var command = Cli.Wrap("dotnet") + .WithArguments(BuildNugetPushArguments(options)) + .WithWorkingDirectory(options.WorkingDirectory ?? Environment.CurrentDirectory); + + if (options.EnvironmentVariables?.Any() == true) + { + command = command.WithEnvironmentVariables(options.EnvironmentVariables); + } + + var result = await command.ExecuteBufferedAsync(cancellationToken); + + if (result.ExitCode != 0) + { + Console.WriteLine(result.StandardOutput); + Console.Error.WriteLine(result.StandardError); + } + + return new CommandResult + { + ExitCode = result.ExitCode, + StandardOutput = result.StandardOutput, + StandardError = result.StandardError, + StartTime = result.StartTime, + ExitTime = result.ExitTime + }; + } + + private static string[] BuildRunArguments(DotNetRunOptions options) + { + var args = new List { "run" }; + + if (!string.IsNullOrEmpty(options.Project)) + args.AddRange(["--project", options.Project]); + + if (options.Configuration.HasValue) + args.AddRange(["--configuration", options.Configuration.Value.ToString()]); + + if (!string.IsNullOrEmpty(options.Framework)) + args.AddRange(["--framework", options.Framework]); + + if (options.NoBuild) + args.Add("--no-build"); + + if (options.Arguments?.Any() == true) + { + args.Add("--"); + args.AddRange(options.Arguments); + } + + return args.ToArray(); + } + + private static string[] BuildTestArguments(DotNetTestOptions options) + { + var args = new List { "test" }; + + if (options.Project != null) + args.Add(options.Project.FullName); + + if (options.Configuration.HasValue) + args.AddRange(["--configuration", options.Configuration.Value.ToString()]); + + if (!string.IsNullOrEmpty(options.Framework)) + args.AddRange(["--framework", options.Framework]); + + if (options.NoBuild) + args.Add("--no-build"); + + return args.ToArray(); + } + + private static string[] BuildPackArguments(DotNetPackOptions options) + { + var args = new List { "pack" }; + + if (options.Project != null) + args.Add(options.Project.FullName); + + if (options.Configuration.HasValue) + args.AddRange(["--configuration", options.Configuration.Value.ToString()]); + + if (options.IncludeSource == true) + args.Add("--include-source"); + + if (options.Properties?.Any() == true) + { + foreach (var prop in options.Properties) + { + args.AddRange(["-p", $"{prop.Key}={prop.Value}"]); + } + } + + return args.ToArray(); + } + + private static string[] BuildNewArguments(DotNetNewOptions options) + { + var args = new List { "new", options.Template }; + + if (!string.IsNullOrEmpty(options.Name)) + args.AddRange(["--name", options.Name]); + + if (options.Arguments?.Any() == true) + args.AddRange(options.Arguments); + + return args.ToArray(); + } + + private static string[] BuildNugetAddSourceArguments(DotNetNugetAddSourceOptions options) + { + var args = new List { "nuget", "add", "source" }; + + if (!string.IsNullOrEmpty(options.Source)) + args.Add(options.Source); + + if (!string.IsNullOrEmpty(options.Name)) + args.AddRange(["--name", options.Name]); + + return args.ToArray(); + } + + private static string[] BuildNugetPushArguments(DotNetNugetPushOptions options) + { + var args = new List { "nuget", "push" }; + + if (options.Package != null) + args.Add(options.Package.FullName); + + if (!string.IsNullOrEmpty(options.Source)) + args.AddRange(["--source", options.Source]); + + if (!string.IsNullOrEmpty(options.ApiKey)) + args.AddRange(["--api-key", options.ApiKey]); + + return args.ToArray(); + } +} \ No newline at end of file diff --git a/TUnit.Pipeline/Extensions/test.cs b/TUnit.Pipeline/Extensions/test.cs new file mode 100644 index 00000000000..997632273b8 --- /dev/null +++ b/TUnit.Pipeline/Extensions/test.cs @@ -0,0 +1,301 @@ +using System; +using CliWrap; +using ModularPipelines.Context; +using ModularPipelines.DotNet.Extensions; +using ModularPipelines.DotNet.Options; +using ModularPipelines.Models; + +namespace TUnit.Pipeline.Extensions; + +/// +/// Custom extensions that suppress output for successful DotNet operations +/// +public static class QuietDotNetExtensions +{ + public static async Task RunQuiet(this IDotNetContext dotNet, DotNetRunOptions options, CancellationToken cancellationToken = default) + { + // Build the command similar to how ModularPipelines does it + var command = Cli.Wrap("dotnet") + .WithArguments(BuildRunArguments(options)) + .WithWorkingDirectory(options.WorkingDirectory ?? Environment.CurrentDirectory); + + if (options.EnvironmentVariables?.Any() == true) + { + command = command.WithEnvironmentVariables(options.EnvironmentVariables); + } + + // Execute with buffered output to suppress streaming to console + var result = await command.ExecuteBufferedAsync(cancellationToken); + + // Only show output if the command failed + if (result.ExitCode != 0) + { + Console.WriteLine(result.StandardOutput); + Console.Error.WriteLine(result.StandardError); + } + + return new CommandResult + { + ExitCode = result.ExitCode, + StandardOutput = result.StandardOutput, + StandardError = result.StandardError, + StartTime = result.StartTime, + ExitTime = result.ExitTime + }; + } + + public static async Task TestQuiet(this IDotNetContext dotNet, DotNetTestOptions options, CancellationToken cancellationToken = default) + { + var command = Cli.Wrap("dotnet") + .WithArguments(BuildTestArguments(options)) + .WithWorkingDirectory(options.WorkingDirectory ?? Environment.CurrentDirectory); + + if (options.EnvironmentVariables?.Any() == true) + { + command = command.WithEnvironmentVariables(options.EnvironmentVariables); + } + + var result = await command.ExecuteBufferedAsync(cancellationToken); + + if (result.ExitCode != 0) + { + Console.WriteLine(result.StandardOutput); + Console.Error.WriteLine(result.StandardError); + } + + return new CommandResult + { + ExitCode = result.ExitCode, + StandardOutput = result.StandardOutput, + StandardError = result.StandardError, + StartTime = result.StartTime, + ExitTime = result.ExitTime + }; + } + + public static async Task PackQuiet(this IDotNetContext dotNet, DotNetPackOptions options, CancellationToken cancellationToken = default) + { + var command = Cli.Wrap("dotnet") + .WithArguments(BuildPackArguments(options)) + .WithWorkingDirectory(options.WorkingDirectory ?? Environment.CurrentDirectory); + + if (options.EnvironmentVariables?.Any() == true) + { + command = command.WithEnvironmentVariables(options.EnvironmentVariables); + } + + var result = await command.ExecuteBufferedAsync(cancellationToken); + + if (result.ExitCode != 0) + { + Console.WriteLine(result.StandardOutput); + Console.Error.WriteLine(result.StandardError); + } + + return new CommandResult + { + ExitCode = result.ExitCode, + StandardOutput = result.StandardOutput, + StandardError = result.StandardError, + StartTime = result.StartTime, + ExitTime = result.ExitTime + }; + } + + public static async Task NewQuiet(this IDotNetContext dotNet, DotNetNewOptions options, CancellationToken cancellationToken = default) + { + var command = Cli.Wrap("dotnet") + .WithArguments(BuildNewArguments(options)) + .WithWorkingDirectory(options.WorkingDirectory ?? Environment.CurrentDirectory); + + if (options.EnvironmentVariables?.Any() == true) + { + command = command.WithEnvironmentVariables(options.EnvironmentVariables); + } + + var result = await command.ExecuteBufferedAsync(cancellationToken); + + if (result.ExitCode != 0 || !options.ThrowOnNonZeroExitCode) + { + Console.WriteLine(result.StandardOutput); + Console.Error.WriteLine(result.StandardError); + } + + return new CommandResult + { + ExitCode = result.ExitCode, + StandardOutput = result.StandardOutput, + StandardError = result.StandardError, + StartTime = result.StartTime, + ExitTime = result.ExitTime + }; + } + + public static async Task NugetAddSourceQuiet(this IDotNetContext dotNet, DotNetNugetAddSourceOptions options, CancellationToken cancellationToken = default) + { + var command = Cli.Wrap("dotnet") + .WithArguments(BuildNugetAddSourceArguments(options)) + .WithWorkingDirectory(options.WorkingDirectory ?? Environment.CurrentDirectory); + + if (options.EnvironmentVariables?.Any() == true) + { + command = command.WithEnvironmentVariables(options.EnvironmentVariables); + } + + var result = await command.ExecuteBufferedAsync(cancellationToken); + + if (result.ExitCode != 0) + { + Console.WriteLine(result.StandardOutput); + Console.Error.WriteLine(result.StandardError); + } + + return new CommandResult + { + ExitCode = result.ExitCode, + StandardOutput = result.StandardOutput, + StandardError = result.StandardError, + StartTime = result.StartTime, + ExitTime = result.ExitTime + }; + } + + public static async Task NugetPushQuiet(this IDotNetContext dotNet, DotNetNugetPushOptions options, CancellationToken cancellationToken = default) + { + var command = Cli.Wrap("dotnet") + .WithArguments(BuildNugetPushArguments(options)) + .WithWorkingDirectory(options.WorkingDirectory ?? Environment.CurrentDirectory); + + if (options.EnvironmentVariables?.Any() == true) + { + command = command.WithEnvironmentVariables(options.EnvironmentVariables); + } + + var result = await command.ExecuteBufferedAsync(cancellationToken); + + if (result.ExitCode != 0) + { + Console.WriteLine(result.StandardOutput); + Console.Error.WriteLine(result.StandardError); + } + + return new CommandResult + { + ExitCode = result.ExitCode, + StandardOutput = result.StandardOutput, + StandardError = result.StandardError, + StartTime = result.StartTime, + ExitTime = result.ExitTime + }; + } + + private static string[] BuildRunArguments(DotNetRunOptions options) + { + var args = new List { "run" }; + + if (!string.IsNullOrEmpty(options.Project)) + args.AddRange(["--project", options.Project]); + + if (options.Configuration.HasValue) + args.AddRange(["--configuration", options.Configuration.Value.ToString()]); + + if (!string.IsNullOrEmpty(options.Framework)) + args.AddRange(["--framework", options.Framework]); + + if (options.NoBuild) + args.Add("--no-build"); + + if (options.Arguments?.Any() == true) + { + args.Add("--"); + args.AddRange(options.Arguments); + } + + return args.ToArray(); + } + + private static string[] BuildTestArguments(DotNetTestOptions options) + { + var args = new List { "test" }; + + if (options.Project != null) + args.Add(options.Project.FullName); + + if (options.Configuration.HasValue) + args.AddRange(["--configuration", options.Configuration.Value.ToString()]); + + if (!string.IsNullOrEmpty(options.Framework)) + args.AddRange(["--framework", options.Framework]); + + if (options.NoBuild) + args.Add("--no-build"); + + return args.ToArray(); + } + + private static string[] BuildPackArguments(DotNetPackOptions options) + { + var args = new List { "pack" }; + + if (options.Project != null) + args.Add(options.Project.FullName); + + if (options.Configuration.HasValue) + args.AddRange(["--configuration", options.Configuration.Value.ToString()]); + + if (options.IncludeSource == true) + args.Add("--include-source"); + + if (options.Properties?.Any() == true) + { + foreach (var prop in options.Properties) + { + args.AddRange(["-p", $"{prop.Key}={prop.Value}"]); + } + } + + return args.ToArray(); + } + + private static string[] BuildNewArguments(DotNetNewOptions options) + { + var args = new List { "new", options.Template }; + + if (!string.IsNullOrEmpty(options.Name)) + args.AddRange(["--name", options.Name]); + + if (options.Arguments?.Any() == true) + args.AddRange(options.Arguments); + + return args.ToArray(); + } + + private static string[] BuildNugetAddSourceArguments(DotNetNugetAddSourceOptions options) + { + var args = new List { "nuget", "add", "source" }; + + if (!string.IsNullOrEmpty(options.Source)) + args.Add(options.Source); + + if (!string.IsNullOrEmpty(options.Name)) + args.AddRange(["--name", options.Name]); + + return args.ToArray(); + } + + private static string[] BuildNugetPushArguments(DotNetNugetPushOptions options) + { + var args = new List { "nuget", "push" }; + + if (options.Package != null) + args.Add(options.Package.FullName); + + if (!string.IsNullOrEmpty(options.Source)) + args.AddRange(["--source", options.Source]); + + if (!string.IsNullOrEmpty(options.ApiKey)) + args.AddRange(["--api-key", options.ApiKey]); + + return args.ToArray(); + } +} \ No newline at end of file diff --git a/TUnit.Pipeline/Modules/Abstract/TestBaseModule.cs b/TUnit.Pipeline/Modules/Abstract/TestBaseModule.cs index ed495b99224..990729b2e26 100644 --- a/TUnit.Pipeline/Modules/Abstract/TestBaseModule.cs +++ b/TUnit.Pipeline/Modules/Abstract/TestBaseModule.cs @@ -4,6 +4,7 @@ using ModularPipelines.DotNet.Options; using ModularPipelines.Models; using ModularPipelines.Modules; +using TUnit.Pipeline.Extensions; namespace TUnit.Pipeline.Modules.Abstract; @@ -33,7 +34,7 @@ protected virtual IEnumerable TestableFrameworks { var testOptions = SetDefaults(await GetTestOptions(context, framework, cancellationToken)); - return await context.DotNet().Run(testOptions, cancellationToken); + return await context.DotNet().RunQuiet(testOptions, cancellationToken); }); results.Add(testResult); diff --git a/TUnit.Pipeline/Modules/AddLocalNuGetRepositoryModule.cs b/TUnit.Pipeline/Modules/AddLocalNuGetRepositoryModule.cs index 1b8c189abc6..75d027f88df 100644 --- a/TUnit.Pipeline/Modules/AddLocalNuGetRepositoryModule.cs +++ b/TUnit.Pipeline/Modules/AddLocalNuGetRepositoryModule.cs @@ -3,6 +3,7 @@ using ModularPipelines.DotNet.Options; using ModularPipelines.FileSystem; using ModularPipelines.Modules; +using TUnit.Pipeline.Extensions; namespace TUnit.Pipeline.Modules; @@ -11,7 +12,7 @@ public class AddLocalNuGetRepositoryModule : Module protected override async Task ExecuteAsync(IPipelineContext context, CancellationToken cancellationToken) { var folder = context.FileSystem.GetFolder(Environment.SpecialFolder.LocalApplicationData).GetFolder("LocalNuget").Create(); - await context.DotNet().Nuget.Add.Source(new DotNetNugetAddSourceOptions(folder), cancellationToken); + await context.DotNet().NugetAddSourceQuiet(new DotNetNugetAddSourceOptions(folder), cancellationToken); return folder; } } diff --git a/TUnit.Pipeline/Modules/PackTUnitFilesModule.cs b/TUnit.Pipeline/Modules/PackTUnitFilesModule.cs index ec49e03e63e..b780466b384 100644 --- a/TUnit.Pipeline/Modules/PackTUnitFilesModule.cs +++ b/TUnit.Pipeline/Modules/PackTUnitFilesModule.cs @@ -4,6 +4,7 @@ using ModularPipelines.DotNet.Options; using ModularPipelines.Models; using ModularPipelines.Modules; +using TUnit.Pipeline.Extensions; namespace TUnit.Pipeline.Modules; @@ -27,7 +28,7 @@ public class PackTUnitFilesModule : Module> foreach (var project in projects.Value!) { await context.DotNet() - .Pack( + .PackQuiet( new DotNetPackOptions(project) { Properties = diff --git a/TUnit.Pipeline/Modules/RunAnalyzersTestsModule.cs b/TUnit.Pipeline/Modules/RunAnalyzersTestsModule.cs index 1183e16353e..32d0aef6e84 100644 --- a/TUnit.Pipeline/Modules/RunAnalyzersTestsModule.cs +++ b/TUnit.Pipeline/Modules/RunAnalyzersTestsModule.cs @@ -6,6 +6,7 @@ using ModularPipelines.Git.Extensions; using ModularPipelines.Models; using ModularPipelines.Modules; +using TUnit.Pipeline.Extensions; namespace TUnit.Pipeline.Modules; @@ -16,7 +17,7 @@ public class RunAnalyzersTestsModule : Module { var project = context.Git().RootDirectory.FindFile(x => x.Name == "TUnit.Analyzers.Tests.csproj").AssertExists(); - return await context.DotNet().Test(new DotNetTestOptions(project) + return await context.DotNet().TestQuiet(new DotNetTestOptions(project) { NoBuild = true, Configuration = Configuration.Release, diff --git a/TUnit.Pipeline/Modules/RunAspNetTestsModule.cs b/TUnit.Pipeline/Modules/RunAspNetTestsModule.cs index 981f3179ac8..c31dc2e6966 100644 --- a/TUnit.Pipeline/Modules/RunAspNetTestsModule.cs +++ b/TUnit.Pipeline/Modules/RunAspNetTestsModule.cs @@ -6,6 +6,7 @@ using ModularPipelines.Git.Extensions; using ModularPipelines.Models; using ModularPipelines.Modules; +using TUnit.Pipeline.Extensions; namespace TUnit.Pipeline.Modules; @@ -16,7 +17,7 @@ public class RunAspNetTestsModule : Module { var project = context.Git().RootDirectory.FindFile(x => x.Name == "TUnit.Example.Asp.Net.TestProject.csproj").AssertExists(); - return await context.DotNet().Run(new DotNetRunOptions + return await context.DotNet().RunQuiet(new DotNetRunOptions { Project = project.Name, NoBuild = true, diff --git a/TUnit.Pipeline/Modules/RunAssertionsAnalyzersTestsModule.cs b/TUnit.Pipeline/Modules/RunAssertionsAnalyzersTestsModule.cs index 9dd43ae864c..22da0a501e0 100644 --- a/TUnit.Pipeline/Modules/RunAssertionsAnalyzersTestsModule.cs +++ b/TUnit.Pipeline/Modules/RunAssertionsAnalyzersTestsModule.cs @@ -6,6 +6,7 @@ using ModularPipelines.Git.Extensions; using ModularPipelines.Models; using ModularPipelines.Modules; +using TUnit.Pipeline.Extensions; namespace TUnit.Pipeline.Modules; @@ -16,7 +17,7 @@ public class RunAssertionsAnalyzersTestsModule : Module { var project = context.Git().RootDirectory.FindFile(x => x.Name == "TUnit.Assertions.Analyzers.Tests.csproj").AssertExists(); - return await context.DotNet().Test(new DotNetTestOptions(project) + return await context.DotNet().TestQuiet(new DotNetTestOptions(project) { NoBuild = true, Configuration = Configuration.Release, diff --git a/TUnit.Pipeline/Modules/RunAssertionsCodeFixersTestsModule.cs b/TUnit.Pipeline/Modules/RunAssertionsCodeFixersTestsModule.cs index fbe505bef03..e81edc6c97c 100644 --- a/TUnit.Pipeline/Modules/RunAssertionsCodeFixersTestsModule.cs +++ b/TUnit.Pipeline/Modules/RunAssertionsCodeFixersTestsModule.cs @@ -6,6 +6,7 @@ using ModularPipelines.Git.Extensions; using ModularPipelines.Models; using ModularPipelines.Modules; +using TUnit.Pipeline.Extensions; namespace TUnit.Pipeline.Modules; @@ -16,7 +17,7 @@ public class RunAssertionsCodeFixersTestsModule : Module { var project = context.Git().RootDirectory.FindFile(x => x.Name == "TUnit.Assertions.Analyzers.CodeFixers.Tests.csproj").AssertExists(); - return await context.DotNet().Test(new DotNetTestOptions(project) + return await context.DotNet().TestQuiet(new DotNetTestOptions(project) { NoBuild = true, Configuration = Configuration.Release, diff --git a/TUnit.Pipeline/Modules/RunEngineTestsModule.cs b/TUnit.Pipeline/Modules/RunEngineTestsModule.cs index 86042171241..715d460076c 100644 --- a/TUnit.Pipeline/Modules/RunEngineTestsModule.cs +++ b/TUnit.Pipeline/Modules/RunEngineTestsModule.cs @@ -6,6 +6,7 @@ using ModularPipelines.Git.Extensions; using ModularPipelines.Models; using ModularPipelines.Modules; +using TUnit.Pipeline.Extensions; namespace TUnit.Pipeline.Modules; @@ -29,7 +30,7 @@ public class RunEngineTestsModule : Module { var project = context.Git().RootDirectory.FindFile(x => x.Name == "TUnit.Engine.Tests.csproj").AssertExists(); - return await context.DotNet().Run(new DotNetRunOptions + return await context.DotNet().RunQuiet(new DotNetRunOptions { Project = project.Name, NoBuild = true, diff --git a/TUnit.Pipeline/Modules/RunTemplateTestsModule.cs b/TUnit.Pipeline/Modules/RunTemplateTestsModule.cs index 2a053e9226c..b7197a60437 100644 --- a/TUnit.Pipeline/Modules/RunTemplateTestsModule.cs +++ b/TUnit.Pipeline/Modules/RunTemplateTestsModule.cs @@ -6,6 +6,7 @@ using ModularPipelines.Git.Extensions; using ModularPipelines.Models; using ModularPipelines.Modules; +using TUnit.Pipeline.Extensions; namespace TUnit.Pipeline.Modules; @@ -16,7 +17,7 @@ public class RunTemplateTestsModule : Module { var project = context.Git().RootDirectory.FindFile(x => x.Name == "TUnit.Templates.Tests.csproj").AssertExists(); - return await context.DotNet().Test(new DotNetTestOptions(project) + return await context.DotNet().TestQuiet(new DotNetTestOptions(project) { NoBuild = true, Configuration = Configuration.Release, diff --git a/TUnit.Pipeline/Modules/TestTemplatePackageModule.cs b/TUnit.Pipeline/Modules/TestTemplatePackageModule.cs index ff064326ff0..f5078165c3e 100644 --- a/TUnit.Pipeline/Modules/TestTemplatePackageModule.cs +++ b/TUnit.Pipeline/Modules/TestTemplatePackageModule.cs @@ -4,6 +4,7 @@ using ModularPipelines.DotNet.Options; using ModularPipelines.Models; using ModularPipelines.Modules; +using TUnit.Pipeline.Extensions; namespace TUnit.Pipeline.Modules; @@ -16,28 +17,28 @@ public class TestTemplatePackageModule : Module { var version = await GetModule(); - await context.DotNet().New(new DotNetNewOptions("uninstall") + await context.DotNet().NewQuiet(new DotNetNewOptions("uninstall") { Arguments = ["TUnit.Templates"], ThrowOnNonZeroExitCode = false }, cancellationToken); - await context.DotNet().New(new DotNetNewOptions("install") + await context.DotNet().NewQuiet(new DotNetNewOptions("install") { Arguments = [$"TUnit.Templates::{version.Value!.SemVer}"] }, cancellationToken); - await context.DotNet().New(new DotNetNewOptions("TUnit") + await context.DotNet().NewQuiet(new DotNetNewOptions("TUnit") { Name = "MyTestProject" }, cancellationToken); - await context.DotNet().New(new DotNetNewOptions("TUnit.AspNet") + await context.DotNet().NewQuiet(new DotNetNewOptions("TUnit.AspNet") { Name = "MyTestProject2" }, cancellationToken); - return await context.DotNet().New(new DotNetNewOptions("TUnit.Playwright") + return await context.DotNet().NewQuiet(new DotNetNewOptions("TUnit.Playwright") { Name = "MyTestProject3" }, cancellationToken); diff --git a/TUnit.Pipeline/Modules/UploadToNuGetModule.cs b/TUnit.Pipeline/Modules/UploadToNuGetModule.cs index 0abefcbeecf..2af854496a0 100644 --- a/TUnit.Pipeline/Modules/UploadToNuGetModule.cs +++ b/TUnit.Pipeline/Modules/UploadToNuGetModule.cs @@ -8,6 +8,7 @@ using ModularPipelines.Git.Extensions; using ModularPipelines.Models; using ModularPipelines.Modules; +using TUnit.Pipeline.Extensions; namespace TUnit.Pipeline.Modules; @@ -40,7 +41,7 @@ protected override Task ShouldSkip(IPipelineContext context) .GetFiles(x => x.Extension is ".nupkg"); return await nupkgs.SelectAsync(file => - context.DotNet().Nuget.Push(new DotNetNugetPushOptions(file) + context.DotNet().NugetPushQuiet(new DotNetNugetPushOptions(file) { Source = "https://api.nuget.org/v3/index.json", ApiKey = options.Value.ApiKey diff --git a/TUnit.Pipeline/TUnit.Pipeline.csproj b/TUnit.Pipeline/TUnit.Pipeline.csproj index 959473ebe0b..1a759b70077 100644 --- a/TUnit.Pipeline/TUnit.Pipeline.csproj +++ b/TUnit.Pipeline/TUnit.Pipeline.csproj @@ -17,5 +17,6 @@ + From 88dcab6c809d4d02cf06ba105bac0f34049c55cf Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 8 Aug 2025 07:13:28 +0000 Subject: [PATCH 6/7] Replace custom extensions with CommandLogging enum for output suppression Co-authored-by: thomhurst <30480171+thomhurst@users.noreply.github.com> --- .../Extensions/QuietDotNetExtensions.cs | 300 ----------------- TUnit.Pipeline/Extensions/test.cs | 301 ------------------ .../Modules/Abstract/TestBaseModule.cs | 10 +- .../Modules/AddLocalNuGetRepositoryModule.cs | 7 +- .../Modules/PackTUnitFilesModule.cs | 5 +- TUnit.Pipeline/Modules/PublishAOTModule.cs | 4 +- .../Modules/PublishSingleFileModule.cs | 4 +- .../Modules/RunAnalyzersTestsModule.cs | 7 +- .../Modules/RunAspNetTestsModule.cs | 7 +- .../RunAssertionsAnalyzersTestsModule.cs | 7 +- .../RunAssertionsCodeFixersTestsModule.cs | 7 +- .../Modules/RunEngineTestsModule.cs | 7 +- .../Modules/RunTemplateTestsModule.cs | 7 +- .../Modules/TestTemplatePackageModule.cs | 27 +- TUnit.Pipeline/Modules/UploadToNuGetModule.cs | 7 +- TUnit.Pipeline/Program.cs | 8 - TUnit.Pipeline/TUnit.Pipeline.csproj | 1 - 17 files changed, 66 insertions(+), 650 deletions(-) delete mode 100644 TUnit.Pipeline/Extensions/QuietDotNetExtensions.cs delete mode 100644 TUnit.Pipeline/Extensions/test.cs diff --git a/TUnit.Pipeline/Extensions/QuietDotNetExtensions.cs b/TUnit.Pipeline/Extensions/QuietDotNetExtensions.cs deleted file mode 100644 index 1c1b98f263b..00000000000 --- a/TUnit.Pipeline/Extensions/QuietDotNetExtensions.cs +++ /dev/null @@ -1,300 +0,0 @@ -using CliWrap; -using ModularPipelines.Context; -using ModularPipelines.DotNet.Extensions; -using ModularPipelines.DotNet.Options; -using ModularPipelines.Models; - -namespace TUnit.Pipeline.Extensions; - -/// -/// Custom extensions that suppress output for successful DotNet operations -/// -public static class QuietDotNetExtensions -{ - public static async Task RunQuiet(this IDotNetContext dotNet, DotNetRunOptions options, CancellationToken cancellationToken = default) - { - // Build the command similar to how ModularPipelines does it - var command = Cli.Wrap("dotnet") - .WithArguments(BuildRunArguments(options)) - .WithWorkingDirectory(options.WorkingDirectory ?? Environment.CurrentDirectory); - - if (options.EnvironmentVariables?.Any() == true) - { - command = command.WithEnvironmentVariables(options.EnvironmentVariables); - } - - // Execute with buffered output to suppress streaming to console - var result = await command.ExecuteBufferedAsync(cancellationToken); - - // Only show output if the command failed - if (result.ExitCode != 0) - { - Console.WriteLine(result.StandardOutput); - Console.Error.WriteLine(result.StandardError); - } - - return new CommandResult - { - ExitCode = result.ExitCode, - StandardOutput = result.StandardOutput, - StandardError = result.StandardError, - StartTime = result.StartTime, - ExitTime = result.ExitTime - }; - } - - public static async Task TestQuiet(this IDotNetContext dotNet, DotNetTestOptions options, CancellationToken cancellationToken = default) - { - var command = Cli.Wrap("dotnet") - .WithArguments(BuildTestArguments(options)) - .WithWorkingDirectory(options.WorkingDirectory ?? Environment.CurrentDirectory); - - if (options.EnvironmentVariables?.Any() == true) - { - command = command.WithEnvironmentVariables(options.EnvironmentVariables); - } - - var result = await command.ExecuteBufferedAsync(cancellationToken); - - if (result.ExitCode != 0) - { - Console.WriteLine(result.StandardOutput); - Console.Error.WriteLine(result.StandardError); - } - - return new CommandResult - { - ExitCode = result.ExitCode, - StandardOutput = result.StandardOutput, - StandardError = result.StandardError, - StartTime = result.StartTime, - ExitTime = result.ExitTime - }; - } - - public static async Task PackQuiet(this IDotNetContext dotNet, DotNetPackOptions options, CancellationToken cancellationToken = default) - { - var command = Cli.Wrap("dotnet") - .WithArguments(BuildPackArguments(options)) - .WithWorkingDirectory(options.WorkingDirectory ?? Environment.CurrentDirectory); - - if (options.EnvironmentVariables?.Any() == true) - { - command = command.WithEnvironmentVariables(options.EnvironmentVariables); - } - - var result = await command.ExecuteBufferedAsync(cancellationToken); - - if (result.ExitCode != 0) - { - Console.WriteLine(result.StandardOutput); - Console.Error.WriteLine(result.StandardError); - } - - return new CommandResult - { - ExitCode = result.ExitCode, - StandardOutput = result.StandardOutput, - StandardError = result.StandardError, - StartTime = result.StartTime, - ExitTime = result.ExitTime - }; - } - - public static async Task NewQuiet(this IDotNetContext dotNet, DotNetNewOptions options, CancellationToken cancellationToken = default) - { - var command = Cli.Wrap("dotnet") - .WithArguments(BuildNewArguments(options)) - .WithWorkingDirectory(options.WorkingDirectory ?? Environment.CurrentDirectory); - - if (options.EnvironmentVariables?.Any() == true) - { - command = command.WithEnvironmentVariables(options.EnvironmentVariables); - } - - var result = await command.ExecuteBufferedAsync(cancellationToken); - - if (result.ExitCode != 0 || !options.ThrowOnNonZeroExitCode) - { - Console.WriteLine(result.StandardOutput); - Console.Error.WriteLine(result.StandardError); - } - - return new CommandResult - { - ExitCode = result.ExitCode, - StandardOutput = result.StandardOutput, - StandardError = result.StandardError, - StartTime = result.StartTime, - ExitTime = result.ExitTime - }; - } - - public static async Task NugetAddSourceQuiet(this IDotNetContext dotNet, DotNetNugetAddSourceOptions options, CancellationToken cancellationToken = default) - { - var command = Cli.Wrap("dotnet") - .WithArguments(BuildNugetAddSourceArguments(options)) - .WithWorkingDirectory(options.WorkingDirectory ?? Environment.CurrentDirectory); - - if (options.EnvironmentVariables?.Any() == true) - { - command = command.WithEnvironmentVariables(options.EnvironmentVariables); - } - - var result = await command.ExecuteBufferedAsync(cancellationToken); - - if (result.ExitCode != 0) - { - Console.WriteLine(result.StandardOutput); - Console.Error.WriteLine(result.StandardError); - } - - return new CommandResult - { - ExitCode = result.ExitCode, - StandardOutput = result.StandardOutput, - StandardError = result.StandardError, - StartTime = result.StartTime, - ExitTime = result.ExitTime - }; - } - - public static async Task NugetPushQuiet(this IDotNetContext dotNet, DotNetNugetPushOptions options, CancellationToken cancellationToken = default) - { - var command = Cli.Wrap("dotnet") - .WithArguments(BuildNugetPushArguments(options)) - .WithWorkingDirectory(options.WorkingDirectory ?? Environment.CurrentDirectory); - - if (options.EnvironmentVariables?.Any() == true) - { - command = command.WithEnvironmentVariables(options.EnvironmentVariables); - } - - var result = await command.ExecuteBufferedAsync(cancellationToken); - - if (result.ExitCode != 0) - { - Console.WriteLine(result.StandardOutput); - Console.Error.WriteLine(result.StandardError); - } - - return new CommandResult - { - ExitCode = result.ExitCode, - StandardOutput = result.StandardOutput, - StandardError = result.StandardError, - StartTime = result.StartTime, - ExitTime = result.ExitTime - }; - } - - private static string[] BuildRunArguments(DotNetRunOptions options) - { - var args = new List { "run" }; - - if (!string.IsNullOrEmpty(options.Project)) - args.AddRange(["--project", options.Project]); - - if (options.Configuration.HasValue) - args.AddRange(["--configuration", options.Configuration.Value.ToString()]); - - if (!string.IsNullOrEmpty(options.Framework)) - args.AddRange(["--framework", options.Framework]); - - if (options.NoBuild) - args.Add("--no-build"); - - if (options.Arguments?.Any() == true) - { - args.Add("--"); - args.AddRange(options.Arguments); - } - - return args.ToArray(); - } - - private static string[] BuildTestArguments(DotNetTestOptions options) - { - var args = new List { "test" }; - - if (options.Project != null) - args.Add(options.Project.FullName); - - if (options.Configuration.HasValue) - args.AddRange(["--configuration", options.Configuration.Value.ToString()]); - - if (!string.IsNullOrEmpty(options.Framework)) - args.AddRange(["--framework", options.Framework]); - - if (options.NoBuild) - args.Add("--no-build"); - - return args.ToArray(); - } - - private static string[] BuildPackArguments(DotNetPackOptions options) - { - var args = new List { "pack" }; - - if (options.Project != null) - args.Add(options.Project.FullName); - - if (options.Configuration.HasValue) - args.AddRange(["--configuration", options.Configuration.Value.ToString()]); - - if (options.IncludeSource == true) - args.Add("--include-source"); - - if (options.Properties?.Any() == true) - { - foreach (var prop in options.Properties) - { - args.AddRange(["-p", $"{prop.Key}={prop.Value}"]); - } - } - - return args.ToArray(); - } - - private static string[] BuildNewArguments(DotNetNewOptions options) - { - var args = new List { "new", options.Template }; - - if (!string.IsNullOrEmpty(options.Name)) - args.AddRange(["--name", options.Name]); - - if (options.Arguments?.Any() == true) - args.AddRange(options.Arguments); - - return args.ToArray(); - } - - private static string[] BuildNugetAddSourceArguments(DotNetNugetAddSourceOptions options) - { - var args = new List { "nuget", "add", "source" }; - - if (!string.IsNullOrEmpty(options.Source)) - args.Add(options.Source); - - if (!string.IsNullOrEmpty(options.Name)) - args.AddRange(["--name", options.Name]); - - return args.ToArray(); - } - - private static string[] BuildNugetPushArguments(DotNetNugetPushOptions options) - { - var args = new List { "nuget", "push" }; - - if (options.Package != null) - args.Add(options.Package.FullName); - - if (!string.IsNullOrEmpty(options.Source)) - args.AddRange(["--source", options.Source]); - - if (!string.IsNullOrEmpty(options.ApiKey)) - args.AddRange(["--api-key", options.ApiKey]); - - return args.ToArray(); - } -} \ No newline at end of file diff --git a/TUnit.Pipeline/Extensions/test.cs b/TUnit.Pipeline/Extensions/test.cs deleted file mode 100644 index 997632273b8..00000000000 --- a/TUnit.Pipeline/Extensions/test.cs +++ /dev/null @@ -1,301 +0,0 @@ -using System; -using CliWrap; -using ModularPipelines.Context; -using ModularPipelines.DotNet.Extensions; -using ModularPipelines.DotNet.Options; -using ModularPipelines.Models; - -namespace TUnit.Pipeline.Extensions; - -/// -/// Custom extensions that suppress output for successful DotNet operations -/// -public static class QuietDotNetExtensions -{ - public static async Task RunQuiet(this IDotNetContext dotNet, DotNetRunOptions options, CancellationToken cancellationToken = default) - { - // Build the command similar to how ModularPipelines does it - var command = Cli.Wrap("dotnet") - .WithArguments(BuildRunArguments(options)) - .WithWorkingDirectory(options.WorkingDirectory ?? Environment.CurrentDirectory); - - if (options.EnvironmentVariables?.Any() == true) - { - command = command.WithEnvironmentVariables(options.EnvironmentVariables); - } - - // Execute with buffered output to suppress streaming to console - var result = await command.ExecuteBufferedAsync(cancellationToken); - - // Only show output if the command failed - if (result.ExitCode != 0) - { - Console.WriteLine(result.StandardOutput); - Console.Error.WriteLine(result.StandardError); - } - - return new CommandResult - { - ExitCode = result.ExitCode, - StandardOutput = result.StandardOutput, - StandardError = result.StandardError, - StartTime = result.StartTime, - ExitTime = result.ExitTime - }; - } - - public static async Task TestQuiet(this IDotNetContext dotNet, DotNetTestOptions options, CancellationToken cancellationToken = default) - { - var command = Cli.Wrap("dotnet") - .WithArguments(BuildTestArguments(options)) - .WithWorkingDirectory(options.WorkingDirectory ?? Environment.CurrentDirectory); - - if (options.EnvironmentVariables?.Any() == true) - { - command = command.WithEnvironmentVariables(options.EnvironmentVariables); - } - - var result = await command.ExecuteBufferedAsync(cancellationToken); - - if (result.ExitCode != 0) - { - Console.WriteLine(result.StandardOutput); - Console.Error.WriteLine(result.StandardError); - } - - return new CommandResult - { - ExitCode = result.ExitCode, - StandardOutput = result.StandardOutput, - StandardError = result.StandardError, - StartTime = result.StartTime, - ExitTime = result.ExitTime - }; - } - - public static async Task PackQuiet(this IDotNetContext dotNet, DotNetPackOptions options, CancellationToken cancellationToken = default) - { - var command = Cli.Wrap("dotnet") - .WithArguments(BuildPackArguments(options)) - .WithWorkingDirectory(options.WorkingDirectory ?? Environment.CurrentDirectory); - - if (options.EnvironmentVariables?.Any() == true) - { - command = command.WithEnvironmentVariables(options.EnvironmentVariables); - } - - var result = await command.ExecuteBufferedAsync(cancellationToken); - - if (result.ExitCode != 0) - { - Console.WriteLine(result.StandardOutput); - Console.Error.WriteLine(result.StandardError); - } - - return new CommandResult - { - ExitCode = result.ExitCode, - StandardOutput = result.StandardOutput, - StandardError = result.StandardError, - StartTime = result.StartTime, - ExitTime = result.ExitTime - }; - } - - public static async Task NewQuiet(this IDotNetContext dotNet, DotNetNewOptions options, CancellationToken cancellationToken = default) - { - var command = Cli.Wrap("dotnet") - .WithArguments(BuildNewArguments(options)) - .WithWorkingDirectory(options.WorkingDirectory ?? Environment.CurrentDirectory); - - if (options.EnvironmentVariables?.Any() == true) - { - command = command.WithEnvironmentVariables(options.EnvironmentVariables); - } - - var result = await command.ExecuteBufferedAsync(cancellationToken); - - if (result.ExitCode != 0 || !options.ThrowOnNonZeroExitCode) - { - Console.WriteLine(result.StandardOutput); - Console.Error.WriteLine(result.StandardError); - } - - return new CommandResult - { - ExitCode = result.ExitCode, - StandardOutput = result.StandardOutput, - StandardError = result.StandardError, - StartTime = result.StartTime, - ExitTime = result.ExitTime - }; - } - - public static async Task NugetAddSourceQuiet(this IDotNetContext dotNet, DotNetNugetAddSourceOptions options, CancellationToken cancellationToken = default) - { - var command = Cli.Wrap("dotnet") - .WithArguments(BuildNugetAddSourceArguments(options)) - .WithWorkingDirectory(options.WorkingDirectory ?? Environment.CurrentDirectory); - - if (options.EnvironmentVariables?.Any() == true) - { - command = command.WithEnvironmentVariables(options.EnvironmentVariables); - } - - var result = await command.ExecuteBufferedAsync(cancellationToken); - - if (result.ExitCode != 0) - { - Console.WriteLine(result.StandardOutput); - Console.Error.WriteLine(result.StandardError); - } - - return new CommandResult - { - ExitCode = result.ExitCode, - StandardOutput = result.StandardOutput, - StandardError = result.StandardError, - StartTime = result.StartTime, - ExitTime = result.ExitTime - }; - } - - public static async Task NugetPushQuiet(this IDotNetContext dotNet, DotNetNugetPushOptions options, CancellationToken cancellationToken = default) - { - var command = Cli.Wrap("dotnet") - .WithArguments(BuildNugetPushArguments(options)) - .WithWorkingDirectory(options.WorkingDirectory ?? Environment.CurrentDirectory); - - if (options.EnvironmentVariables?.Any() == true) - { - command = command.WithEnvironmentVariables(options.EnvironmentVariables); - } - - var result = await command.ExecuteBufferedAsync(cancellationToken); - - if (result.ExitCode != 0) - { - Console.WriteLine(result.StandardOutput); - Console.Error.WriteLine(result.StandardError); - } - - return new CommandResult - { - ExitCode = result.ExitCode, - StandardOutput = result.StandardOutput, - StandardError = result.StandardError, - StartTime = result.StartTime, - ExitTime = result.ExitTime - }; - } - - private static string[] BuildRunArguments(DotNetRunOptions options) - { - var args = new List { "run" }; - - if (!string.IsNullOrEmpty(options.Project)) - args.AddRange(["--project", options.Project]); - - if (options.Configuration.HasValue) - args.AddRange(["--configuration", options.Configuration.Value.ToString()]); - - if (!string.IsNullOrEmpty(options.Framework)) - args.AddRange(["--framework", options.Framework]); - - if (options.NoBuild) - args.Add("--no-build"); - - if (options.Arguments?.Any() == true) - { - args.Add("--"); - args.AddRange(options.Arguments); - } - - return args.ToArray(); - } - - private static string[] BuildTestArguments(DotNetTestOptions options) - { - var args = new List { "test" }; - - if (options.Project != null) - args.Add(options.Project.FullName); - - if (options.Configuration.HasValue) - args.AddRange(["--configuration", options.Configuration.Value.ToString()]); - - if (!string.IsNullOrEmpty(options.Framework)) - args.AddRange(["--framework", options.Framework]); - - if (options.NoBuild) - args.Add("--no-build"); - - return args.ToArray(); - } - - private static string[] BuildPackArguments(DotNetPackOptions options) - { - var args = new List { "pack" }; - - if (options.Project != null) - args.Add(options.Project.FullName); - - if (options.Configuration.HasValue) - args.AddRange(["--configuration", options.Configuration.Value.ToString()]); - - if (options.IncludeSource == true) - args.Add("--include-source"); - - if (options.Properties?.Any() == true) - { - foreach (var prop in options.Properties) - { - args.AddRange(["-p", $"{prop.Key}={prop.Value}"]); - } - } - - return args.ToArray(); - } - - private static string[] BuildNewArguments(DotNetNewOptions options) - { - var args = new List { "new", options.Template }; - - if (!string.IsNullOrEmpty(options.Name)) - args.AddRange(["--name", options.Name]); - - if (options.Arguments?.Any() == true) - args.AddRange(options.Arguments); - - return args.ToArray(); - } - - private static string[] BuildNugetAddSourceArguments(DotNetNugetAddSourceOptions options) - { - var args = new List { "nuget", "add", "source" }; - - if (!string.IsNullOrEmpty(options.Source)) - args.Add(options.Source); - - if (!string.IsNullOrEmpty(options.Name)) - args.AddRange(["--name", options.Name]); - - return args.ToArray(); - } - - private static string[] BuildNugetPushArguments(DotNetNugetPushOptions options) - { - var args = new List { "nuget", "push" }; - - if (options.Package != null) - args.Add(options.Package.FullName); - - if (!string.IsNullOrEmpty(options.Source)) - args.AddRange(["--source", options.Source]); - - if (!string.IsNullOrEmpty(options.ApiKey)) - args.AddRange(["--api-key", options.ApiKey]); - - return args.ToArray(); - } -} \ No newline at end of file diff --git a/TUnit.Pipeline/Modules/Abstract/TestBaseModule.cs b/TUnit.Pipeline/Modules/Abstract/TestBaseModule.cs index 990729b2e26..3fcbe547ca3 100644 --- a/TUnit.Pipeline/Modules/Abstract/TestBaseModule.cs +++ b/TUnit.Pipeline/Modules/Abstract/TestBaseModule.cs @@ -2,9 +2,9 @@ using ModularPipelines.Context; using ModularPipelines.DotNet.Extensions; using ModularPipelines.DotNet.Options; +using ModularPipelines.Enums; using ModularPipelines.Models; using ModularPipelines.Modules; -using TUnit.Pipeline.Extensions; namespace TUnit.Pipeline.Modules.Abstract; @@ -34,7 +34,7 @@ protected virtual IEnumerable TestableFrameworks { var testOptions = SetDefaults(await GetTestOptions(context, framework, cancellationToken)); - return await context.DotNet().RunQuiet(testOptions, cancellationToken); + return await context.DotNet().Run(testOptions, cancellationToken); }); results.Add(testResult); @@ -58,6 +58,12 @@ private DotNetRunOptions SetDefaults(DotNetRunOptions testOptions) }; } + // Suppress output for successful operations, but show errors and basic info + testOptions = testOptions with + { + CommandLogging = CommandLogging.Input | CommandLogging.Error | CommandLogging.Duration | CommandLogging.ExitCode + }; + return testOptions; } diff --git a/TUnit.Pipeline/Modules/AddLocalNuGetRepositoryModule.cs b/TUnit.Pipeline/Modules/AddLocalNuGetRepositoryModule.cs index 75d027f88df..f37d3b3b405 100644 --- a/TUnit.Pipeline/Modules/AddLocalNuGetRepositoryModule.cs +++ b/TUnit.Pipeline/Modules/AddLocalNuGetRepositoryModule.cs @@ -1,9 +1,9 @@ using ModularPipelines.Context; using ModularPipelines.DotNet.Extensions; using ModularPipelines.DotNet.Options; +using ModularPipelines.Enums; using ModularPipelines.FileSystem; using ModularPipelines.Modules; -using TUnit.Pipeline.Extensions; namespace TUnit.Pipeline.Modules; @@ -12,7 +12,10 @@ public class AddLocalNuGetRepositoryModule : Module protected override async Task ExecuteAsync(IPipelineContext context, CancellationToken cancellationToken) { var folder = context.FileSystem.GetFolder(Environment.SpecialFolder.LocalApplicationData).GetFolder("LocalNuget").Create(); - await context.DotNet().NugetAddSourceQuiet(new DotNetNugetAddSourceOptions(folder), cancellationToken); + await context.DotNet().Nuget.Add.Source(new DotNetNugetAddSourceOptions(folder) + { + CommandLogging = CommandLogging.Input | CommandLogging.Error | CommandLogging.Duration | CommandLogging.ExitCode + }, cancellationToken); return folder; } } diff --git a/TUnit.Pipeline/Modules/PackTUnitFilesModule.cs b/TUnit.Pipeline/Modules/PackTUnitFilesModule.cs index b780466b384..5b671c1ee33 100644 --- a/TUnit.Pipeline/Modules/PackTUnitFilesModule.cs +++ b/TUnit.Pipeline/Modules/PackTUnitFilesModule.cs @@ -2,9 +2,9 @@ using ModularPipelines.Context; using ModularPipelines.DotNet.Extensions; using ModularPipelines.DotNet.Options; +using ModularPipelines.Enums; using ModularPipelines.Models; using ModularPipelines.Modules; -using TUnit.Pipeline.Extensions; namespace TUnit.Pipeline.Modules; @@ -28,7 +28,7 @@ public class PackTUnitFilesModule : Module> foreach (var project in projects.Value!) { await context.DotNet() - .PackQuiet( + .Pack( new DotNetPackOptions(project) { Properties = @@ -40,6 +40,7 @@ await context.DotNet() ], IncludeSource = project == Sourcy.DotNet.Projects.TUnit_Templates ? false : true, Configuration = Configuration.Release, + CommandLogging = CommandLogging.Input | CommandLogging.Error | CommandLogging.Duration | CommandLogging.ExitCode }, cancellationToken); packedProjects.Add(new PackedProject(project.NameWithoutExtension, version.SemVer!)); diff --git a/TUnit.Pipeline/Modules/PublishAOTModule.cs b/TUnit.Pipeline/Modules/PublishAOTModule.cs index 76ff827a349..8b5dcf5f782 100644 --- a/TUnit.Pipeline/Modules/PublishAOTModule.cs +++ b/TUnit.Pipeline/Modules/PublishAOTModule.cs @@ -2,6 +2,7 @@ using ModularPipelines.Context; using ModularPipelines.DotNet.Extensions; using ModularPipelines.DotNet.Options; +using ModularPipelines.Enums; using ModularPipelines.Extensions; using ModularPipelines.Git.Extensions; using ModularPipelines.Models; @@ -26,7 +27,8 @@ protected override Task ShouldSkip(IPipelineContext context) Configuration = Configuration.Release, OutputDirectory = "TESTPROJECT_AOT", Properties = [new KeyValue("Aot", "true")], - Framework = "net8.0" + Framework = "net8.0", + CommandLogging = CommandLogging.Input | CommandLogging.Error | CommandLogging.Duration | CommandLogging.ExitCode }, cancellationToken); } diff --git a/TUnit.Pipeline/Modules/PublishSingleFileModule.cs b/TUnit.Pipeline/Modules/PublishSingleFileModule.cs index d80e5429b85..66e7efdcbac 100644 --- a/TUnit.Pipeline/Modules/PublishSingleFileModule.cs +++ b/TUnit.Pipeline/Modules/PublishSingleFileModule.cs @@ -3,6 +3,7 @@ using ModularPipelines.Context; using ModularPipelines.DotNet.Extensions; using ModularPipelines.DotNet.Options; +using ModularPipelines.Enums; using ModularPipelines.Extensions; using ModularPipelines.Git.Extensions; using ModularPipelines.Models; @@ -28,7 +29,8 @@ protected override Task ShouldSkip(IPipelineContext context) Configuration = Configuration.Release, OutputDirectory = "TESTPROJECT_SINGLEFILE", Properties = [new KeyValue("SingleFile", "true")], - Framework = "net8.0" + Framework = "net8.0", + CommandLogging = CommandLogging.Input | CommandLogging.Error | CommandLogging.Duration | CommandLogging.ExitCode }, cancellationToken); } diff --git a/TUnit.Pipeline/Modules/RunAnalyzersTestsModule.cs b/TUnit.Pipeline/Modules/RunAnalyzersTestsModule.cs index 32d0aef6e84..bc4c97084be 100644 --- a/TUnit.Pipeline/Modules/RunAnalyzersTestsModule.cs +++ b/TUnit.Pipeline/Modules/RunAnalyzersTestsModule.cs @@ -2,11 +2,11 @@ using ModularPipelines.Context; using ModularPipelines.DotNet.Extensions; using ModularPipelines.DotNet.Options; +using ModularPipelines.Enums; using ModularPipelines.Extensions; using ModularPipelines.Git.Extensions; using ModularPipelines.Models; using ModularPipelines.Modules; -using TUnit.Pipeline.Extensions; namespace TUnit.Pipeline.Modules; @@ -17,7 +17,7 @@ public class RunAnalyzersTestsModule : Module { var project = context.Git().RootDirectory.FindFile(x => x.Name == "TUnit.Analyzers.Tests.csproj").AssertExists(); - return await context.DotNet().TestQuiet(new DotNetTestOptions(project) + return await context.DotNet().Test(new DotNetTestOptions(project) { NoBuild = true, Configuration = Configuration.Release, @@ -25,7 +25,8 @@ public class RunAnalyzersTestsModule : Module EnvironmentVariables = new Dictionary { ["DISABLE_GITHUB_REPORTER"] = "true", - } + }, + CommandLogging = CommandLogging.Input | CommandLogging.Error | CommandLogging.Duration | CommandLogging.ExitCode }, cancellationToken); } } diff --git a/TUnit.Pipeline/Modules/RunAspNetTestsModule.cs b/TUnit.Pipeline/Modules/RunAspNetTestsModule.cs index c31dc2e6966..07329fa78e7 100644 --- a/TUnit.Pipeline/Modules/RunAspNetTestsModule.cs +++ b/TUnit.Pipeline/Modules/RunAspNetTestsModule.cs @@ -2,11 +2,11 @@ using ModularPipelines.Context; using ModularPipelines.DotNet.Extensions; using ModularPipelines.DotNet.Options; +using ModularPipelines.Enums; using ModularPipelines.Extensions; using ModularPipelines.Git.Extensions; using ModularPipelines.Models; using ModularPipelines.Modules; -using TUnit.Pipeline.Extensions; namespace TUnit.Pipeline.Modules; @@ -17,7 +17,7 @@ public class RunAspNetTestsModule : Module { var project = context.Git().RootDirectory.FindFile(x => x.Name == "TUnit.Example.Asp.Net.TestProject.csproj").AssertExists(); - return await context.DotNet().RunQuiet(new DotNetRunOptions + return await context.DotNet().Run(new DotNetRunOptions { Project = project.Name, NoBuild = true, @@ -28,7 +28,8 @@ public class RunAspNetTestsModule : Module EnvironmentVariables = new Dictionary { ["DISABLE_GITHUB_REPORTER"] = "true", - } + }, + CommandLogging = CommandLogging.Input | CommandLogging.Error | CommandLogging.Duration | CommandLogging.ExitCode }, cancellationToken); } } diff --git a/TUnit.Pipeline/Modules/RunAssertionsAnalyzersTestsModule.cs b/TUnit.Pipeline/Modules/RunAssertionsAnalyzersTestsModule.cs index 22da0a501e0..4c2272812e3 100644 --- a/TUnit.Pipeline/Modules/RunAssertionsAnalyzersTestsModule.cs +++ b/TUnit.Pipeline/Modules/RunAssertionsAnalyzersTestsModule.cs @@ -2,11 +2,11 @@ using ModularPipelines.Context; using ModularPipelines.DotNet.Extensions; using ModularPipelines.DotNet.Options; +using ModularPipelines.Enums; using ModularPipelines.Extensions; using ModularPipelines.Git.Extensions; using ModularPipelines.Models; using ModularPipelines.Modules; -using TUnit.Pipeline.Extensions; namespace TUnit.Pipeline.Modules; @@ -17,7 +17,7 @@ public class RunAssertionsAnalyzersTestsModule : Module { var project = context.Git().RootDirectory.FindFile(x => x.Name == "TUnit.Assertions.Analyzers.Tests.csproj").AssertExists(); - return await context.DotNet().TestQuiet(new DotNetTestOptions(project) + return await context.DotNet().Test(new DotNetTestOptions(project) { NoBuild = true, Configuration = Configuration.Release, @@ -25,7 +25,8 @@ public class RunAssertionsAnalyzersTestsModule : Module EnvironmentVariables = new Dictionary { ["DISABLE_GITHUB_REPORTER"] = "true", - } + }, + CommandLogging = CommandLogging.Input | CommandLogging.Error | CommandLogging.Duration | CommandLogging.ExitCode }, cancellationToken); } } diff --git a/TUnit.Pipeline/Modules/RunAssertionsCodeFixersTestsModule.cs b/TUnit.Pipeline/Modules/RunAssertionsCodeFixersTestsModule.cs index e81edc6c97c..12dc0a08964 100644 --- a/TUnit.Pipeline/Modules/RunAssertionsCodeFixersTestsModule.cs +++ b/TUnit.Pipeline/Modules/RunAssertionsCodeFixersTestsModule.cs @@ -2,11 +2,11 @@ using ModularPipelines.Context; using ModularPipelines.DotNet.Extensions; using ModularPipelines.DotNet.Options; +using ModularPipelines.Enums; using ModularPipelines.Extensions; using ModularPipelines.Git.Extensions; using ModularPipelines.Models; using ModularPipelines.Modules; -using TUnit.Pipeline.Extensions; namespace TUnit.Pipeline.Modules; @@ -17,7 +17,7 @@ public class RunAssertionsCodeFixersTestsModule : Module { var project = context.Git().RootDirectory.FindFile(x => x.Name == "TUnit.Assertions.Analyzers.CodeFixers.Tests.csproj").AssertExists(); - return await context.DotNet().TestQuiet(new DotNetTestOptions(project) + return await context.DotNet().Test(new DotNetTestOptions(project) { NoBuild = true, Configuration = Configuration.Release, @@ -25,7 +25,8 @@ public class RunAssertionsCodeFixersTestsModule : Module EnvironmentVariables = new Dictionary { ["DISABLE_GITHUB_REPORTER"] = "true", - } + }, + CommandLogging = CommandLogging.Input | CommandLogging.Error | CommandLogging.Duration | CommandLogging.ExitCode }, cancellationToken); } } diff --git a/TUnit.Pipeline/Modules/RunEngineTestsModule.cs b/TUnit.Pipeline/Modules/RunEngineTestsModule.cs index 715d460076c..43f61a048ed 100644 --- a/TUnit.Pipeline/Modules/RunEngineTestsModule.cs +++ b/TUnit.Pipeline/Modules/RunEngineTestsModule.cs @@ -2,11 +2,11 @@ using ModularPipelines.Context; using ModularPipelines.DotNet.Extensions; using ModularPipelines.DotNet.Options; +using ModularPipelines.Enums; using ModularPipelines.Extensions; using ModularPipelines.Git.Extensions; using ModularPipelines.Models; using ModularPipelines.Modules; -using TUnit.Pipeline.Extensions; namespace TUnit.Pipeline.Modules; @@ -30,7 +30,7 @@ public class RunEngineTestsModule : Module { var project = context.Git().RootDirectory.FindFile(x => x.Name == "TUnit.Engine.Tests.csproj").AssertExists(); - return await context.DotNet().RunQuiet(new DotNetRunOptions + return await context.DotNet().Run(new DotNetRunOptions { Project = project.Name, NoBuild = true, @@ -45,7 +45,8 @@ public class RunEngineTestsModule : Module EnvironmentVariables = new Dictionary { ["TUNIT_DISABLE_GITHUB_REPORTER"] = "true", - } + }, + CommandLogging = CommandLogging.Input | CommandLogging.Error | CommandLogging.Duration | CommandLogging.ExitCode }, cancellationToken); } } diff --git a/TUnit.Pipeline/Modules/RunTemplateTestsModule.cs b/TUnit.Pipeline/Modules/RunTemplateTestsModule.cs index b7197a60437..0a120c8864c 100644 --- a/TUnit.Pipeline/Modules/RunTemplateTestsModule.cs +++ b/TUnit.Pipeline/Modules/RunTemplateTestsModule.cs @@ -2,11 +2,11 @@ using ModularPipelines.Context; using ModularPipelines.DotNet.Extensions; using ModularPipelines.DotNet.Options; +using ModularPipelines.Enums; using ModularPipelines.Extensions; using ModularPipelines.Git.Extensions; using ModularPipelines.Models; using ModularPipelines.Modules; -using TUnit.Pipeline.Extensions; namespace TUnit.Pipeline.Modules; @@ -17,7 +17,7 @@ public class RunTemplateTestsModule : Module { var project = context.Git().RootDirectory.FindFile(x => x.Name == "TUnit.Templates.Tests.csproj").AssertExists(); - return await context.DotNet().TestQuiet(new DotNetTestOptions(project) + return await context.DotNet().Test(new DotNetTestOptions(project) { NoBuild = true, Configuration = Configuration.Release, @@ -25,7 +25,8 @@ public class RunTemplateTestsModule : Module EnvironmentVariables = new Dictionary { ["DISABLE_GITHUB_REPORTER"] = "true", - } + }, + CommandLogging = CommandLogging.Input | CommandLogging.Error | CommandLogging.Duration | CommandLogging.ExitCode }, cancellationToken); } } diff --git a/TUnit.Pipeline/Modules/TestTemplatePackageModule.cs b/TUnit.Pipeline/Modules/TestTemplatePackageModule.cs index f5078165c3e..774a2107c5d 100644 --- a/TUnit.Pipeline/Modules/TestTemplatePackageModule.cs +++ b/TUnit.Pipeline/Modules/TestTemplatePackageModule.cs @@ -2,9 +2,9 @@ using ModularPipelines.Context; using ModularPipelines.DotNet.Extensions; using ModularPipelines.DotNet.Options; +using ModularPipelines.Enums; using ModularPipelines.Models; using ModularPipelines.Modules; -using TUnit.Pipeline.Extensions; namespace TUnit.Pipeline.Modules; @@ -17,30 +17,35 @@ public class TestTemplatePackageModule : Module { var version = await GetModule(); - await context.DotNet().NewQuiet(new DotNetNewOptions("uninstall") + await context.DotNet().New(new DotNetNewOptions("uninstall") { Arguments = ["TUnit.Templates"], - ThrowOnNonZeroExitCode = false + ThrowOnNonZeroExitCode = false, + CommandLogging = CommandLogging.Input | CommandLogging.Error | CommandLogging.Duration | CommandLogging.ExitCode }, cancellationToken); - await context.DotNet().NewQuiet(new DotNetNewOptions("install") + await context.DotNet().New(new DotNetNewOptions("install") { - Arguments = [$"TUnit.Templates::{version.Value!.SemVer}"] + Arguments = [$"TUnit.Templates::{version.Value!.SemVer}"], + CommandLogging = CommandLogging.Input | CommandLogging.Error | CommandLogging.Duration | CommandLogging.ExitCode }, cancellationToken); - await context.DotNet().NewQuiet(new DotNetNewOptions("TUnit") + await context.DotNet().New(new DotNetNewOptions("TUnit") { - Name = "MyTestProject" + Name = "MyTestProject", + CommandLogging = CommandLogging.Input | CommandLogging.Error | CommandLogging.Duration | CommandLogging.ExitCode }, cancellationToken); - await context.DotNet().NewQuiet(new DotNetNewOptions("TUnit.AspNet") + await context.DotNet().New(new DotNetNewOptions("TUnit.AspNet") { - Name = "MyTestProject2" + Name = "MyTestProject2", + CommandLogging = CommandLogging.Input | CommandLogging.Error | CommandLogging.Duration | CommandLogging.ExitCode }, cancellationToken); - return await context.DotNet().NewQuiet(new DotNetNewOptions("TUnit.Playwright") + return await context.DotNet().New(new DotNetNewOptions("TUnit.Playwright") { - Name = "MyTestProject3" + Name = "MyTestProject3", + CommandLogging = CommandLogging.Input | CommandLogging.Error | CommandLogging.Duration | CommandLogging.ExitCode }, cancellationToken); } } diff --git a/TUnit.Pipeline/Modules/UploadToNuGetModule.cs b/TUnit.Pipeline/Modules/UploadToNuGetModule.cs index 2af854496a0..4d4cbb932c0 100644 --- a/TUnit.Pipeline/Modules/UploadToNuGetModule.cs +++ b/TUnit.Pipeline/Modules/UploadToNuGetModule.cs @@ -4,11 +4,11 @@ using ModularPipelines.Context; using ModularPipelines.DotNet.Extensions; using ModularPipelines.DotNet.Options; +using ModularPipelines.Enums; using ModularPipelines.Git.Attributes; using ModularPipelines.Git.Extensions; using ModularPipelines.Models; using ModularPipelines.Modules; -using TUnit.Pipeline.Extensions; namespace TUnit.Pipeline.Modules; @@ -41,10 +41,11 @@ protected override Task ShouldSkip(IPipelineContext context) .GetFiles(x => x.Extension is ".nupkg"); return await nupkgs.SelectAsync(file => - context.DotNet().NugetPushQuiet(new DotNetNugetPushOptions(file) + context.DotNet().Nuget.Push(new DotNetNugetPushOptions(file) { Source = "https://api.nuget.org/v3/index.json", - ApiKey = options.Value.ApiKey + ApiKey = options.Value.ApiKey, + CommandLogging = CommandLogging.Input | CommandLogging.Error | CommandLogging.Duration | CommandLogging.ExitCode }, cancellationToken), cancellationToken: cancellationToken) .ProcessOneAtATime(); } diff --git a/TUnit.Pipeline/Program.cs b/TUnit.Pipeline/Program.cs index 64887826b61..c0de1bb942b 100644 --- a/TUnit.Pipeline/Program.cs +++ b/TUnit.Pipeline/Program.cs @@ -1,7 +1,6 @@ using System.CommandLine; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; using ModularPipelines.Extensions; using ModularPipelines.Host; using ModularPipelines.Options; @@ -31,13 +30,6 @@ collection.Configure(context.Configuration.GetSection("NuGet")); collection.AddModulesFromAssembly(typeof(Program).Assembly); }) - .ConfigureLogging(logging => - { - // Reduce ModularPipelines framework output - logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Warning); - logging.AddFilter("ModularPipelines", Microsoft.Extensions.Logging.LogLevel.Warning); - logging.AddConsole(); - }) .ConfigurePipelineOptions((_, options) => options.ExecutionMode = ExecutionMode.WaitForAllModules); if (categories.Length > 0) diff --git a/TUnit.Pipeline/TUnit.Pipeline.csproj b/TUnit.Pipeline/TUnit.Pipeline.csproj index 1a759b70077..959473ebe0b 100644 --- a/TUnit.Pipeline/TUnit.Pipeline.csproj +++ b/TUnit.Pipeline/TUnit.Pipeline.csproj @@ -17,6 +17,5 @@ - From 8e4dcaec548455544e5e7f9d9071c131cbc801b1 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Fri, 8 Aug 2025 10:22:46 +0100 Subject: [PATCH 7/7] feat: add dynamic build configuration based on CI environment --- TUnit.Engine.Tests/GlobalHooks.cs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/TUnit.Engine.Tests/GlobalHooks.cs b/TUnit.Engine.Tests/GlobalHooks.cs index ea0e498fd24..939b43dea5c 100644 --- a/TUnit.Engine.Tests/GlobalHooks.cs +++ b/TUnit.Engine.Tests/GlobalHooks.cs @@ -1,4 +1,6 @@ -namespace TUnit.Engine.Tests; +using CliWrap.Buffered; + +namespace TUnit.Engine.Tests; public class GlobalHooks { @@ -6,7 +8,7 @@ public class GlobalHooks public static async Task BuildTestProject() { var result = await CliWrap.Cli.Wrap("dotnet") - .WithArguments(["build", "-c", "Release"]) + .WithArguments(["build", "-c", GetConfiguration(), "--no-restore"]) .WithWorkingDirectory(FileSystemHelpers.FindFile(x => x.Name == "TUnit.TestProject.csproj")!.DirectoryName!) .WithValidation(CliWrap.CommandResultValidation.None) .ExecuteBufferedAsync(); @@ -19,4 +21,12 @@ public static async Task BuildTestProject() throw new InvalidOperationException($"Build failed with exit code {result.ExitCode}"); } } + + private static string GetConfiguration() + { + var isCi = Environment.GetEnvironmentVariable("GITHUB_ACTIONS") == "true" || + Environment.GetEnvironmentVariable("CI") == "true"; + + return isCi ? "Release" : "Debug"; + } }