From f48ade4ed520450d7377e4f27fba72bb480beec2 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 3 Oct 2018 19:59:46 +0100 Subject: [PATCH] add cake script to build managed side. --- .gitignore | 9 +-- azure-pipelines.yml | 12 ++++ build.cake | 144 ++++++++++++++++++++++++++++++++++++++++++++ parameters.cake | 69 +++++++++++++++++++++ 4 files changed, 230 insertions(+), 4 deletions(-) create mode 100644 build.cake create mode 100644 parameters.cake diff --git a/.gitignore b/.gitignore index 2695f2a71e..9caef6f3fd 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ [Bb]in/ packages/ TestResults/ +artifacts/ # globs Makefile.in @@ -39,7 +40,7 @@ Thumbs.db # dotCover *.dotCover - -src/Avalonia\.Native\.OSX/Avalonia\.Native\.OSX\.xcodeproj/project\.xcworkspace/xcshareddata/IDEWorkspaceChecks\.plist - -src/Avalonia\.Native\.OSX/Avalonia\.Native\.OSX\.xcodeproj/project\.xcworkspace/xcshareddata/WorkspaceSettings\.xcsettings + +src/Avalonia\.Native\.OSX/Avalonia\.Native\.OSX\.xcodeproj/project\.xcworkspace/xcshareddata/IDEWorkspaceChecks\.plist + +src/Avalonia\.Native\.OSX/Avalonia\.Native\.OSX\.xcodeproj/project\.xcworkspace/xcshareddata/WorkspaceSettings\.xcsettings diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 6794b9f2fe..b0182e0c9a 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -12,3 +12,15 @@ steps: configuration: 'Release' xcWorkspacePath: '**/*.xcodeproj/project.xcworkspace' xcodeVersion: 'default' # Options: 8, 9, default, specifyPath +- task: DotNetCoreInstaller@0 + inputs: + version: '2.1.401' +- script: | + export COREHOST_TRACE=0 + export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 + export DOTNET_CLI_TELEMETRY_OPTOUT=1 + which dotnet + dotnet --info + dotnet tool install -g Cake.Tool --version 0.30.0 + export PATH="$PATH:$HOME/.dotnet/tools" + dotnet cake build.cake -Target="Azure-Linux" -Platform="Any CPU" -Configuration="Release" diff --git a/build.cake b/build.cake new file mode 100644 index 0000000000..8b4ee5cfd8 --- /dev/null +++ b/build.cake @@ -0,0 +1,144 @@ +#load "./parameters.cake" + +Setup(context => +{ + Information("Running tasks..."); + return new Parameters(context); +}); + +Teardown((context, parameters) => +{ + Information("Finished running tasks."); +}); + +Task("Clean") + .Does(parameters => +{ + foreach(var project in parameters.BuildProjects) + { + (string path, string name) = project; + Information($"Clean: {name}"); + DotNetCoreClean($"{path}/{name}/{name}.csproj", new DotNetCoreCleanSettings { + Configuration = parameters.Configuration, + Verbosity = DotNetCoreVerbosity.Minimal + }); + } +}); + +Task("Build") + .Does(parameters => +{ + foreach(var project in parameters.BuildProjects) + { + (string path, string name) = project; + Information($"Build: {name}"); + DotNetCoreBuild($"{path}/{name}/{name}.csproj", new DotNetCoreBuildSettings { + Configuration = parameters.Configuration, + VersionSuffix = parameters.VersionSuffix + }); + } +}); + +Task("Test") + .Does(parameters => +{ + foreach(var project in parameters.TestProjects) + { + (string path, string name) = project; + Information($"Test: {name}"); + DotNetCoreTest($"{path}/{name}/{name}.csproj", new DotNetCoreTestSettings { + Configuration = parameters.Configuration + }); + } +}); + +Task("Publish") + .Does(parameters => +{ + CleanDirectory($"{parameters.Artifacts}/zip"); + var redistVersion = "14.15.26706"; + var redistPath = $"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Redist\\MSVC\\{redistVersion}\\x64\\Microsoft.VC141.CRT\\"; + var redistRuntime = "win7-x64"; + foreach(var project in parameters.PublishProjects) + { + (string path, string name, string framework, string runtime) = project; + var output = $"./{parameters.Artifacts}/publish/{name}-{framework}-{runtime}"; + Information($"Publish: {name}, {framework}, {runtime}"); + DotNetCorePublish($"{path}/{name}/{name}.csproj", new DotNetCorePublishSettings { + Configuration = parameters.Configuration, + VersionSuffix = parameters.VersionSuffix, + Framework = framework, + Runtime = runtime, + OutputDirectory = output + }); + if (string.Compare(runtime, redistRuntime, StringComparison.OrdinalIgnoreCase) == 0) + { + CopyFileToDirectory($"{redistPath}msvcp140.dll", output); + CopyFileToDirectory($"{redistPath}vcruntime140.dll", output); + } + Zip($"{parameters.Artifacts}/publish/{name}-{framework}-{runtime}", $"{parameters.Artifacts}/zip/{name}-{framework}-{runtime}.zip"); + } +}); + +Task("Pack") + .Does(parameters => +{ + CleanDirectory($"{parameters.Artifacts}/nuget"); + foreach(var project in parameters.PackProjects) + { + (string path, string name) = project; + Information($"Pack: {name}"); + DotNetCorePack($"{path}/{name}/{name}.csproj", new DotNetCorePackSettings { + Configuration = parameters.Configuration, + VersionSuffix = parameters.VersionSuffix, + OutputDirectory = $"{parameters.Artifacts}/nuget" + }); + } +}); + +Task("Push") + .WithCriteria((context, parameters) => parameters.PushNuGet) + .Does(parameters => +{ + var apiKey = EnvironmentVariable(parameters.IsNugetRelease ? "NUGET_API_KEY" : "MYGET_API_KEY"); + var apiUrl = EnvironmentVariable(parameters.IsNugetRelease ? "NUGET_API_URL" : "MYGET_API_URL"); + var packages = GetFiles($"{parameters.Artifacts}/nuget/*.nupkg"); + foreach (var package in packages) + { + DotNetCoreNuGetPush(package.FullPath, new DotNetCoreNuGetPushSettings { + Source = apiUrl, + ApiKey = apiKey + }); + } +}); + +Task("Default") + .IsDependentOn("Build"); + +Task("AppVeyor") + .IsDependentOn("Clean") + .IsDependentOn("Build") + .IsDependentOn("Test") + .IsDependentOn("Publish") + .IsDependentOn("Pack") + .IsDependentOn("Push"); + +Task("Travis") + .IsDependentOn("Test"); + +Task("CircleCI") + .IsDependentOn("Test"); + +Task("Azure") + .IsDependentOn("Clean") + .IsDependentOn("Build") + .IsDependentOn("Pack") + .IsDependentOn("Push"); + +Task("Azure-macOS") + .IsDependentOn("Test"); + +Task("Azure-Linux") + .IsDependentOn("Test"); + +RunTarget(Context.Argument("target", "Default")); \ No newline at end of file diff --git a/parameters.cake b/parameters.cake new file mode 100644 index 0000000000..1dd1b85375 --- /dev/null +++ b/parameters.cake @@ -0,0 +1,69 @@ + +public class Parameters +{ + public string Configuration { get; private set; } + public string Artifacts { get; private set; } + public string VersionSuffix { get; private set; } + public string NuGetPushBranch { get; private set; } + public string NuGetPushRepoName { get; private set; } + public bool PushNuGet { get; private set; } + public bool IsNugetRelease { get; private set; } + public (string path, string name)[] BuildProjects { get; private set; } + public (string path, string name)[] TestProjects { get; private set; } + public (string path, string name, string framework, string runtime)[] PublishProjects { get; private set; } + public (string path, string name)[] PackProjects { get; private set; } + + public Parameters(ICakeContext context) + { + Configuration = context.Argument("configuration", "Release"); + Artifacts = context.Argument("artifacts", "./artifacts"); + + VersionSuffix = context.Argument("suffix", default(string)); + if (VersionSuffix == null) + { + var build = context.EnvironmentVariable("APPVEYOR_BUILD_VERSION"); + VersionSuffix = build != null ? $"-build{build}" : ""; + } + + NuGetPushBranch = "master"; + NuGetPushRepoName = "AvaloniaUI/Avalonia.Native"; + + var repoName = context.EnvironmentVariable("APPVEYOR_REPO_NAME"); + var repoBranch = context.EnvironmentVariable("APPVEYOR_REPO_BRANCH"); + var repoTag = context.EnvironmentVariable("APPVEYOR_REPO_TAG"); + var repoTagName = context.EnvironmentVariable("APPVEYOR_REPO_TAG_NAME"); + var pullRequestTitle = context.EnvironmentVariable("APPVEYOR_PULL_REQUEST_TITLE"); + + if (pullRequestTitle == null + && string.Compare(repoName, NuGetPushRepoName, StringComparison.OrdinalIgnoreCase) == 0 + && string.Compare(repoBranch, NuGetPushBranch, StringComparison.OrdinalIgnoreCase) == 0) + { + PushNuGet = true; + } + + if (pullRequestTitle == null + && string.Compare(repoTag, "True", StringComparison.OrdinalIgnoreCase) == 0 + && repoTagName != null) + { + IsNugetRelease = true; + } + + BuildProjects = new [] + { + ( "./src", "Avalonia.Native" ) + }; + + TestProjects = new (string path, string name) [] + { + }; + + PublishProjects = new (string path, string name, string framework, string runtime) [] + { + }; + + PackProjects = new [] + { + ( "./src", "Avalonia.Native" ) + }; + } +} \ No newline at end of file