Skip to content

Commit 4dffcbb

Browse files
committed
refactors build contexts and lifetimes
Abstracts common docker build setup logic into `DockerBuildContext` and `DockerBuildLifetime` base classes. Simplifies `BuildContext` and `BuildLifetime` implementations in `artifacts` and `docker` by reusing the shared base classes.
1 parent 48e5bbc commit 4dffcbb

File tree

6 files changed

+74
-95
lines changed

6 files changed

+74
-95
lines changed

build/artifacts/BuildContext.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
1-
using Common.Utilities;
1+
using Common.Context;
22

33
namespace Artifacts;
44

5-
public class BuildContext(ICakeContext context) : BuildContextBase(context)
5+
public class BuildContext(ICakeContext context) : DockerBuildContext(context)
66
{
77
public string MsBuildConfiguration { get; } = Constants.DefaultConfiguration;
8-
9-
public bool IsDockerOnLinux { get; set; }
10-
11-
public IEnumerable<DockerImage> Images { get; set; } = new List<DockerImage>();
128
}

build/artifacts/BuildLifetime.cs

Lines changed: 2 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,8 @@
11
using Common.Lifetime;
2-
using Common.Utilities;
32

43
namespace Artifacts;
54

6-
public class BuildLifetime : BuildLifetimeBase<BuildContext>
5+
public class BuildLifetime : DockerBuildLifetime<BuildContext>
76
{
8-
public override void Setup(BuildContext context, ISetupContext info)
9-
{
10-
base.Setup(context, info);
11-
12-
context.IsDockerOnLinux = context.DockerCustomCommand("info --format '{{.OSType}}'").First().Replace("'", string.Empty) == "linux";
13-
14-
var dockerRegistry = context.Argument(Arguments.DockerRegistry, DockerRegistry.DockerHub);
15-
var dotnetVersion = context.Argument(Arguments.DotnetVersion, string.Empty).ToLower();
16-
var dockerDistro = context.Argument(Arguments.DockerDistro, string.Empty).ToLower();
17-
18-
var versions = string.IsNullOrWhiteSpace(dotnetVersion)
19-
? Constants.DotnetVersions
20-
: string.Equals(dotnetVersion, "lts-latest", StringComparison.OrdinalIgnoreCase)
21-
? [Constants.DotnetLtsLatest]
22-
: [dotnetVersion];
23-
24-
var distros = string.IsNullOrWhiteSpace(dockerDistro)
25-
? Constants.DockerDistros
26-
: string.Equals(dockerDistro, "distro-latest", StringComparison.OrdinalIgnoreCase)
27-
? [Constants.AlpineLatest]
28-
: [dockerDistro];
29-
30-
var architectures = context.HasArgument(Arguments.Architecture) ? context.Arguments<Architecture>(Arguments.Architecture) : Constants.ArchToBuild;
31-
var platformArch = context.IsRunningOnAmd64() ? Architecture.Amd64 : Architecture.Arm64;
32-
33-
var registry = dockerRegistry == DockerRegistry.DockerHub ? Constants.DockerHubRegistry : Constants.GitHubContainerRegistry;
34-
context.Images = from version in versions
35-
from distro in distros
36-
from arch in architectures
37-
select new DockerImage(distro, version, arch, registry, true);
38-
39-
context.StartGroup("Build Setup");
40-
41-
LogBuildInformation(context);
42-
43-
context.Information($"IsDockerOnLinux: {context.IsDockerOnLinux}");
44-
context.Information($"Building for Version: {dotnetVersion}, Distro: {dockerDistro}, Architecture: {platformArch}");
45-
46-
context.EndGroup();
47-
}
7+
protected override bool UseBaseImage => true;
488
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using Common.Utilities;
2+
3+
namespace Common.Context;
4+
5+
public class DockerBuildContext(ICakeContext context) : BuildContextBase(context)
6+
{
7+
public bool IsDockerOnLinux { get; set; }
8+
9+
public IEnumerable<DockerImage> Images { get; set; } = new List<DockerImage>();
10+
public DockerRegistry DockerRegistry { get; set; }
11+
public ICollection<Architecture> Architectures { get; set; } = new List<Architecture>();
12+
}
13+
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using Common.Context;
2+
using Common.Utilities;
3+
4+
namespace Common.Lifetime;
5+
6+
public abstract class DockerBuildLifetime<TContext> : BuildLifetimeBase<TContext>
7+
where TContext : DockerBuildContext
8+
{
9+
protected virtual bool UseBaseImage => false;
10+
11+
public override void Setup(TContext context, ISetupContext info)
12+
{
13+
base.Setup(context, info);
14+
15+
context.IsDockerOnLinux = context.DockerCustomCommand("info --format '{{.OSType}}'").First().Replace("'", string.Empty) == "linux";
16+
17+
var dockerRegistry = context.Argument(Arguments.DockerRegistry, DockerRegistry.DockerHub);
18+
var dotnetVersion = context.Argument(Arguments.DotnetVersion, string.Empty).ToLower();
19+
var dockerDistro = context.Argument(Arguments.DockerDistro, string.Empty).ToLower();
20+
21+
var versions = string.IsNullOrWhiteSpace(dotnetVersion)
22+
? Constants.DotnetVersions
23+
: string.Equals(dotnetVersion, "lts-latest", StringComparison.OrdinalIgnoreCase)
24+
? [Constants.DotnetLtsLatest]
25+
: [dotnetVersion];
26+
27+
var distros = string.IsNullOrWhiteSpace(dockerDistro)
28+
? Constants.DockerDistros
29+
: string.Equals(dockerDistro, "distro-latest", StringComparison.OrdinalIgnoreCase)
30+
? [Constants.AlpineLatest]
31+
: [dockerDistro];
32+
33+
var architectures = context.HasArgument(Arguments.Architecture) ? context.Arguments<Architecture>(Arguments.Architecture) : Constants.ArchToBuild;
34+
var platformArch = context.IsRunningOnAmd64() ? Architecture.Amd64 : Architecture.Arm64;
35+
36+
var registry = dockerRegistry == DockerRegistry.DockerHub ? Constants.DockerHubRegistry : Constants.GitHubContainerRegistry;
37+
38+
context.DockerRegistry = dockerRegistry;
39+
context.Architectures = architectures;
40+
context.Images = from version in versions
41+
from distro in distros
42+
from arch in architectures
43+
select new DockerImage(distro, version, arch, registry, UseBaseImage);
44+
45+
context.StartGroup("Build Setup");
46+
47+
LogBuildInformation(context);
48+
49+
context.Information($"IsDockerOnLinux: {context.IsDockerOnLinux}");
50+
context.Information($"Building for Version: {dotnetVersion}, Distro: {dockerDistro}, Architecture: {platformArch}");
51+
context.EndGroup();
52+
}
53+
}
54+

build/docker/BuildContext.cs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
1-
using Common.Utilities;
1+
using Common.Context;
22
using Docker.Utilities;
33

44
namespace Docker;
55

6-
public class BuildContext(ICakeContext context) : BuildContextBase(context)
6+
public class BuildContext(ICakeContext context) : DockerBuildContext(context)
77
{
88
public Credentials? Credentials { get; set; }
9-
public bool IsDockerOnLinux { get; set; }
10-
11-
public IEnumerable<DockerImage> Images { get; set; } = new List<DockerImage>();
12-
public DockerRegistry DockerRegistry { get; set; }
13-
public ICollection<Architecture> Architectures { get; set; } = new List<Architecture>();
149
}

build/docker/BuildLifetime.cs

Lines changed: 1 addition & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,14 @@
11
using Common.Lifetime;
2-
using Common.Utilities;
32
using Docker.Utilities;
43

54
namespace Docker;
65

7-
public class BuildLifetime : BuildLifetimeBase<BuildContext>
6+
public class BuildLifetime : DockerBuildLifetime<BuildContext>
87
{
98
public override void Setup(BuildContext context, ISetupContext info)
109
{
1110
base.Setup(context, info);
1211

1312
context.Credentials = Credentials.GetCredentials(context);
14-
15-
context.IsDockerOnLinux = context.DockerCustomCommand("info --format '{{.OSType}}'").First().Replace("'", "") == "linux";
16-
17-
var dockerRegistry = context.Argument(Arguments.DockerRegistry, DockerRegistry.DockerHub);
18-
var dotnetVersion = context.Argument(Arguments.DotnetVersion, string.Empty).ToLower();
19-
var dockerDistro = context.Argument(Arguments.DockerDistro, string.Empty).ToLower();
20-
21-
var versions = string.IsNullOrWhiteSpace(dotnetVersion)
22-
? Constants.DotnetVersions
23-
: string.Equals(dotnetVersion, "lts-latest", StringComparison.OrdinalIgnoreCase)
24-
? [Constants.DotnetLtsLatest]
25-
: [dotnetVersion];
26-
27-
var distros = string.IsNullOrWhiteSpace(dockerDistro)
28-
? Constants.DockerDistros
29-
: string.Equals(dockerDistro, "distro-latest", StringComparison.OrdinalIgnoreCase)
30-
? [Constants.AlpineLatest]
31-
: [dockerDistro];
32-
33-
var architectures = context.HasArgument(Arguments.Architecture) ? context.Arguments<Architecture>(Arguments.Architecture) : Constants.ArchToBuild;
34-
var platformArch = context.IsRunningOnAmd64() ? Architecture.Amd64 : Architecture.Arm64;
35-
36-
var registry = dockerRegistry == DockerRegistry.DockerHub ? Constants.DockerHubRegistry : Constants.GitHubContainerRegistry;
37-
38-
context.DockerRegistry = dockerRegistry;
39-
context.Architectures = architectures;
40-
context.Images = from version in versions
41-
from distro in distros
42-
from arch in architectures
43-
select new DockerImage(distro, version, arch, registry, false);
44-
45-
context.StartGroup("Build Setup");
46-
47-
LogBuildInformation(context);
48-
49-
context.Information($"IsDockerOnLinux: {context.IsDockerOnLinux}");
50-
context.Information($"Building for Version: {dotnetVersion}, Distro: {dockerDistro}, Architecture: {platformArch}");
51-
context.EndGroup();
5213
}
5314
}

0 commit comments

Comments
 (0)