diff --git a/build-utils/Build.Utilities.Tests/Versioning/VersioningTests.cs b/build-utils/Build.Utilities.Tests/Versioning/VersioningTests.cs index 6819a80d..f2d79555 100644 --- a/build-utils/Build.Utilities.Tests/Versioning/VersioningTests.cs +++ b/build-utils/Build.Utilities.Tests/Versioning/VersioningTests.cs @@ -280,7 +280,7 @@ public async Task ExactVersioningValid() { [Test] public void ExactVersioningWithNullThrows() { // Arrange - var strategy = new ExactVersioning( Configuration.Release, " ", null!, null! ); + var strategy = new ExactVersioning( Configuration.Release, " ", ReleaseType.None, null!, null! ); // Assert Assert.ThrowsAsync( async () => await strategy.GetVersionAsync() ); @@ -302,6 +302,48 @@ public async Task ExactVersioningValidWithReleaseVersion() { await Assert.That( strategy.GetType() ).IsEqualTo( typeof(ExactVersioning) ); await Assert.That( version.ToString() ).IsEqualTo( "1.5.0" ); } + + [Test] + public async Task ExactVersioningReleaseImageReferencesIncludesLatest() { + // Arrange + var build = new TestNukeBuild() + .WithExecutionPlan( b => b.CreateRelease ) + .WithReleaseType( ReleaseType.Release ); + + // Act + var factory = new VersioningStrategyFactory( build ); + var strategy = factory.Create( Configuration.Release, null, "1.0.0-alpha.5", null!, null! ); + var refs = await strategy.Release!.GetImageReferences(); + var tags = refs.Select( r => r.Tag.ToString() ).ToList(); + + // Assert + using ( Assert.Multiple() ) { + await Assert.That( tags ).Contains( "latest" ); + await Assert.That( tags ).Contains( "1.0.0-alpha.5" ); + await Assert.That( tags ).Count().IsEqualTo( 2 ); + } + } + + [Test] + public async Task ExactVersioningPreReleaseImageReferencesDoesNotIncludeLatest() { + // Arrange + var build = new TestNukeBuild() + .WithExecutionPlan( b => b.CreatePreRelease ) + .WithReleaseType( ReleaseType.PreRelease ); + + // Act + var factory = new VersioningStrategyFactory( build ); + var strategy = factory.Create( Configuration.Release, null, "0.0.0-windows.10.20260319202632", null, null ); + var refs = await strategy.Release!.GetImageReferences(); + var tags = refs.Select( r => r.Tag.ToString() ).ToList(); + + // Assert + using ( Assert.Multiple() ) { + await Assert.That( tags ).DoesNotContain( "latest" ); + await Assert.That( tags ).Contains( "0.0.0-windows.10.20260319202632" ); + await Assert.That( tags ).Count().IsEqualTo( 1 ); + } + } } internal sealed class NukeBuildWithArbitraryTarget : TestNukeBuild { diff --git a/build-utils/Build.Utilities/Versioning/Strategies/ExactVersioning.cs b/build-utils/Build.Utilities/Versioning/Strategies/ExactVersioning.cs index b575fda0..4d564496 100644 --- a/build-utils/Build.Utilities/Versioning/Strategies/ExactVersioning.cs +++ b/build-utils/Build.Utilities/Versioning/Strategies/ExactVersioning.cs @@ -1,3 +1,4 @@ +using HLabs.ImageReferences; using Nuke.Common.Git; using Octokit; using Semver; @@ -7,6 +8,7 @@ namespace Drift.Build.Utilities.Versioning.Strategies; public sealed class ExactVersioning( Configuration configuration, string? version, + ReleaseType releaseType, GitRepository repository, IGitHubClient gitHubClient ) : ReleaseVersioningBase( configuration, repository, gitHubClient ) { @@ -21,4 +23,13 @@ public override Task GetVersionAsync() { public override async Task GetNameAsync() { return CreateReleaseName( await GetVersionAsync(), includeMetadata: true ); } + + public override async Task> GetImageReferences() { + var refs = await base.GetImageReferences(); + if ( releaseType == ReleaseType.Release ) { // TODO not very clean location + return ["hojmark/drift".Image().Qualify( Tag.Latest ), ..refs]; + } + + return refs; + } } \ No newline at end of file diff --git a/build-utils/Build.Utilities/Versioning/VersioningStrategyFactory.cs b/build-utils/Build.Utilities/Versioning/VersioningStrategyFactory.cs index 99662eff..86ba6375 100644 --- a/build-utils/Build.Utilities/Versioning/VersioningStrategyFactory.cs +++ b/build-utils/Build.Utilities/Versioning/VersioningStrategyFactory.cs @@ -27,7 +27,7 @@ GitRepository repository ); } - var strategy = new ExactVersioning( configuration, exactVersion, repository, gitHubClient ); + var strategy = new ExactVersioning( configuration, exactVersion, releaseType, repository, gitHubClient ); Log.Information( "Versioning strategy is {Strategy}", strategy.GetType().Name ); return strategy; }