csharp-sdk/build.cake
Toni Wenzel 80daa5b73d
Add ci build workflow (#31)
* Add ci build workflow

* Using cake build

* Update readme
2025-03-06 20:49:59 +01:00

179 lines
No EOL
5.6 KiB
C#

#tool "dotnet:?package=GitVersion.Tool&version=6.1.0"
#tool "nuget:?package=dotnet-sonarscanner&version=9.2.1"
#addin "nuget:?package=Cake.Sonar&version=1.1.33"
var target = Argument("target", "Default");
var sonarLoginToken = Argument("sonarLogin", EnvironmentVariable("SONAR_LOGIN") ?? "");
var nugetApiKey = Argument("nugetApiKey", EnvironmentVariable("NUGET_API_KEY") ?? "");
//////////////////////////////////////////////////////////////////////
// Build Variables
/////////////////////////////////////////////////////////////////////
var solution = "./mcpdotnet.sln";
var project = "./src/mcpdotnet.csproj";
var outputDir = MakeAbsolute(Directory("./buildArtifacts/"));
var outputDirNuget = outputDir.Combine("NuGet");
var sonarProjectKey = "PederHP_mcpdotnet";
var sonarUrl = "https://sonarcloud.io";
var sonarOrganization = "pederhp";
var outputDirTemp = outputDir.Combine("Temp");
var outputDirTests = outputDirTemp.Combine("Tests");
var codeCoverageResultFilePath = MakeAbsolute(outputDirTests).Combine("**/").CombineWithFilePath("coverage.opencover.xml");
var testResultsPath = MakeAbsolute(outputDirTests).CombineWithFilePath("*.trx");
var nugetPublishFeed = "https://api.nuget.org/v3/index.json";
var isLocalBuild = BuildSystem.IsLocalBuild;
var isMainBranch = StringComparer.OrdinalIgnoreCase.Equals("refs/heads/main", BuildSystem.GitHubActions.Environment.Workflow.Ref);
var isPullRequest = BuildSystem.GitHubActions.Environment.PullRequest.IsPullRequest;
var runSonar = !string.IsNullOrWhiteSpace(sonarLoginToken);
var gitHubEvent = EnvironmentVariable("GITHUB_EVENT_NAME");
var isReleaseCreation = string.Equals(gitHubEvent, "release");
GitVersion versionInfo = null;
//////////////////////////////////////////////////////////////////////
// TASKS
//////////////////////////////////////////////////////////////////////
Setup(context =>
{
Information($"Local build: {isLocalBuild}");
Information($"Main branch: {isMainBranch}");
Information($"Pull request: {isPullRequest}");
Information($"Run sonar: {runSonar}");
Information($"ref: {BuildSystem.GitHubActions.Environment.Workflow.Ref}");
Information($"Is release creation: {isReleaseCreation}");
});
Task("Clean")
.Description("Removes the output directory")
.Does(() =>
{
EnsureDirectoryDoesNotExist(outputDir, new DeleteDirectorySettings
{
Recursive = true,
Force = true
});
CreateDirectory(outputDir);
});
Task("Version")
.Description("Retrieves the current version from the git repository")
.Does(() =>
{
versionInfo = GitVersion(new GitVersionSettings
{
UpdateAssemblyInfo = false
});
Information("Version: " + versionInfo.FullSemVer);
});
Task("Build")
.IsDependentOn("Clean")
.IsDependentOn("Version")
.Does(() =>
{
var msBuildSettings = new DotNetMSBuildSettings()
{
Version = versionInfo.AssemblySemVer,
InformationalVersion = versionInfo.InformationalVersion,
PackageVersion = versionInfo.SemVer
}.WithProperty("PackageOutputPath", outputDirNuget.FullPath);
var settings = new DotNetBuildSettings
{
Configuration = "Release",
MSBuildSettings = msBuildSettings
};
DotNetBuild(solution, settings);
});
Task("Test")
.IsDependentOn("Build")
.Does(() =>
{
var settings = new DotNetTestSettings
{
Configuration = "Release",
Loggers = new[] { "trx;" },
ResultsDirectory = outputDirTests,
Collectors = new[] { "XPlat Code Coverage" },
Filter = "(Execution!=Manual)",
ArgumentCustomization = a => a.Append("-- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=opencover"),
NoBuild = true
};
DotNetTest(solution, settings);
});
Task("SonarBegin")
.WithCriteria(runSonar)
.Does(() =>
{
SonarBegin(new SonarBeginSettings
{
Key = sonarProjectKey,
Url = sonarUrl,
Organization = sonarOrganization,
Token = sonarLoginToken,
UseCoreClr = true,
VsTestReportsPath = testResultsPath.ToString(),
OpenCoverReportsPath = codeCoverageResultFilePath.ToString()
});
});
Task("SonarEnd")
.WithCriteria(runSonar)
.Does(() =>
{
SonarEnd(new SonarEndSettings
{
Token = sonarLoginToken
});
});
Task("Publish")
.WithCriteria(isReleaseCreation)
.IsDependentOn("Test")
.IsDependentOn("Version")
.Description("Pushes the created NuGet packages to nuget.org")
.Does(() =>
{
Information($"Upload packages from {outputDirNuget.FullPath}");
// Get the paths to the packages ordered by the file names in order to get the nupkg first.
var packages = GetFiles(outputDirNuget.CombineWithFilePath("*.*nupkg").ToString()).OrderBy(x => x.FullPath).ToArray();
if (packages.Length == 0)
{
Error("No packages found to upload");
return;
}
// Push the package and symbols
foreach (var package in packages)
{
DotNetNuGetPush(package, new DotNetNuGetPushSettings
{
Source = nugetPublishFeed,
ApiKey = nugetApiKey,
SkipDuplicate = true
});
}
});
Task("Default")
.IsDependentOn("SonarBegin")
.IsDependentOn("Test")
.IsDependentOn("SonarEnd")
.IsDependentOn("Publish");
RunTarget(target);