// Usings using System.Xml; using System.Xml.Linq; using System.Xml.XPath; // Arguments var target = Argument("target", "Default"); var source = Argument("source", null); var apiKey = Argument("apikey", null); var releaseNote = ParseReleaseNotes("./RELEASE_NOTES.md"); var buildNumber = EnvironmentVariable("BUILD_NUMBER") ?? "0"; var version = Argument("targetversion", $"{releaseNote.Version}.{buildNumber}-beta"); var skipClean = Argument("skipclean", false); var skipTests = Argument("skiptests", false); var nogit = Argument("nogit", false); var config = Argument("configuration", "Release"); // Variables var configuration = IsRunningOnWindows() ? config : "MonoRelease"; var csProjectFiles = GetFiles("./src/**/*.csproj"); // Directories var nuget = Directory("tools"); var output = Directory("build"); var outputBinaries = output + Directory("binaries"); var outputBinariesNet = outputBinaries + Directory("net472"); var outputBinariesNetStandard = outputBinaries + Directory("netstandard2.0"); var outputBinariesNet6 = outputBinaries + Directory("net6.0"); var outputBinariesNet8 = outputBinaries + Directory("net8.0"); var outputPackages = output + Directory("packages"); var outputNuGet = output + Directory("nuget"); var outputPerfResults = Directory("perfResults"); /////////////////////////////////////////////////////////////// Task("Clean") .Does(() => { // Clean artifact directories. CleanDirectories(new DirectoryPath[] { output, outputBinaries, outputPackages, outputNuGet, outputBinariesNet, outputBinariesNetStandard, outputBinariesNet6, outputBinariesNet8 }); if(!skipClean) { // Clean output directories. CleanDirectories("./**/bin/" + configuration); CleanDirectories("./**/obj/" + configuration); } }); Task("Restore-NuGet-Packages") .Description("Restores dependencies") .Does(() => { DotNetCoreRestore(); int result = StartProcess("dotnet", new ProcessSettings { Arguments = "restore -r win-x64" } ); if (result != 0) { throw new CakeException($"Restore failed."); } }); Task("Compile") .Description("Builds the solution") .IsDependentOn("Clean") .IsDependentOn("Restore-NuGet-Packages") .Does(() => { int result = StartProcess("dotnet", new ProcessSettings { Arguments = "msbuild DotNetty.sln /p:Configuration=" + configuration } ); if (result != 0) { throw new CakeException($"Compilation failed."); } }); Task("Test") .Description("Executes xUnit tests") .WithCriteria(!skipTests) .IsDependentOn("Compile") .Does(() => { var projects = GetFiles("./test/**/*.csproj") - GetFiles("./test/**/*.Microbench.csproj") - GetFiles("./test/**/*.Performance.csproj"); foreach(var project in projects) { DotNetCoreTest(project.FullPath, new DotNetCoreTestSettings { Configuration = configuration//, //Verbose = false }); // if (IsRunningOnWindows()) // { // DotNetCoreTest(project.GetDirectory().FullPath, new DotNetCoreTestSettings { // Configuration = configuration // }); // } // else // { // // For when test projects are set to run against netstandard // // DotNetCoreTest(project.GetDirectory().FullPath, new DotNetCoreTestSettings { // // Configuration = configuration, // // Framework = "netstandard1.3", // // Runtime = "unix-64" // // }); // var dirPath = project.GetDirectory().FullPath; // var testFile = project.GetFilenameWithoutExtension(); // using(var process = StartAndReturnProcess("mono", new ProcessSettings{Arguments = // dirPath + "/bin/" + configuration + "/net451/unix-x64/dotnet-test-xunit.exe" + " " + // dirPath + "/bin/" + configuration + "/net451/unix-x64/" + testFile + ".dll"})) // { // process.WaitForExit(); // if (process.GetExitCode() != 0) // { // throw new Exception("Mono tests failed"); // } // } // } } }); Task("Package-NuGet") .Description("Generates NuGet packages for each project that contains a nuspec") .Does(() => { var settings = new DotNetCorePackSettings { Configuration = configuration, OutputDirectory = outputNuGet, ArgumentCustomization = args => args.Append("--include-symbols").Append("-s").Append("--no-build") }; foreach(var project in csProjectFiles) { DotNetCorePack(project.GetDirectory().FullPath, settings); } }); Task("Publish-NuGet") .Description("Pushes the nuget packages in the nuget folder to a NuGet source. Also publishes the packages into the feeds.") .Does(() => { // Make sure we have an API key. if(string.IsNullOrWhiteSpace(apiKey)){ throw new CakeException("No NuGet API key provided."); } // Upload every package to the provided NuGet source (defaults to nuget.org). var packages = GetFiles(outputNuGet.Path.FullPath + "/*" + version + ".nupkg"); foreach(var package in packages) { NuGetPush(package, new NuGetPushSettings { ToolPath = "tools/nuget.exe", Source = source, ApiKey = apiKey, Verbosity = NuGetVerbosity.Detailed }); } }); /////////////////////////////////////////////////////////////// Task("Benchmark") .Description("Runs benchmarks") .IsDependentOn("Compile") .Does(() => { StartProcess(nuget.ToString() + "/nuget.exe", "install NBench.Runner -OutputDirectory tools -ExcludeVersion -Version 1.0.0"); var libraries = GetFiles("./test/**/bin/" + configuration + "/net472/*.Performance.dll"); CreateDirectory(outputPerfResults); foreach (var lib in libraries) { Information("Using NBench.Runner: {0}", lib); // Make sure libuv.dll exists in performance test folder CopyFiles("./test/DotNetty.Transport.Libuv.Tests/bin/" + configuration + "/net472/win-x64/libuv.dll", lib.GetDirectory(), false); CopyFiles("./tools/NBench.Runner*/**/NBench.Runner.exe", lib.GetDirectory(), false); var nbenchArgs = new StringBuilder() .Append(" " + lib) .Append($" output-directory=\"{outputPerfResults}\"") .Append(" concurrent=\"true\""); int result = StartProcess(lib.GetDirectory().FullPath + "\\NBench.Runner.exe", new ProcessSettings { Arguments = nbenchArgs.ToString(), WorkingDirectory = lib.GetDirectory() }); if (result != 0) { throw new CakeException($"NBench.Runner failed. {nbenchArgs}"); } } }); /////////////////////////////////////////////////////////////// Task("Tag") .Description("Tags the current release.") .Does(() => { StartProcess("git", new ProcessSettings { Arguments = string.Format("tag \"v{0}\"", version) }); }); Task("Prepare-Release") .Does(() => { // Update version. UpdateCsProjectVersion(version, csProjectFiles); // Add foreach (var file in csProjectFiles) { if (nogit) { Information("git " + string.Format("add {0}", file.FullPath)); } else { StartProcess("git", new ProcessSettings { Arguments = string.Format("add {0}", file.FullPath) }); } } // Commit if (nogit) { Information("git " + string.Format("commit -m \"Updated version to {0}\"", version)); } else { StartProcess("git", new ProcessSettings { Arguments = string.Format("commit -m \"Updated version to {0}\"", version) }); } // Tag if (nogit) { Information("git " + string.Format("tag \"v{0}\"", version)); } else { StartProcess("git", new ProcessSettings { Arguments = string.Format("tag \"v{0}\"", version) }); } //Push if (nogit) { Information("git push origin master"); Information("git push --tags"); } else { StartProcess("git", new ProcessSettings { Arguments = "push origin master" }); StartProcess("git", new ProcessSettings { Arguments = "push --tags" }); } }); Task("Update-Version") .Does(() => { if(string.IsNullOrWhiteSpace(version)) { throw new CakeException("No version specified!"); } CreateAssemblyInfo("src/shared/SharedAssemblyInfo.cs", new AssemblyInfoSettings { Product = "DotNetty", Company = "Microsoft", Version = version, FileVersion = version, Copyright = string.Format("(c) Microsoft 2015 - {0}", DateTime.Now.Year) }); UpdateCsProjectVersion(version, csProjectFiles); }); /////////////////////////////////////////////////////////////// public void UpdateCsProjectVersion(string version, FilePathCollection filePaths) { Verbose(logAction => logAction("Setting version to {0}", version)); foreach (var file in filePaths) { XmlPoke(file, "//PropertyGroup/VersionPrefix", version); } } Task("Default") .IsDependentOn("Test") //.IsDependentOn("Update-Version") .IsDependentOn("Package-NuGet"); Task("Mono") .IsDependentOn("Test"); Task("PR") //.IsDependentOn("Update-Version") .IsDependentOn("Test") //.IsDependentOn("Benchmark") .IsDependentOn("Package-NuGet"); Task("Nightly") .IsDependentOn("Update-Version") .IsDependentOn("Compile") .IsDependentOn("Package-NuGet"); /////////////////////////////////////////////////////////////// RunTarget(target);