Skip to content

Commit 6c9365d

Browse files
committed
Docker: fixed TeamCity script generation.
1 parent 659ef35 commit 6c9365d

File tree

10 files changed

+120
-51
lines changed

10 files changed

+120
-51
lines changed

.teamcity/settings.kts

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ object DebugBuild : BuildType({
4141

4242
steps {
4343
powerShell {
44-
name = "Prepare the Docker image"
44+
name = "Prepare Docker image postsharpengineering-2023.2"
4545
id = "PrepareImage"
4646
scriptMode = file {
4747
path = "DockerBuild.ps1"
@@ -103,7 +103,7 @@ object ReleaseBuild : BuildType({
103103

104104
steps {
105105
powerShell {
106-
name = "Prepare the Docker image"
106+
name = "Prepare Docker image postsharpengineering-2023.2"
107107
id = "PrepareImage"
108108
scriptMode = file {
109109
path = "DockerBuild.ps1"
@@ -156,7 +156,7 @@ object PublicBuild : BuildType({
156156

157157
steps {
158158
powerShell {
159-
name = "Prepare the Docker image"
159+
name = "Prepare Docker image postsharpengineering-2023.2"
160160
id = "PrepareImage"
161161
scriptMode = file {
162162
path = "DockerBuild.ps1"
@@ -208,14 +208,23 @@ object PublicDeployment : BuildType({
208208
}
209209

210210
steps {
211+
powerShell {
212+
name = "Prepare Docker image postsharpengineering-2023.2"
213+
id = "PrepareImage"
214+
scriptMode = file {
215+
path = "DockerBuild.ps1"
216+
}
217+
noProfile = false
218+
scriptArgs = "-BuildImage -ImageName postsharpengineering-2023.2"
219+
}
211220
powerShell {
212221
name = "Publish"
213222
id = "Publish"
214223
scriptMode = file {
215-
path = "Build.ps1"
224+
path = "DockerBuild.ps1"
216225
}
217226
noProfile = false
218-
scriptArgs = "publish --configuration Public %PublishArguments%"
227+
scriptArgs = "-ImageName postsharpengineering-2023.2 -NoBuildImage publish --configuration Public %PublishArguments%"
219228
}
220229
}
221230
failureConditions {
@@ -267,14 +276,23 @@ object VersionBump : BuildType({
267276
}
268277

269278
steps {
279+
powerShell {
280+
name = "Prepare Docker image postsharpengineering-2023.2"
281+
id = "PrepareImage"
282+
scriptMode = file {
283+
path = "DockerBuild.ps1"
284+
}
285+
noProfile = false
286+
scriptArgs = "-BuildImage -ImageName postsharpengineering-2023.2"
287+
}
270288
powerShell {
271289
name = "Bump"
272290
id = "Bump"
273291
scriptMode = file {
274-
path = "Build.ps1"
292+
path = "DockerBuild.ps1"
275293
}
276294
noProfile = false
277-
scriptArgs = "bump %BumpArguments%"
295+
scriptArgs = "-ImageName postsharpengineering-2023.2 -NoBuildImage bump %BumpArguments%"
278296
}
279297
}
280298
failureConditions {

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

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,7 @@ private static bool TryWriteStandalone( BuildContext context, CommonCommandSetti
114114

115115
var teamCityBuildSteps = new List<TeamCityBuildStep>();
116116

117-
if ( product.UseDocker )
118-
{
119-
teamCityBuildSteps.Add( new TeamCityEngineeringPrepareImageBuildStep( "PrepareImage", "Prepare the Docker image", product.DockerSpec! ) );
120-
}
121-
else
117+
if ( !product.UseDocker )
122118
{
123119
teamCityBuildSteps.Add( new TeamCityEngineeringCommandBuildStep( "PreKill", "Kill background processes before cleanup", "tools kill" ) );
124120
}
@@ -141,7 +137,8 @@ private static bool TryWriteStandalone( BuildContext context, CommonCommandSetti
141137
"UpstreamCheck",
142138
"Check pending upstream changes",
143139
"tools git check-upstream",
144-
areCustomArgumentsAllowed: true ) );
140+
areCustomArgumentsAllowed: true,
141+
dockerSpec: product.DockerSpec ) );
145142
}
146143

147144
teamCityBuildSteps.Add( new TeamCityEngineeringBuildBuildStep( configuration, true, product.DockerSpec ) );
@@ -190,7 +187,8 @@ TeamCityBuildStep CreatePublishBuildStep( bool isStandalone = false )
190187
"Publish",
191188
"publish",
192189
$"--configuration {configuration}{(isStandalone ? " --standalone" : "")}",
193-
true );
190+
true,
191+
product.DockerSpec );
194192

195193
if ( configurationInfo.ExportsToTeamCityDeploy )
196194
{
@@ -268,7 +266,7 @@ TeamCityBuildStep CreatePublishBuildStep( bool isStandalone = false )
268266
{
269267
BuildSteps =
270268
[
271-
new TeamCityEngineeringCommandBuildStep( "Swap", "Swap", "swap", $"--configuration {configuration}", true )
269+
new TeamCityEngineeringCommandBuildStep( "Swap", "Swap", "swap", $"--configuration {configuration}", true, product.DockerSpec )
272270
],
273271
IsDeployment = true,
274272
SnapshotDependencies = swapDependencies.OrderBy( d => d.ObjectId ).ToArray(),
@@ -294,7 +292,9 @@ TeamCityBuildStep CreatePublishBuildStep( bool isStandalone = false )
294292
buildAgentRequirements: product.ResolvedBuildAgentRequirements )
295293
{
296294
BuildSteps =
297-
[new TeamCityEngineeringCommandBuildStep( "Bump", "Bump", "bump", areCustomArgumentsAllowed: true )],
295+
[
296+
new TeamCityEngineeringCommandBuildStep( "Bump", "Bump", "bump", areCustomArgumentsAllowed: true, dockerSpec: product.DockerSpec )
297+
],
298298
BuildTimeOutThreshold = product.VersionBumpTimeOutThreshold,
299299
IsSshAgentRequired = isRepoRemoteSsh
300300
} );
@@ -323,7 +323,8 @@ [new TeamCityEngineeringCommandBuildStep( "Bump", "Bump", "bump", areCustomArgum
323323
"DownstreamMerge",
324324
"Merge downstream",
325325
"tools git merge-downstream",
326-
areCustomArgumentsAllowed: true )
326+
areCustomArgumentsAllowed: true,
327+
dockerSpec: product.DockerSpec )
327328
],
328329
SnapshotDependencies = snapshotDependencies,
329330
BuildTriggers = [new SourceBuildTrigger()],
@@ -551,11 +552,11 @@ bool TryPopulateBuildConfigurations(
551552
defaultBranchParameter,
552553
vcsRootId ) { SnapshotDependencies = dependencies.ToArray(), BuildTriggers = consolidatedBuildTriggers };
553554

554-
ContainerImageSpec? dockerSpec = null;
555+
DockerSpec? dockerSpec = null;
555556

556557
if ( product.UseDocker )
557558
{
558-
dockerSpec = new ContainerImageSpec( $"{product.ProductNameWithoutDot}-{product.ProductFamily.Version}" );
559+
dockerSpec = new DockerSpec( $"{product.ProductNameWithoutDot}-{product.ProductFamily.Version}" );
559560
}
560561

561562
var nuGetBuildSteps =
@@ -722,7 +723,8 @@ TeamCitySourceDependency CreateSourceDependencyFromDefinition( DependencyDefinit
722723
$"Bump{bumpedProjectId.Split( '_' ).Last()}",
723724
$"Bump version of {bumpedProjectName}",
724725
"bump",
725-
areCustomArgumentsAllowed: true ) { WorkingDirectory = $"source-dependencies/{bumpedProjectName}" } );
726+
areCustomArgumentsAllowed: true,
727+
dockerSpec: product.DockerSpec ) { WorkingDirectory = $"source-dependencies/{bumpedProjectName}" } );
726728

727729
consolidatedVersionBumpSourceDependencies.Add( CreateSourceDependencyFromDefinition( dependencyDefinition ) );
728730

@@ -824,7 +826,8 @@ bool TryAddPreOrPostDeploymentBuildConfiguration(
824826
$"{commandName} deployment of {project.Name}",
825827
command,
826828
"--configuration Public --buildNumber %build.number% --buildType %system.teamcity.buildType.id% --use-local-dependencies",
827-
areCustomArgumentsAllowed: true ) { WorkingDirectory = $"source-dependencies/{project.Name}" } );
829+
areCustomArgumentsAllowed: true,
830+
dockerSpec: product.DockerSpec ) { WorkingDirectory = $"source-dependencies/{project.Name}" } );
828831

829832
// Dependencies outside of the product family are fetched from the artifacts.
830833
if ( buildConfigurationsById.TryGetValue( $"{project.Id}_{publicBuildObjectName}", out var publicBuildConfiguration ) )
@@ -869,10 +872,8 @@ bool TryAddPreOrPostDeploymentBuildConfiguration(
869872
$"{objectName}_{consolidatedProjectId.Id}",
870873
$"{commandName} consolidated deployment",
871874
command,
872-
"--configuration Public --buildNumber %build.number% --buildType %system.teamcity.buildType.id% --use-local-dependencies" )
873-
{
874-
WorkingDirectory = $"source-dependencies/{consolidatedProjectName}"
875-
} );
875+
"--configuration Public --buildNumber %build.number% --buildType %system.teamcity.buildType.id% --use-local-dependencies",
876+
dockerSpec: product.DockerSpec ) { WorkingDirectory = $"source-dependencies/{consolidatedProjectName}" } );
876877

877878
var branch = getBranch( product.DependencyDefinition );
878879

@@ -922,7 +923,7 @@ bool TryAddPreOrPostDeploymentBuildConfiguration(
922923
var publicNuGetBuildCiId = $"{consolidatedProjectIdPrefix}{MarkNuGetObjectId( publicBuildObjectName )}";
923924
var publicNuGetDeploymentCiId = $"{consolidatedProjectIdPrefix}{MarkNuGetObjectId( publicDeploymentObjectName )}";
924925

925-
var nuGetPublicDeploymentSteps = new TeamCityBuildStep[] { new TeamCityEngineeringPublishBuildStep( publicConfiguration ) };
926+
var nuGetPublicDeploymentSteps = new TeamCityBuildStep[] { new TeamCityEngineeringPublishBuildStep( publicConfiguration, product.DockerSpec ) };
926927

927928
// TODO: Only Public builds of dependencies that define version need to be included.
928929
// Here we include all Public builds which will cause download of all artifacts.

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,9 +193,9 @@ public ParametrizedDependency[] ParametrizedDependencies
193193

194194
internal bool UseDocker => this.ResolvedBuildAgentRequirements.IsDockerized;
195195

196-
internal ContainerImageSpec? DockerSpec
196+
public DockerSpec? DockerSpec
197197
=> this.ResolvedBuildAgentRequirements.IsDockerized
198-
? new ContainerImageSpec( $"{this.ProductNameWithoutDot}-{this.ProductFamily.Version}".ToLowerInvariant() )
198+
? new DockerSpec( $"{this.ProductNameWithoutDot}-{this.ProductFamily.Version}".ToLowerInvariant() )
199199
: null;
200200

201201
public bool IsPublishingNonReleaseBranchesAllowed { get; init; }
@@ -226,7 +226,7 @@ internal ContainerImageSpec? DockerSpec
226226
/// Gets or sets a value indicating whether the <c>prepare</c> command should generate the <c>nuget.config</c> file.
227227
/// </summary>
228228
public bool GenerateNuGetConfig { get; init; }
229-
229+
230230
/// <summary>
231231
/// Gets or sets the content of the <c>global.json</c> file, if it must be generated by the <c>prepare</c> command. If this property is <c>null</c>,
232232
/// the <c>global.json</c> file is not generated.
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
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 PostSharp.Engineering.BuildTools.ContinuousIntegration.Model.Arguments;
4+
using System;
5+
using System.Collections.Generic;
46

57
namespace PostSharp.Engineering.BuildTools.ContinuousIntegration.Model.BuildSteps;
68

79
public abstract class TeamCityBuildStep
810
{
911
public TeamCityBuildConfigurationParameterBase[]? BuildConfigurationParameters { get; init; }
10-
12+
1113
public abstract string GenerateTeamCityCode();
14+
15+
public virtual void InsertPrerequisites( IReadOnlyList<TeamCityBuildStep> previousSteps, Action<TeamCityBuildStep> addStep ) { }
1216
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ namespace PostSharp.Engineering.BuildTools.ContinuousIntegration.Model.BuildStep
77

88
public class TeamCityEngineeringBuildBuildStep : TeamCityEngineeringCommandBuildStep
99
{
10-
public TeamCityEngineeringBuildBuildStep( BuildConfiguration configuration, bool testOnBuild, ContainerImageSpec? dockerSpec = null ) : base(
10+
public TeamCityEngineeringBuildBuildStep( BuildConfiguration configuration, bool testOnBuild, DockerSpec? dockerSpec ) : base(
1111
"Build",
1212
"Build",
1313
testOnBuild ? "test" : "build",
1414
$"--configuration {configuration} --buildNumber %build.number% --buildType %system.teamcity.buildType.id%",
1515
true,
1616
dockerSpec ) { }
17-
}
17+
}

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

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,16 @@
22

33
using PostSharp.Engineering.BuildTools.ContinuousIntegration.Model.Arguments;
44
using PostSharp.Engineering.BuildTools.Docker;
5+
using System;
6+
using System.Collections.Generic;
7+
using System.Linq;
58

69
namespace PostSharp.Engineering.BuildTools.ContinuousIntegration.Model.BuildSteps;
710

811
public class TeamCityEngineeringCommandBuildStep : TeamCityPowerShellBuildStep
912
{
13+
private readonly DockerSpec? _dockerSpec;
14+
1015
private static string GetCustomArgumentsParameterName( string objectName ) => $"{objectName}Arguments";
1116

1217
public TeamCityEngineeringCommandBuildStep(
@@ -15,12 +20,14 @@ public TeamCityEngineeringCommandBuildStep(
1520
string command,
1621
string? arguments = null,
1722
bool areCustomArgumentsAllowed = false,
18-
ContainerImageSpec? dockerSpec = null ) : base(
23+
DockerSpec? dockerSpec = null ) : base(
1924
id,
2025
name,
2126
dockerSpec != null ? $"DockerBuild.ps1" : "Build.ps1",
2227
GetScriptArguments( id, command, arguments, areCustomArgumentsAllowed, dockerSpec ) )
2328
{
29+
this._dockerSpec = dockerSpec;
30+
2431
if ( areCustomArgumentsAllowed )
2532
{
2633
this.BuildConfigurationParameters =
@@ -34,7 +41,7 @@ public TeamCityEngineeringCommandBuildStep(
3441
}
3542
}
3643

37-
private static string GetScriptArguments( string id, string command, string? arguments, bool areCustomArgumentsAllowed, ContainerImageSpec? dockerSpec)
44+
private static string GetScriptArguments( string id, string command, string? arguments, bool areCustomArgumentsAllowed, DockerSpec? dockerSpec )
3845
{
3946
var args = $"{command}{(arguments == null ? "" : $" {arguments}")}{(!areCustomArgumentsAllowed ? "" : $" %{GetCustomArgumentsParameterName( id )}%")}";
4047

@@ -45,4 +52,21 @@ private static string GetScriptArguments( string id, string command, string? arg
4552

4653
return args;
4754
}
55+
56+
public override void InsertPrerequisites( IReadOnlyList<TeamCityBuildStep> previousSteps, Action<TeamCityBuildStep> addStep )
57+
{
58+
base.InsertPrerequisites( previousSteps, addStep );
59+
60+
if ( this._dockerSpec != null )
61+
{
62+
var prepareImageStep = previousSteps
63+
.OfType<TeamCityEngineeringPrepareImageBuildStep>()
64+
.SingleOrDefault( i => i.DockerSpec.ImageName == this._dockerSpec.ImageName );
65+
66+
if ( prepareImageStep == null )
67+
{
68+
addStep( new TeamCityEngineeringPrepareImageBuildStep( "PrepareImage", this._dockerSpec ) );
69+
}
70+
}
71+
}
4872
}

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,19 @@
55

66
namespace PostSharp.Engineering.BuildTools.ContinuousIntegration.Model.BuildSteps;
77

8-
public class TeamCityEngineeringPrepareImageBuildStep : TeamCityPowerShellBuildStep
8+
internal class TeamCityEngineeringPrepareImageBuildStep : TeamCityPowerShellBuildStep
99
{
10-
private static string GetCustomArgumentsParameterName( string objectName ) => $"{objectName}Arguments";
10+
public DockerSpec DockerSpec { get; }
1111

1212
public TeamCityEngineeringPrepareImageBuildStep(
1313
string id,
14-
string name,
15-
ContainerImageSpec containerImageSpec ) : base(
14+
DockerSpec dockerSpec ) : base(
1615
id,
17-
name,
16+
$"Prepare Docker image {dockerSpec.ImageName}",
1817
$"DockerBuild.ps1",
19-
$"-BuildImage -ImageName {containerImageSpec.ImageName}" )
18+
$"-BuildImage -ImageName {dockerSpec.ImageName}" )
2019
{
20+
this.DockerSpec = dockerSpec;
2121
this.TimeOut = TimeSpan.FromHours( 2 );
2222
}
2323
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@ namespace PostSharp.Engineering.BuildTools.ContinuousIntegration.Model.BuildStep
77

88
public class TeamCityEngineeringPublishBuildStep : TeamCityEngineeringCommandBuildStep
99
{
10-
public TeamCityEngineeringPublishBuildStep( BuildConfiguration configuration, ContainerImageSpec? dockerSpec = null ) : base(
10+
public TeamCityEngineeringPublishBuildStep( BuildConfiguration configuration, DockerSpec? dockerSpec ) : base(
1111
"Publish",
1212
"Publish",
1313
"publish",
1414
$"--configuration {configuration}",
15-
true, dockerSpec ) { }
15+
true,
16+
dockerSpec ) { }
1617
}

0 commit comments

Comments
 (0)