Skip to content

Commit 6004feb

Browse files
committed
Fixed TeamCity script generation.
1 parent 6d3f1ba commit 6004feb

File tree

13 files changed

+131
-101
lines changed

13 files changed

+131
-101
lines changed

.teamcity/settings.kts

Lines changed: 40 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,18 @@ object DebugBuild : BuildType({
2727

2828
name = "Build [Debug]"
2929

30-
artifactRules = "+:artifacts/publish/public/**/*=>artifacts/publish/public\n+:artifacts/publish/private/**/*=>artifacts/publish/private\n+:artifacts/testResults/**/*=>artifacts/testResults\n+:artifacts/logs/**/*=>logs\n+:artifacts/dumps/**/*=>dumps\n"
30+
artifactRules = """+:artifacts/publish/public/**/*=>artifacts/publish/public
31+
+:artifacts/publish/private/**/*=>artifacts/publish/private
32+
+:artifacts/testResults/**/*=>artifacts/testResults
33+
+:artifacts/logs/**/*=>logs
34+
+:artifacts/dumps/**/*=>dumps
35+
"""
3136

3237
params {
33-
param("PrepareImage.Timeout", "120")
34-
param("Build.Timeout", "35")
3538
text("Build.Arguments", "", label = "DockerBuild.ps1 Arguments", description = "Arguments to append to the 'Build' build step.", allowEmpty = true)
39+
param("Build.Timeout", "30")
3640
text("DefaultBranch", "develop/2023.2", label = "Default Branch", description = "The default branch of this build configuration.")
41+
text("Timeout", "30", label = "Time-Out", description = "Timeout, in minutes.", regex = """\d+""", validationMessage = "The timeout has to be an integer number.")
3742
}
3843

3944
vcs {
@@ -49,7 +54,6 @@ object DebugBuild : BuildType({
4954
}
5055
noProfile = false
5156
scriptArgs = "-BuildImage -ImageName postsharpengineering-2023.2"
52-
executionTimeoutMin = "%PrepareImage.Timeout%.toInt()"
5357
}
5458
powerShell {
5559
name = "Build"
@@ -58,10 +62,12 @@ object DebugBuild : BuildType({
5862
path = "DockerBuild.ps1"
5963
}
6064
noProfile = false
61-
scriptArgs = "-ImageName postsharpengineering-2023.2 -NoBuildImage test --configuration Debug --buildNumber %build.number% --buildType %system.teamcity.buildType.id% %Build.Arguments%"
62-
executionTimeoutMin = "%Build.Timeout%.toInt()"
65+
scriptArgs = "-ImageName postsharpengineering-2023.2 -NoBuildImage test --configuration Debug --buildNumber %build.number% --buildType %system.teamcity.buildType.id% %Build.Arguments% -Timeout %Build.Timeout%"
6366
}
6467
}
68+
failureConditions {
69+
executionTimeoutMin = "%Timeout%".toInt()
70+
}
6571

6672
requirements {
6773
equals("env.BuildAgentType", "docker-win-x64-md")
@@ -89,13 +95,18 @@ object ReleaseBuild : BuildType({
8995

9096
name = "Build [Release]"
9197

92-
artifactRules = "+:artifacts/publish/public/**/*=>artifacts/publish/public\n+:artifacts/publish/private/**/*=>artifacts/publish/private\n+:artifacts/testResults/**/*=>artifacts/testResults\n+:artifacts/logs/**/*=>logs\n+:artifacts/dumps/**/*=>dumps\n"
98+
artifactRules = """+:artifacts/publish/public/**/*=>artifacts/publish/public
99+
+:artifacts/publish/private/**/*=>artifacts/publish/private
100+
+:artifacts/testResults/**/*=>artifacts/testResults
101+
+:artifacts/logs/**/*=>logs
102+
+:artifacts/dumps/**/*=>dumps
103+
"""
93104

94105
params {
95-
param("PrepareImage.Timeout", "120")
96-
param("Build.Timeout", "35")
97106
text("Build.Arguments", "", label = "DockerBuild.ps1 Arguments", description = "Arguments to append to the 'Build' build step.", allowEmpty = true)
107+
param("Build.Timeout", "30")
98108
text("DefaultBranch", "develop/2023.2", label = "Default Branch", description = "The default branch of this build configuration.")
109+
text("Timeout", "30", label = "Time-Out", description = "Timeout, in minutes.", regex = """\d+""", validationMessage = "The timeout has to be an integer number.")
99110
}
100111

101112
vcs {
@@ -111,7 +122,6 @@ object ReleaseBuild : BuildType({
111122
}
112123
noProfile = false
113124
scriptArgs = "-BuildImage -ImageName postsharpengineering-2023.2"
114-
executionTimeoutMin = "%PrepareImage.Timeout%.toInt()"
115125
}
116126
powerShell {
117127
name = "Build"
@@ -120,10 +130,12 @@ object ReleaseBuild : BuildType({
120130
path = "DockerBuild.ps1"
121131
}
122132
noProfile = false
123-
scriptArgs = "-ImageName postsharpengineering-2023.2 -NoBuildImage test --configuration Release --buildNumber %build.number% --buildType %system.teamcity.buildType.id% %Build.Arguments%"
124-
executionTimeoutMin = "%Build.Timeout%.toInt()"
133+
scriptArgs = "-ImageName postsharpengineering-2023.2 -NoBuildImage test --configuration Release --buildNumber %build.number% --buildType %system.teamcity.buildType.id% %Build.Arguments% -Timeout %Build.Timeout%"
125134
}
126135
}
136+
failureConditions {
137+
executionTimeoutMin = "%Timeout%".toInt()
138+
}
127139

128140
requirements {
129141
equals("env.BuildAgentType", "docker-win-x64-md")
@@ -142,13 +154,18 @@ object PublicBuild : BuildType({
142154

143155
name = "Build [Public]"
144156

145-
artifactRules = "+:artifacts/publish/public/**/*=>artifacts/publish/public\n+:artifacts/publish/private/**/*=>artifacts/publish/private\n+:artifacts/testResults/**/*=>artifacts/testResults\n+:artifacts/logs/**/*=>logs\n+:artifacts/dumps/**/*=>dumps\n"
157+
artifactRules = """+:artifacts/publish/public/**/*=>artifacts/publish/public
158+
+:artifacts/publish/private/**/*=>artifacts/publish/private
159+
+:artifacts/testResults/**/*=>artifacts/testResults
160+
+:artifacts/logs/**/*=>logs
161+
+:artifacts/dumps/**/*=>dumps
162+
"""
146163

147164
params {
148-
param("PrepareImage.Timeout", "120")
149-
param("Build.Timeout", "35")
150165
text("Build.Arguments", "", label = "DockerBuild.ps1 Arguments", description = "Arguments to append to the 'Build' build step.", allowEmpty = true)
166+
param("Build.Timeout", "30")
151167
text("DefaultBranch", "develop/2023.2", label = "Default Branch", description = "The default branch of this build configuration.")
168+
text("Timeout", "30", label = "Time-Out", description = "Timeout, in minutes.", regex = """\d+""", validationMessage = "The timeout has to be an integer number.")
152169
}
153170

154171
vcs {
@@ -164,7 +181,6 @@ object PublicBuild : BuildType({
164181
}
165182
noProfile = false
166183
scriptArgs = "-BuildImage -ImageName postsharpengineering-2023.2"
167-
executionTimeoutMin = "%PrepareImage.Timeout%.toInt()"
168184
}
169185
powerShell {
170186
name = "Build"
@@ -173,10 +189,12 @@ object PublicBuild : BuildType({
173189
path = "DockerBuild.ps1"
174190
}
175191
noProfile = false
176-
scriptArgs = "-ImageName postsharpengineering-2023.2 -NoBuildImage test --configuration Public --buildNumber %build.number% --buildType %system.teamcity.buildType.id% %Build.Arguments%"
177-
executionTimeoutMin = "%Build.Timeout%.toInt()"
192+
scriptArgs = "-ImageName postsharpengineering-2023.2 -NoBuildImage test --configuration Public --buildNumber %build.number% --buildType %system.teamcity.buildType.id% %Build.Arguments% -Timeout %Build.Timeout%"
178193
}
179194
}
195+
failureConditions {
196+
executionTimeoutMin = "%Timeout%".toInt()
197+
}
180198

181199
requirements {
182200
equals("env.BuildAgentType", "docker-win-x64-md")
@@ -198,11 +216,9 @@ object PublicDeployment : BuildType({
198216
type = Type.DEPLOYMENT
199217

200218
params {
201-
param("PrepareImage.Timeout", "120")
202-
param("Publish.Timeout", "15")
203219
text("Publish.Arguments", "", label = "DockerBuild.ps1 Arguments", description = "Arguments to append to the 'Publish' build step.", allowEmpty = true)
204220
text("DefaultBranch", "develop/2023.2", label = "Default Branch", description = "The default branch of this build configuration.")
205-
text("Timeout.All", "30", label = "Time-Out", description = "Timeout, in minutes.", regex = """\d+""", validationMessage = "The timeout has to be an integer number.")
221+
text("Timeout", "30", label = "Time-Out", description = "Timeout, in minutes.", regex = """\d+""", validationMessage = "The timeout has to be an integer number.")
206222
}
207223

208224
vcs {
@@ -218,7 +234,6 @@ object PublicDeployment : BuildType({
218234
}
219235
noProfile = false
220236
scriptArgs = "-BuildImage -ImageName postsharpengineering-2023.2"
221-
executionTimeoutMin = "%PrepareImage.Timeout%.toInt()"
222237
}
223238
powerShell {
224239
name = "Publish"
@@ -228,11 +243,10 @@ object PublicDeployment : BuildType({
228243
}
229244
noProfile = false
230245
scriptArgs = "-ImageName postsharpengineering-2023.2 -NoBuildImage publish --configuration Public %Publish.Arguments%"
231-
232246
}
233247
}
234248
failureConditions {
235-
executionTimeoutMin = 30
249+
executionTimeoutMin = "%Timeout%".toInt()
236250
}
237251

238252
requirements {
@@ -266,11 +280,9 @@ object VersionBump : BuildType({
266280
name = "Version Bump"
267281

268282
params {
269-
param("PrepareImage.Timeout", "120")
270-
param("Bump.Timeout", "15")
271283
text("Bump.Arguments", "", label = "DockerBuild.ps1 Arguments", description = "Arguments to append to the 'Bump' build step.", allowEmpty = true)
272284
text("DefaultBranch", "develop/2023.2", label = "Default Branch", description = "The default branch of this build configuration.")
273-
text("Timeout.All", "15", label = "Time-Out", description = "Timeout, in minutes.", regex = """\d+""", validationMessage = "The timeout has to be an integer number.")
285+
text("Timeout", "15", label = "Time-Out", description = "Timeout, in minutes.", regex = """\d+""", validationMessage = "The timeout has to be an integer number.")
274286
}
275287

276288
vcs {
@@ -286,7 +298,6 @@ object VersionBump : BuildType({
286298
}
287299
noProfile = false
288300
scriptArgs = "-BuildImage -ImageName postsharpengineering-2023.2"
289-
executionTimeoutMin = "%PrepareImage.Timeout%.toInt()"
290301
}
291302
powerShell {
292303
name = "Bump"
@@ -296,11 +307,10 @@ object VersionBump : BuildType({
296307
}
297308
noProfile = false
298309
scriptArgs = "-ImageName postsharpengineering-2023.2 -NoBuildImage bump %Bump.Arguments%"
299-
300310
}
301311
}
302312
failureConditions {
303-
executionTimeoutMin = 15
313+
executionTimeoutMin = "%Timeout%".toInt()
304314
}
305315

306316
requirements {

src/PostSharp.Engineering.BuildTools/Build/BuildConfigurationInfo.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,6 @@ public record BuildConfigurationInfo(
4040
bool ExportsToTeamCityDeploy = true,
4141
bool ExportsToTeamCityDeployWithoutDependencies = false,
4242
bool RequiresUpstreamCheck = false,
43-
TimeSpan? BuildTimeOutThreshold = null,
44-
TimeSpan? DeploymentTimeOutThreshold = null,
45-
TimeSpan? SwapTimeOutThreshold = null );
43+
TimeSpan? BuildTimeout = null,
44+
TimeSpan? DeploymentTimeout = null,
45+
TimeSpan? SwapTimeout = null );

src/PostSharp.Engineering.BuildTools/Build/BuildContext.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,5 +180,20 @@ public BuildContext WithUseProjectDirectoryAsWorkingDirectory( bool useProjectDi
180180

181181
[PublicAPI]
182182
public CommonCommandSettings Settings { get; }
183+
184+
internal TimeSpan BuildTimeout
185+
{
186+
get
187+
{
188+
var setting = (this.Settings as BuildSettings)?.Timeout;
189+
190+
#pragma warning disable CS0618 // Type or member is obsolete
191+
return setting == null ? this.Product.BuildTimeout : TimeSpan.FromMinutes( setting.Value );
192+
#pragma warning restore CS0618 // Type or member is obsolete
193+
}
194+
}
195+
196+
// Adds a margin to dump the hanging processes.
197+
internal TimeSpan BuildTimeoutWithMargin => this.BuildTimeout.Add( TimeSpan.FromMinutes( 5 ) );
183198
}
184199
}

src/PostSharp.Engineering.BuildTools/Build/BuildSettings.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,10 @@ public int? SolutionId
179179
[CommandOption( "--user" )]
180180
public string UserName { get; set; } = Environment.GetEnvironmentVariable( EnvironmentVariableNames.EngUserName ) ?? Environment.UserName;
181181

182+
[Description( "Overrides the build timeout." )]
183+
[CommandOption( "--timeout" )]
184+
public int? Timeout { get; set; }
185+
182186
public BuildSettings WithIncludeTests( bool value )
183187
{
184188
var clone = (BuildSettings) this.MemberwiseClone();

src/PostSharp.Engineering.BuildTools/Build/Files/TeamCitySettingsFile.cs

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ private static bool TryWriteStandalone( BuildContext context, CommonCommandSetti
141141
dockerSpec: product.DockerSpec ) );
142142
}
143143

144-
teamCityBuildSteps.Add( new TeamCityEngineeringBuildBuildStep( configuration, true, product.DockerSpec, product.BuildTimeoutPlusMargin ) );
144+
teamCityBuildSteps.Add( new TeamCityEngineeringBuildBuildStep( configuration, true, product.DockerSpec, context.BuildTimeout ) );
145145

146146
if ( !product.UseDocker )
147147
{
@@ -210,7 +210,7 @@ TeamCityBuildStep CreatePublishBuildStep( bool isStandalone = false )
210210
.Select( d => new TeamCitySnapshotDependency( d.CiConfiguration.DeploymentBuildType!, true ) ) )
211211
.OrderBy( d => d.ObjectId )
212212
.ToArray(),
213-
BuildTimeOutThreshold = configurationInfo.DeploymentTimeOutThreshold ?? product.DeploymentTimeout,
213+
Timeout = configurationInfo.DeploymentTimeout ?? product.DeploymentTimeout,
214214
IsSshAgentRequired = isRepoRemoteSsh
215215
};
216216

@@ -235,7 +235,7 @@ TeamCityBuildStep CreatePublishBuildStep( bool isStandalone = false )
235235
.Concat( [new TeamCitySnapshotDependency( teamCityBuildConfiguration.ObjectName, false, deployedArtifactRules )] )
236236
.OrderBy( d => d.ObjectId )
237237
.ToArray(),
238-
BuildTimeOutThreshold = configurationInfo.DeploymentTimeOutThreshold ?? product.DeploymentTimeout,
238+
Timeout = configurationInfo.DeploymentTimeout ?? product.DeploymentTimeout,
239239
IsSshAgentRequired = isRepoRemoteSsh
240240
};
241241

@@ -269,7 +269,7 @@ TeamCityBuildStep CreatePublishBuildStep( bool isStandalone = false )
269269
],
270270
IsDeployment = true,
271271
SnapshotDependencies = swapDependencies.OrderBy( d => d.ObjectId ).ToArray(),
272-
BuildTimeOutThreshold = configurationInfo.SwapTimeOutThreshold ?? product.SwapTimeout
272+
Timeout = configurationInfo.SwapTimeout ?? product.SwapTimeout
273273
} );
274274
}
275275
}
@@ -294,7 +294,7 @@ TeamCityBuildStep CreatePublishBuildStep( bool isStandalone = false )
294294
[
295295
new TeamCityEngineeringCommandBuildStep( "Bump", "Bump", "bump", areCustomArgumentsAllowed: true, dockerSpec: product.DockerSpec )
296296
],
297-
BuildTimeOutThreshold = product.VersionBumpTimeout,
297+
Timeout = product.VersionBumpTimeout,
298298
IsSshAgentRequired = isRepoRemoteSsh
299299
} );
300300
}
@@ -327,7 +327,7 @@ TeamCityBuildStep CreatePublishBuildStep( bool isStandalone = false )
327327
],
328328
SnapshotDependencies = snapshotDependencies,
329329
BuildTriggers = [new SourceBuildTrigger()],
330-
BuildTimeOutThreshold = product.DownstreamMergeTimeout,
330+
Timeout = product.DownstreamMergeTimeout,
331331
IsSshAgentRequired = isRepoRemoteSsh
332332
} );
333333
}
@@ -554,7 +554,7 @@ bool TryPopulateBuildConfigurations(
554554
}
555555

556556
var nuGetBuildSteps =
557-
new TeamCityBuildStep[] { new TeamCityEngineeringBuildBuildStep( configuration, false, dockerSpec, product.BuildTimeoutPlusMargin ) };
557+
new TeamCityBuildStep[] { new TeamCityEngineeringBuildBuildStep( configuration, false, dockerSpec, context.BuildTimeout ) };
558558

559559
// The default branch is the same as for public build of any other project - see the build configuration of a regular project.
560560
nuGetBuildConfiguration = new TeamCityBuildConfiguration(
@@ -911,10 +911,7 @@ bool TryAddPreOrPostDeploymentBuildConfiguration(
911911
var publicNuGetBuildCiId = $"{consolidatedProjectIdPrefix}{MarkNuGetObjectId( publicBuildObjectName )}";
912912
var publicNuGetDeploymentCiId = $"{consolidatedProjectIdPrefix}{MarkNuGetObjectId( publicDeploymentObjectName )}";
913913

914-
var nuGetPublicDeploymentSteps = new TeamCityBuildStep[]
915-
{
916-
new TeamCityEngineeringPublishBuildStep( publicConfiguration, product.DockerSpec, product.BuildTimeoutPlusMargin )
917-
};
914+
var nuGetPublicDeploymentSteps = new TeamCityBuildStep[] { new TeamCityEngineeringPublishBuildStep( publicConfiguration, product.DockerSpec, null ) };
918915

919916
// TODO: Only Public builds of dependencies that define version need to be included.
920917
// Here we include all Public builds which will cause download of all artifacts.
@@ -937,7 +934,7 @@ bool TryAddPreOrPostDeploymentBuildConfiguration(
937934
{
938935
BuildSteps = nuGetPublicDeploymentSteps,
939936
SnapshotDependencies = nuGetPublicDeploymentDependencies.ToArray(),
940-
BuildTimeOutThreshold = product.DeploymentTimeout,
937+
Timeout = product.DeploymentTimeout,
941938
IsDeployment = true
942939
} );
943940

src/PostSharp.Engineering.BuildTools/Build/Model/Product.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,10 +128,12 @@ public BuildAgentRequirements ResolvedBuildAgentRequirements
128128

129129
public ConfigurationSpecific<BuildConfigurationInfo> Configurations { get; init; } = DefaultConfigurations;
130130

131-
public TimeSpan BuildTimeout { get; init; } = TimeSpan.FromMinutes( 30 );
132-
133-
// Adds a margin for process dumps.
134-
public TimeSpan BuildTimeoutPlusMargin => this.BuildTimeout.Add( TimeSpan.FromMinutes( 5 ) );
131+
public TimeSpan BuildTimeout
132+
{
133+
[Obsolete( "Get BuildContext.BuildTimeout." )]
134+
get;
135+
init;
136+
} = TimeSpan.FromMinutes( 30 );
135137

136138
public TimeSpan DeploymentTimeout { get; init; } = TimeSpan.FromMinutes( 30 );
137139

src/PostSharp.Engineering.BuildTools/Build/Solutions/DotNetSolution.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ private string GetFinalSolutionPath( BuildContext context )
3333
=> FileSystemHelper.GetFinalPath( Path.Combine( context.RepoDirectory, this.SolutionPath ) );
3434

3535
private ToolInvocationOptions CreateInvocationOptions( BuildContext context )
36-
=> new( this.EnvironmentVariables ) { ExecutionTimeout = context.Product.BuildTimeout, MinidumpDirectory = context.Product.DumpDirectory };
36+
=> new( this.EnvironmentVariables ) { ExecutionTimeout = context.BuildTimeout, MinidumpDirectory = context.Product.DumpDirectory };
3737

3838
private bool RunDotNet(
3939
BuildContext context,

src/PostSharp.Engineering.BuildTools/ContinuousIntegration/Model/BuildSteps/TeamCityBuildStep.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,9 @@ public abstract class TeamCityBuildStep
1717
public abstract string GenerateTeamCityCode();
1818

1919
public virtual void InsertPrerequisites( IReadOnlyList<TeamCityBuildStep> previousSteps, Action<TeamCityBuildStep> addStep ) { }
20+
21+
/// <summary>
22+
/// Gets a time that should be added to the complete build configuration timeout.
23+
/// </summary>
24+
public virtual TimeSpan AdditionalTimeout { get; init; } = TimeSpan.Zero;
2025
}

0 commit comments

Comments
 (0)