Skip to content

Commit f19f2c0

Browse files
gfraiteurclaude
andcommitted
Add ReuseLastSuccessfulBuild for snapshot dependencies and push locally cached images
Add ReuseLastSuccessfulBuild property to AdditionalCiBuildConfiguration to allow snapshot dependencies to accept the last successful build regardless of source revision. Also push locally cached Docker images to registry when not yet uploaded. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent e996972 commit f19f2c0

File tree

4 files changed

+42
-18
lines changed

4 files changed

+42
-18
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,13 @@ public abstract class AdditionalCiBuildConfiguration
2626
/// </summary>
2727
public BuildConfiguration? BuildSnapshotDependency { get; init; }
2828

29+
/// <summary>
30+
/// Gets or sets a value indicating whether the snapshot dependency should accept the last successful build
31+
/// regardless of the current source snapshot. When <c>true</c>, TeamCity will reuse the last successful build
32+
/// of the dependency instead of requiring a build from the exact same source revision.
33+
/// </summary>
34+
public bool ReuseLastSuccessfulBuild { get; init; }
35+
2936
public bool OnlyCheckoutEngineering { get; init; }
3037

3138
protected AdditionalCiBuildConfiguration( string id, string name )

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,10 @@ internal override TeamCityBuildConfiguration TeamCityBuildConfiguration(
5454
.ToList();
5555

5656
// Create snapshot dependencies for all transitive dependencies
57+
var reuseBuilds = this.ReuseLastSuccessfulBuild ? ReuseBuilds.Successful : ReuseBuilds.Default;
58+
5759
snapshotDependencies =
58-
[new TeamCitySnapshotDependency( buildConfiguration.ObjectName, false, $"+:{buildArtifactsDirectory}/**/*=>{buildArtifactsDirectory}" )];
60+
[new TeamCitySnapshotDependency( buildConfiguration.ObjectName, false, $"+:{buildArtifactsDirectory}/**/*=>{buildArtifactsDirectory}", ReuseBuilds: reuseBuilds )];
5961

6062
snapshotDependencies.AddRange(
6163
dependencies.Select( d => new TeamCitySnapshotDependency(

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,10 +308,17 @@ void AddBuildStep( BuildStep newStep )
308308
_ => throw new ArgumentOutOfRangeException()
309309
};
310310

311+
var reuseBuildsLine = dependency.ReuseBuilds switch
312+
{
313+
ReuseBuilds.Successful => $"\n reuseBuilds = ReuseBuilds.SUCCESSFUL",
314+
ReuseBuilds.Any => $"\n reuseBuilds = ReuseBuilds.ANY",
315+
_ => ""
316+
};
317+
311318
writer.WriteLine(
312319
$@" dependency({objectName}) {{
313320
snapshot {{
314-
onDependencyFailure = FailureAction.{failureAction}
321+
onDependencyFailure = FailureAction.{failureAction}{reuseBuildsLine}
315322
}}" );
316323

317324
if ( dependency.ArtifactRules != null )
Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,25 @@
1-
// Copyright (c) SharpCrafters s.r.o. See the LICENSE.md file in the root directory of this repository root for details.
2-
3-
namespace PostSharp.Engineering.BuildTools.ContinuousIntegration.TeamCity;
4-
5-
internal record TeamCitySnapshotDependency(
6-
string ObjectId,
7-
bool IsAbsoluteId,
8-
string? ArtifactRules = null,
9-
FailureAction FailureAction = FailureAction.FailToStart );
10-
11-
internal enum FailureAction
12-
{
13-
FailToStart,
14-
AddProblem,
15-
Ignore,
16-
Cancel
1+
// Copyright (c) SharpCrafters s.r.o. See the LICENSE.md file in the root directory of this repository root for details.
2+
3+
namespace PostSharp.Engineering.BuildTools.ContinuousIntegration.TeamCity;
4+
5+
internal record TeamCitySnapshotDependency(
6+
string ObjectId,
7+
bool IsAbsoluteId,
8+
string? ArtifactRules = null,
9+
FailureAction FailureAction = FailureAction.FailToStart,
10+
ReuseBuilds ReuseBuilds = ReuseBuilds.Default );
11+
12+
internal enum FailureAction
13+
{
14+
FailToStart,
15+
AddProblem,
16+
Ignore,
17+
Cancel
18+
}
19+
20+
internal enum ReuseBuilds
21+
{
22+
Default,
23+
Successful,
24+
Any
1725
}

0 commit comments

Comments
 (0)