Skip to content

Commit 1f9b197

Browse files
gfraiteurclaude
andcommitted
Refactor agent requirements to use OS family and architecture
- Use matches("teamcity.agent.jvm.os.family", "Windows") for Windows hosts - Use equals("env.PROCESSOR_ARCHITECTURE", "AMD64") for docker builds - Use Linux OS family for WSL hosts - Add RequirementComparisonType enum for equals/matches support Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 930716e commit 1f9b197

File tree

5 files changed

+65
-41
lines changed

5 files changed

+65
-41
lines changed

.teamcity/settings.kts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ object PublicBuild : BuildType({
7070

7171
requirements {
7272
matches("teamcity.agent.jvm.os.family", "Windows")
73+
equals("env.PROCESSOR_ARCHITECTURE", "AMD64")
7374
}
7475

7576
features {
@@ -148,6 +149,7 @@ object PublicDeployment : BuildType({
148149

149150
requirements {
150151
matches("teamcity.agent.jvm.os.family", "Windows")
152+
equals("env.PROCESSOR_ARCHITECTURE", "AMD64")
151153
}
152154

153155
features {
@@ -216,6 +218,7 @@ object VersionBump : BuildType({
216218

217219
requirements {
218220
matches("teamcity.agent.jvm.os.family", "Windows")
221+
equals("env.PROCESSOR_ARCHITECTURE", "AMD64")
219222
}
220223

221224
features {
Lines changed: 37 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,38 @@
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 System.Collections.Generic;
5-
using System.Linq;
6-
7-
namespace PostSharp.Engineering.BuildTools.ContinuousIntegration.Model;
8-
9-
public record BuildAgentRequirement( string Name, string Value );
10-
11-
[PublicAPI]
12-
public record BuildAgentRequirements
13-
{
14-
public BuildAgentRequirements( params BuildAgentRequirement[] items )
15-
{
16-
this.Items = items;
17-
}
18-
19-
public static BuildAgentRequirements Empty { get; } = new();
20-
21-
public static BuildAgentRequirements Default { get; } = SelfHosted( "caravela04cloud" );
22-
23-
public static BuildAgentRequirements SelfHosted( string name ) => new( new BuildAgentRequirement( "env.BuildAgentType", name ) );
24-
25-
public static BuildAgentRequirements JetBrainsHosted( string name ) => new( new BuildAgentRequirement( "teamcity.agent.name", name ) );
26-
27-
public IReadOnlyList<BuildAgentRequirement> Items { get; init; }
28-
29-
public BuildAgentRequirements Combine( BuildAgentRequirements other ) => new( this.Items.Concat( other.Items ).ToArray() );
30-
31-
public virtual bool IsDockerized => false;
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 System.Collections.Generic;
5+
using System.Linq;
6+
7+
namespace PostSharp.Engineering.BuildTools.ContinuousIntegration.Model;
8+
9+
public enum RequirementComparisonType
10+
{
11+
Equals,
12+
Matches
13+
}
14+
15+
public record BuildAgentRequirement( string Name, string Value, RequirementComparisonType ComparisonType = RequirementComparisonType.Equals );
16+
17+
[PublicAPI]
18+
public record BuildAgentRequirements
19+
{
20+
public BuildAgentRequirements( params BuildAgentRequirement[] items )
21+
{
22+
this.Items = items;
23+
}
24+
25+
public static BuildAgentRequirements Empty { get; } = new();
26+
27+
public static BuildAgentRequirements Default { get; } = SelfHosted( "caravela04cloud" );
28+
29+
public static BuildAgentRequirements SelfHosted( string name ) => new( new BuildAgentRequirement( "env.BuildAgentType", name ) );
30+
31+
public static BuildAgentRequirements JetBrainsHosted( string name ) => new( new BuildAgentRequirement( "teamcity.agent.name", name ) );
32+
33+
public IReadOnlyList<BuildAgentRequirement> Items { get; init; }
34+
35+
public BuildAgentRequirements Combine( BuildAgentRequirements other ) => new( this.Items.Concat( other.Items ).ToArray() );
36+
37+
public virtual bool IsDockerized => false;
3238
}

src/PostSharp.Engineering.BuildTools/ContinuousIntegration/TeamCity/TeamCityBuildConfiguration.cs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -189,12 +189,17 @@ void AddBuildStep( BuildStep newStep )
189189
writer.WriteLine();
190190
writer.WriteLine( " requirements {" );
191191

192-
// TODO: Restore specific agent requirements when JetBrains cloud agent testing is complete.
193-
// foreach ( var environmentVariable in this.BuildAgentRequirements.Items )
194-
// {
195-
// writer.WriteLine( $" equals(\"{environmentVariable.Name}\", \"{environmentVariable.Value}\")" );
196-
// }
197-
writer.WriteLine( " matches(\"teamcity.agent.jvm.os.family\", \"Windows\")" );
192+
foreach ( var requirement in this.BuildAgentRequirements.Items )
193+
{
194+
var comparison = requirement.ComparisonType switch
195+
{
196+
RequirementComparisonType.Equals => "equals",
197+
RequirementComparisonType.Matches => "matches",
198+
_ => "equals"
199+
};
200+
201+
writer.WriteLine( $" {comparison}(\"{requirement.Name}\", \"{requirement.Value}\")" );
202+
}
198203

199204
writer.WriteLine( " }" );
200205
}

src/PostSharp.Engineering.BuildTools/Docker/ContainerHelper.cs

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

3+
using PostSharp.Engineering.BuildTools.ContinuousIntegration.Model;
34
using System;
45

56
namespace PostSharp.Engineering.BuildTools.Docker;
67

78
internal static class ContainerHelper
89
{
9-
public static string GetBuildAgentType( ContainerHostKind hostKind )
10+
public static BuildAgentRequirement[] GetBuildAgentRequirements( ContainerHostKind hostKind )
1011
=> hostKind switch
1112
{
12-
ContainerHostKind.Windows => "docker-win-x64-md",
13+
ContainerHostKind.Windows =>
14+
[
15+
new BuildAgentRequirement( "teamcity.agent.jvm.os.family", "Windows", RequirementComparisonType.Matches ),
16+
new BuildAgentRequirement( "env.PROCESSOR_ARCHITECTURE", "AMD64" )
17+
],
1318

1419
#pragma warning disable CS0612 // Type or member is obsolete
15-
ContainerHostKind.Wsl => "docker-wsl-x64-md",
20+
ContainerHostKind.Wsl =>
21+
[
22+
new BuildAgentRequirement( "teamcity.agent.jvm.os.family", "Linux", RequirementComparisonType.Matches )
23+
],
1624
#pragma warning restore CS0612 // Type or member is obsolete
1725

1826
_ => throw new ArgumentOutOfRangeException( nameof(hostKind) )

src/PostSharp.Engineering.BuildTools/Docker/ContainerHostRequirements.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@ public record ContainerHostRequirements : BuildAgentRequirements
1414
public ContainerHostKind HostKind { get; }
1515

1616
public ContainerHostRequirements( ContainerHostKind hostKind ) : base(
17-
new BuildAgentRequirement( "env.BuildAgentType", ContainerHelper.GetBuildAgentType( hostKind ) ) )
17+
ContainerHelper.GetBuildAgentRequirements( hostKind ) )
1818
{
1919
this.HostKind = hostKind;
2020
}
21+
22+
public override bool IsDockerized => true;
2123
}

0 commit comments

Comments
 (0)