Skip to content

Commit 56e8911

Browse files
gfraiteurclaude
andcommitted
Refactor container requirements and enhance AdditionalCiBuildConfiguration.
Container requirements refactoring: - Extract ContainerHelper with GetBuildAgentType utility method - Add ContainerHostRequirements base class for Docker host requirements - Change ContainerRequirements to inherit from ContainerHostRequirements AdditionalCiBuildConfiguration enhancements: - Make Branch property optional (nullable) - Add BuildSnapshotDependency property for build configuration dependencies - Update constructor to remove branch parameter (now set via initializer) - Update TeamCityBuildConfiguration method to accept build configurations dictionary - Use custom BuildAgentRequirements in PowershellAdditionalCiBuildConfiguration Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
1 parent 62b01e0 commit 56e8911

File tree

7 files changed

+644
-592
lines changed

7 files changed

+644
-592
lines changed
Lines changed: 71 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,72 @@
1-
// Copyright (c) SharpCrafters s.r.o. See the LICENSE.md file in the root directory of this repository root for details.
2-
3-
using JetBrains.Annotations;
4-
using PostSharp.Engineering.BuildTools.Build;
5-
using PostSharp.Engineering.BuildTools.ContinuousIntegration.TeamCity.Generation;
6-
using PostSharp.Engineering.BuildTools.Dependencies;
7-
using PostSharp.Engineering.BuildTools.Dependencies.Model;
8-
using PostSharp.Engineering.BuildTools.Docker;
9-
using PostSharp.Engineering.BuildTools.Utilities;
10-
using System.IO;
11-
12-
namespace PostSharp.Engineering.BuildTools.ContinuousIntegration;
13-
14-
[UsedImplicitly]
15-
internal class GenerateScriptsCommand : BaseCommand<CommonCommandSettings>
16-
{
17-
protected override bool ExecuteCore( BuildContext context, CommonCommandSettings settings ) => Execute( context, settings );
18-
19-
public static bool Execute( BuildContext context, CommonCommandSettings settings )
20-
{
21-
var product = context.Product;
22-
23-
// TeamCity
24-
if ( product.GenerateTeamCitySettings )
25-
{
26-
if ( !TeamCitySettingsFile.TryWrite( context, settings ) )
27-
{
28-
return false;
29-
}
30-
}
31-
32-
EmbeddedResourceHelper.ExtractScript( context, "Build.ps1", "" );
33-
EmbeddedResourceHelper.ExtractScript( context, "build.sh", "" );
34-
35-
// Docker.
36-
if ( product.UseDocker )
37-
{
38-
EmbeddedResourceHelper.ExtractScript( context, "DockerBuild.ps1", "" );
39-
EmbeddedResourceHelper.ExtractScript( context, "RunClaude.ps1", "eng" );
40-
var image = (ContainerRequirements) product.OverriddenBuildAgentRequirements!;
41-
42-
if ( !image.WriteDockerfile( context ) )
43-
{
44-
return false;
45-
}
46-
47-
// Generate Claude Dockerfile (will auto-add NodeJs if not present)
48-
if ( !image.WriteClaudeDockerfile( context ) )
49-
{
50-
return false;
51-
}
52-
53-
// Generate DockerMounts.g.ps1 to define additional mount points for dependencies
54-
var buildSettings = new BuildSettings { BuildConfiguration = BuildConfiguration.Debug };
55-
buildSettings.Initialize( context );
56-
57-
if ( !DependenciesConfigurationFile.TryLoad( context, buildSettings, buildSettings.BuildConfiguration, out var dependenciesOverrideFile ) )
58-
{
59-
return false;
60-
}
61-
62-
if ( !dependenciesOverrideFile.TryWrite( context ) )
63-
{
64-
return false;
65-
}
66-
}
67-
68-
context.Console.WriteSuccess( "Generating build scripts was successful." );
69-
70-
return true;
71-
}
1+
// Copyright (c) SharpCrafters s.r.o. See the LICENSE.md file in the root directory of this repository root for details.
2+
3+
using JetBrains.Annotations;
4+
using PostSharp.Engineering.BuildTools.Build;
5+
using PostSharp.Engineering.BuildTools.ContinuousIntegration.TeamCity.Generation;
6+
using PostSharp.Engineering.BuildTools.Dependencies;
7+
using PostSharp.Engineering.BuildTools.Dependencies.Model;
8+
using PostSharp.Engineering.BuildTools.Docker;
9+
using PostSharp.Engineering.BuildTools.Utilities;
10+
using System.IO;
11+
12+
namespace PostSharp.Engineering.BuildTools.ContinuousIntegration;
13+
14+
[UsedImplicitly]
15+
internal class GenerateScriptsCommand : BaseCommand<CommonCommandSettings>
16+
{
17+
protected override bool ExecuteCore( BuildContext context, CommonCommandSettings settings ) => Execute( context, settings );
18+
19+
public static bool Execute( BuildContext context, CommonCommandSettings settings )
20+
{
21+
var product = context.Product;
22+
23+
// TeamCity
24+
if ( product.GenerateTeamCitySettings )
25+
{
26+
if ( !TeamCitySettingsFile.TryWrite( context ) )
27+
{
28+
return false;
29+
}
30+
}
31+
32+
EmbeddedResourceHelper.ExtractScript( context, "Build.ps1", "" );
33+
EmbeddedResourceHelper.ExtractScript( context, "build.sh", "" );
34+
35+
// Docker.
36+
if ( product.UseDocker )
37+
{
38+
EmbeddedResourceHelper.ExtractScript( context, "DockerBuild.ps1", "" );
39+
EmbeddedResourceHelper.ExtractScript( context, "RunClaude.ps1", "eng" );
40+
var image = (ContainerRequirements) product.OverriddenBuildAgentRequirements!;
41+
42+
if ( !image.WriteDockerfile( context ) )
43+
{
44+
return false;
45+
}
46+
47+
// Generate Claude Dockerfile (will auto-add NodeJs if not present)
48+
if ( !image.WriteClaudeDockerfile( context ) )
49+
{
50+
return false;
51+
}
52+
53+
// Generate DockerMounts.g.ps1 to define additional mount points for dependencies
54+
var buildSettings = new BuildSettings { BuildConfiguration = BuildConfiguration.Debug };
55+
buildSettings.Initialize( context );
56+
57+
if ( !DependenciesConfigurationFile.TryLoad( context, buildSettings, buildSettings.BuildConfiguration, out var dependenciesOverrideFile ) )
58+
{
59+
return false;
60+
}
61+
62+
if ( !dependenciesOverrideFile.TryWrite( context ) )
63+
{
64+
return false;
65+
}
66+
}
67+
68+
context.Console.WriteSuccess( "Generating build scripts was successful." );
69+
70+
return true;
71+
}
7272
}
Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
// Copyright (c) SharpCrafters s.r.o. See the LICENSE.md file in the root directory of this repository root for details.
22

33
using JetBrains.Annotations;
4+
using PostSharp.Engineering.BuildTools.Build;
45
using PostSharp.Engineering.BuildTools.ContinuousIntegration.TeamCity;
56
using PostSharp.Engineering.BuildTools.ContinuousIntegration.TeamCity.Generation;
67
using PostSharp.Engineering.BuildTools.Docker;
8+
using System.Collections.Generic;
79

810
namespace PostSharp.Engineering.BuildTools.ContinuousIntegration.Model;
911

@@ -14,20 +16,26 @@ public abstract class AdditionalCiBuildConfiguration
1416

1517
public string Id { get; }
1618

17-
public string Branch { get; }
19+
public string? Branch { get; init; }
1820

1921
public SourceDependenciesRequirements SourceDependenciesRequirements { get; init; }
22+
23+
/// <summary>
24+
/// Gets or sets the build configuration on which the current <see cref="AdditionalCiBuildConfiguration"/> depends.
25+
/// </summary>
26+
public BuildConfiguration? BuildSnapshotDependency { get; init; }
2027

2128
public bool OnlyCheckoutEngineering { get; init; }
2229

23-
protected AdditionalCiBuildConfiguration( string id, string name, string branch )
30+
protected AdditionalCiBuildConfiguration( string id, string name )
2431
{
2532
this.Id = id;
2633
this.Name = name;
27-
this.Branch = branch;
2834
}
2935

30-
internal abstract TeamCityBuildConfiguration TeamCityBuildConfiguration( ProductProperties productProperties );
36+
internal abstract TeamCityBuildConfiguration TeamCityBuildConfiguration(
37+
ProductProperties productProperties,
38+
IReadOnlyDictionary<BuildConfiguration, TeamCityBuildConfiguration> teamCityBuildBuildConfigurations );
3139

3240
public BuildAgentRequirements? BuildAgentRequirements { get; init; }
3341
}

src/PostSharp.Engineering.BuildTools/ContinuousIntegration/Model/PowershellAdditionalCiBuildConfiguration.cs

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
// Copyright (c) SharpCrafters s.r.o. See the LICENSE.md file in the root directory of this repository root for details.
22

33
using JetBrains.Annotations;
4+
using PostSharp.Engineering.BuildTools.Build;
45
using PostSharp.Engineering.BuildTools.ContinuousIntegration.TeamCity;
56
using PostSharp.Engineering.BuildTools.ContinuousIntegration.TeamCity.BuildSteps;
67
using PostSharp.Engineering.BuildTools.ContinuousIntegration.TeamCity.Generation;
8+
using PostSharp.Engineering.BuildTools.Docker;
79
using System;
10+
using System.Collections.Generic;
811

912
namespace PostSharp.Engineering.BuildTools.ContinuousIntegration.Model;
1013

1114
[PublicAPI]
1215
public class PowershellAdditionalCiBuildConfiguration : AdditionalCiBuildConfiguration
1316
{
14-
public PowershellAdditionalCiBuildConfiguration( string id, string name, string branch, string script, string arguments ) : base( id, name, branch )
17+
public PowershellAdditionalCiBuildConfiguration( string id, string name, string script, string arguments ) : base( id, name )
1518
{
1619
this.Script = script;
1720
this.Arguments = arguments;
@@ -21,14 +24,29 @@ public PowershellAdditionalCiBuildConfiguration( string id, string name, string
2124

2225
public string Arguments { get; }
2326

24-
internal override TeamCityBuildConfiguration TeamCityBuildConfiguration( ProductProperties productProperties )
27+
internal override TeamCityBuildConfiguration TeamCityBuildConfiguration(
28+
ProductProperties productProperties,
29+
IReadOnlyDictionary<BuildConfiguration, TeamCityBuildConfiguration> teamCityBuildBuildConfigurations )
2530
{
2631
var product = productProperties.Product;
2732

33+
TeamCityBuildConfiguration? buildConfiguration = null;
34+
string? buildArtifactsDirectory = null;
35+
36+
if ( this.BuildSnapshotDependency != null )
37+
{
38+
if ( !teamCityBuildBuildConfigurations.TryGetValue( this.BuildSnapshotDependency.Value, out buildConfiguration ) )
39+
{
40+
throw new KeyNotFoundException( $"Cannot find the TeamCity build configuration for '{this.BuildSnapshotDependency.Value}'." );
41+
}
42+
43+
buildArtifactsDirectory = productProperties.Product.GetPrivateArtifactsRelativeDirectory( this.BuildSnapshotDependency.Value ).Replace( "\\", "/", StringComparison.Ordinal );
44+
}
45+
2846
var downstreamMergeConfiguration = new TeamCityBuildConfiguration(
2947
this.Id,
3048
this.Name,
31-
this.Branch,
49+
this.Branch ?? productProperties.Branch,
3250
productProperties.VcsId,
3351
this.BuildAgentRequirements ?? product.ResolvedBuildAgentRequirements )
3452
{
@@ -39,7 +57,7 @@ internal override TeamCityBuildConfiguration TeamCityBuildConfiguration( Product
3957
$"Execute {this.Script}",
4058
this.Script,
4159
this.Arguments,
42-
product.DockerSpec,
60+
this.BuildAgentRequirements == null ? product.DockerSpec : this.BuildAgentRequirements.IsDockerized ? new DockerSpec( $"{productProperties.Product.ProductNameWithoutDot}-{productProperties.Product.ProductFamily.Version}-{this.Id}".ToLowerInvariant() ) : null,
4361
true )
4462
],
4563
IsSshAgentRequired = productProperties.IsRepoRemoteSsh,
@@ -51,7 +69,10 @@ internal override TeamCityBuildConfiguration TeamCityBuildConfiguration( Product
5169
#pragma warning restore CS0618 // Type or member is obsolete
5270
SourceDependenciesRequirements.Full => productProperties.SourceDependencies,
5371
_ => throw new ArgumentOutOfRangeException()
54-
}
72+
},
73+
SnapshotDependencies = buildConfiguration == null
74+
? null
75+
: [new TeamCitySnapshotDependency( buildConfiguration.ObjectName, false, $"+:{buildArtifactsDirectory}/**/*=>{buildArtifactsDirectory}" )]
5576
};
5677

5778
return downstreamMergeConfiguration;

0 commit comments

Comments
 (0)