Skip to content

Commit 0ca89a4

Browse files
committed
Switch build to Cake Frosting
1 parent 2d11756 commit 0ca89a4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+2128
-329
lines changed

.azuredevops/pipelines/templates/stages/build-for-integration-tests.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ stages:
1212
vmImage: 'ubuntu-22.04'
1313
steps:
1414
- template: ../steps/install-required-dotnet-versions-for-building.yml
15-
- bash: ./build.sh --target=Create-NuGet-Packages
15+
- bash: ./build.sh --target=Package
1616
displayName: 'Build'
1717
- publish: $(Build.SourcesDirectory)/BuildArtifacts/Packages/NuGet
1818
artifact: NuGet Package

.config/dotnet-tools.json

-12
This file was deleted.

.github/workflows/integrationtests.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ jobs:
3232
8.x
3333
9.x
3434
- name: Build
35-
run: ./build.sh --target=Create-NuGet-Packages
35+
run: ./build.sh --target=Package
3636
shell: bash
3737
- name: Publish NuGet package as build artifact
3838
uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -305,4 +305,5 @@ __pycache__/
305305
# Project specific
306306

307307
BuildArtifacts/
308+
build/tools/*
308309
docs/.cache/

build.ps1

+2-15
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,2 @@
1-
$ErrorActionPreference = 'Stop'
2-
3-
$SCRIPT_NAME = "recipe.cake"
4-
5-
Write-Host "Restoring .NET Core tools"
6-
dotnet tool restore
7-
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
8-
9-
Write-Host "Bootstrapping Cake"
10-
dotnet cake $SCRIPT_NAME --bootstrap
11-
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
12-
13-
Write-Host "Running Build"
14-
dotnet cake $SCRIPT_NAME @args
15-
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
1+
dotnet run --project build/Build.csproj -- $args
2+
exit $LASTEXITCODE;

build.sh

+1-10
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,2 @@
11
#!/bin/bash
2-
SCRIPT_NAME="recipe.cake"
3-
4-
echo "Restoring .NET Core tools"
5-
dotnet tool restore
6-
7-
echo "Bootstrapping Cake"
8-
dotnet cake $SCRIPT_NAME --bootstrap
9-
10-
echo "Running Build"
11-
dotnet cake $SCRIPT_NAME "$@"
2+
dotnet run --project ./build/Build.csproj -- "$@"

build/Build.csproj

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
<PropertyGroup>
3+
<OutputType>Exe</OutputType>
4+
<TargetFramework>net9.0</TargetFramework>
5+
<ImplicitUsings>enable</ImplicitUsings>
6+
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
7+
8+
<!-- Make sure start same folder .NET Core CLI and Visual Studio. -->
9+
<!-- Also expected from Cake.Issues.Recipe to have build directory set as working directory. -->
10+
<RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>
11+
</PropertyGroup>
12+
13+
<ItemGroup>
14+
<PackageReference Include="Cake.Frosting" Version="5.0.0" />
15+
<PackageReference Include="Cake.Frosting.Issues.Recipe" Version="5.1.1" />
16+
</ItemGroup>
17+
18+
</Project>

build/BuildLifetime.cs

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
using Cake.Common;
2+
using Cake.Common.Build;
3+
using Cake.Common.Diagnostics;
4+
using Cake.Common.IO;
5+
using Cake.Common.Tools.GitVersion;
6+
using Cake.Core;
7+
using Cake.Frosting;
8+
using Spectre.Console;
9+
10+
public class BuildLifetime : FrostingLifetime<BuildContext>
11+
{
12+
public override void Setup(BuildContext context, ISetupContext info)
13+
{
14+
AnsiConsole.Write(new FigletText("Cake.Issues").Centered());
15+
16+
// Determine version
17+
DetermineVersion(context);
18+
19+
// Cleanup "dist" folder
20+
context.CleanDirectory(context.Parameters.OutputDirectory);
21+
}
22+
23+
public override void Teardown(BuildContext context, ITeardownContext info)
24+
{
25+
}
26+
27+
private static void DetermineVersion(BuildContext context)
28+
{
29+
var settings = new GitVersionSettings
30+
{
31+
ToolPath = context.Tools.Resolve("dotnet-gitversion.exe")
32+
};
33+
34+
if (settings.ToolPath == null)
35+
{
36+
settings.ToolPath = context.Tools.Resolve("dotnet-gitversion");
37+
}
38+
39+
if (!context.BuildSystem().IsLocalBuild)
40+
{
41+
settings.UpdateAssemblyInfo = true;
42+
settings.UpdateAssemblyInfoFilePath =
43+
context.State.RepositoryRootDirectory
44+
.GetRelativePath(context.Paths.SrcDirectoryPath)
45+
.CombineWithFilePath("SolutionInfo.cs");
46+
}
47+
48+
context.State.Version = context.GitVersion(settings);
49+
50+
context.Information("Building version {0}", context.State.Version.FullSemVer);
51+
}
52+
}

build/Context/BuildContext.cs

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using Cake.Core;
2+
3+
/// <summary>
4+
/// Class holding state during execution of build.
5+
/// </summary>
6+
public class BuildContext : IssuesContext<BuildParameters, BuildState>
7+
{
8+
public Paths Paths { get; }
9+
10+
public BuildContext(ICakeContext context)
11+
: base(context)
12+
{
13+
Paths = new Paths(this);
14+
}
15+
16+
protected override BuildParameters CreateIssuesParameters()
17+
{
18+
return new BuildParameters(this);
19+
}
20+
21+
protected override BuildState CreateIssuesState()
22+
{
23+
return new BuildState(this);
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using Cake.Core;
2+
3+
public class BuildParameters : IssuesParameters
4+
{
5+
public MsBuildParameters MsBuild { get; }
6+
7+
public BuildParameters(ICakeContext context)
8+
{
9+
this.OutputDirectory = "../BuildArtifacts";
10+
this.MsBuild = new MsBuildParameters(context);
11+
}
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using Cake.Common.Build;
2+
using Cake.Common.Tools.DotNet.MSBuild;
3+
using Cake.Core;
4+
5+
public class MsBuildParameters(ICakeContext context)
6+
{
7+
public DotNetMSBuildSettings GetSettings()
8+
{
9+
return new DotNetMSBuildSettings()
10+
.SetConfiguration("Release") // Configuration is also hardcoded in nuspec files
11+
.WithProperty("ContinuousIntegrationBuild", (!context.BuildSystem().IsLocalBuild).ToString());
12+
}
13+
}

build/Context/Paths.cs

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using Cake.Common.IO;
2+
using Cake.Core.IO;
3+
4+
public class Paths
5+
{
6+
public FilePath SolutionFilePath { get; }
7+
8+
public DirectoryPath SrcDirectoryPath { get; }
9+
10+
public DirectoryPath NuspecDirectoryPath { get; }
11+
12+
public DirectoryPath OutputLogsDirectoryPath { get; }
13+
14+
public DirectoryPath OutputPackagesNuGetDirectoryPath { get; }
15+
16+
public Paths(BuildContext context)
17+
{
18+
this.SrcDirectoryPath = context.State.RepositoryRootDirectory.Combine("src");
19+
this.NuspecDirectoryPath = context.State.RepositoryRootDirectory.Combine("nuspec").Combine("nuget");
20+
21+
this.OutputLogsDirectoryPath = context.Parameters.OutputDirectory.Combine("logs");
22+
this.OutputPackagesNuGetDirectoryPath = context.Parameters.OutputDirectory.Combine("Packages").Combine("NuGet");
23+
24+
this.SolutionFilePath = this.SrcDirectoryPath.CombineWithFilePath("Cake.Issues.sln");
25+
26+
context.EnsureDirectoryExists(context.Parameters.OutputDirectory);
27+
}
28+
}

build/Context/State/BuildState.cs

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using Cake.Common.Tools.GitVersion;
2+
3+
public class BuildState : IssuesState
4+
{
5+
public GitVersion Version { get; set; }
6+
7+
public BuildState(BuildContext context)
8+
: base(context, RepositoryInfoProviderType.CakeGit)
9+
{
10+
}
11+
}

build/Program.cs

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using Cake.Frosting;
2+
using Microsoft.Build.Logging.StructuredLogger;
3+
using System.Reflection;
4+
5+
public static class Program
6+
{
7+
public static int Main(string[] args)
8+
{
9+
return new CakeHost()
10+
.UseContext<BuildContext>()
11+
.UseLifetime<BuildLifetime>()
12+
.AddAssembly(Assembly.GetAssembly(typeof(IssuesTask)))
13+
.InstallTool(new Uri("dotnet:?package=GitVersion.Tool&version=6.1.0"))
14+
.InstallTool(new Uri("nuget:?package=JetBrains.ReSharper.CommandLineTools&version=2024.3.3"))
15+
.InstallTool(new Uri("nuget:?package=NuGet.CommandLine&version=6.12.2"))
16+
.Run(args);
17+
}
18+
}
+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using Cake.Common.Tools.DotNet;
2+
using Cake.Common.Tools.DotNet.Build;
3+
using Cake.Common.Tools.DotNet.MSBuild;
4+
using Cake.Frosting;
5+
6+
[TaskName("Build-Solution")]
7+
[IsDependentOn(typeof(RestoreSolutionTask))]
8+
[IsDependeeOf(typeof(ReadIssuesTask))]
9+
public sealed class BuildSolutionTask : FrostingTask<BuildContext>
10+
{
11+
public override void Run(BuildContext context)
12+
{
13+
var msBuildLogFilePath = context.Paths.OutputLogsDirectoryPath.CombineWithFilePath("build.binlog");
14+
15+
var settings = new DotNetBuildSettings
16+
{
17+
NoRestore = true,
18+
MSBuildSettings =
19+
context.Parameters.MsBuild.GetSettings()
20+
.WithLogger(
21+
"BinaryLogger," + context.Environment.ApplicationRoot.CombineWithFilePath("StructuredLogger.dll"),
22+
"",
23+
msBuildLogFilePath.FullPath)
24+
.WithTarget("Rebuild"),
25+
};
26+
27+
context.DotNetBuild(context.Paths.SolutionFilePath.FullPath, settings);
28+
29+
// Read issues
30+
context.Parameters.InputFiles.AddMsBuildBinaryLogFilePath(msBuildLogFilePath);
31+
}
32+
}

build/Tasks/Build/BuildTask.cs

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
using Cake.Frosting;
2+
3+
[TaskName("Build")]
4+
[IsDependentOn(typeof(BuildSolutionTask))]
5+
public sealed class BuildTask : FrostingTask
6+
{
7+
}
+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using Cake.Common.Build;
2+
using Cake.Common.Tools.DotNet;
3+
using Cake.Common.Tools.DotNet.Restore;
4+
using Cake.Frosting;
5+
6+
[TaskName("Restore-Solution")]
7+
public sealed class RestoreSolutionTask : FrostingTask<BuildContext>
8+
{
9+
public override void Run(BuildContext context)
10+
{
11+
// Enforce up to date lock files in CI builds.
12+
// On local builds lock files will be updated if necessary.
13+
var settings = new DotNetRestoreSettings
14+
{
15+
LockedMode = !context.BuildSystem().IsLocalBuild,
16+
MSBuildSettings = context.Parameters.MsBuild.GetSettings(),
17+
};
18+
19+
context.DotNetRestore(context.Paths.SolutionFilePath.FullPath, settings);
20+
}
21+
}

build/Tasks/DefaultTask.cs

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using Cake.Frosting;
2+
3+
[TaskName("Default")]
4+
[IsDependentOn(typeof(LintTask))]
5+
[IsDependentOn(typeof(PackageTask))]
6+
[IsDependentOn(typeof(TestTask))]
7+
public sealed class DefaultTask : FrostingTask
8+
{
9+
}

build/Tasks/Lint/LintTask.cs

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using Cake.Frosting;
2+
3+
[TaskName("Lint")]
4+
[IsDependentOn(typeof(RunInspectCodeTask))]
5+
[IsDependentOn(typeof(IssuesTask))]
6+
public class LintTask : FrostingTask
7+
{
8+
}
+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using Cake.Common.Tools.InspectCode;
2+
using Cake.Frosting;
3+
4+
[TaskName("Run-InspectCodeTask")]
5+
[IsDependeeOf(typeof(ReadIssuesTask))]
6+
public sealed class RunInspectCodeTask : FrostingTask<BuildContext>
7+
{
8+
public override void Run(BuildContext context)
9+
{
10+
var inspectCodeLogFilePath = context.Paths.OutputLogsDirectoryPath.CombineWithFilePath("inspectcode.sarif");
11+
12+
// Run InspectCode.
13+
var settings = new InspectCodeSettings()
14+
{
15+
SolutionWideAnalysis = true,
16+
OutputFile = inspectCodeLogFilePath,
17+
SkipOutputAnalysis = true,
18+
};
19+
context.InspectCode(
20+
context.Paths.SolutionFilePath,
21+
settings);
22+
23+
// Read issues
24+
context.Parameters.InputFiles.AddSarifLogFilePath(
25+
inspectCodeLogFilePath,
26+
new ReadIssuesSettings(context.State.RepositoryRootDirectory)
27+
{
28+
Run = "InspectCode",
29+
});
30+
}
31+
}

0 commit comments

Comments
 (0)