From bb0a792a83ba4e1a92be104ce50f864d6f8bcb3e Mon Sep 17 00:00:00 2001 From: hojmark <1203136+hojmark@users.noreply.github.com> Date: Fri, 13 Feb 2026 22:22:46 +0100 Subject: [PATCH 1/8] chore(deps): update HLabs.ImageReferences --- Directory.Packages.props | 3 +- .../Build.Utilities/Build.Utilities.csproj | 3 +- .../ContainerImage/NukeExtensions.cs | 26 ----- .../Abstractions/IVersioningStrategy.cs | 4 +- .../Versioning/ReleaseVersioningBase.cs | 6 +- .../Strategies/ReleaseVersioning.cs | 6 +- build/NukeBuild.Container.cs | 95 ++++++++++--------- build/NukeBuild.Release.cs | 2 +- build/NukeBuild.Test.cs | 10 +- build/Versioning/SemVersionExtensions.cs | 4 +- build/Versioning/TagExtensions.cs | 9 ++ build/_build.csproj | 2 +- src/Cli.E2ETests/Cli.E2ETests.csproj | 2 +- src/Cli.E2ETests/DriftImageFixture.cs | 11 +-- 14 files changed, 87 insertions(+), 96 deletions(-) delete mode 100644 build-utils/Build.Utilities/ContainerImage/NukeExtensions.cs create mode 100644 build/Versioning/TagExtensions.cs diff --git a/Directory.Packages.props b/Directory.Packages.props index 7e33ca09..01df697a 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -5,7 +5,8 @@ true - + + diff --git a/build-utils/Build.Utilities/Build.Utilities.csproj b/build-utils/Build.Utilities/Build.Utilities.csproj index b09e7820..00736451 100644 --- a/build-utils/Build.Utilities/Build.Utilities.csproj +++ b/build-utils/Build.Utilities/Build.Utilities.csproj @@ -1,7 +1,8 @@  - + + diff --git a/build-utils/Build.Utilities/ContainerImage/NukeExtensions.cs b/build-utils/Build.Utilities/ContainerImage/NukeExtensions.cs deleted file mode 100644 index f23386d4..00000000 --- a/build-utils/Build.Utilities/ContainerImage/NukeExtensions.cs +++ /dev/null @@ -1,26 +0,0 @@ -using HLabs.Containers; -using Nuke.Common.Tools.Docker; - -namespace Drift.Build.Utilities.ContainerImage; - -public static class NukeExtensions { - public static DockerBuildSettings SetTag( this DockerBuildSettings settings, ImageReference imageReference ) { - return settings.SetTag( imageReference.ToString() ); - } - - public static DockerTagSettings SetSourceImage( this DockerTagSettings settings, ImageReference imageReference ) { - return settings.SetSourceImage( imageReference.ToString() ); - } - - public static DockerTagSettings SetTargetImage( this DockerTagSettings settings, ImageReference imageReference ) { - return settings.SetTargetImage( imageReference.ToString() ); - } - - public static DockerLoginSettings SetServer( this DockerLoginSettings settings, ContainerRegistry registry ) { - return settings.SetServer( registry.ToString() ); - } - - public static DockerPushSettings SetName( this DockerPushSettings settings, ImageReference imageReference ) { - return settings.SetName( imageReference.ToString() ); - } -} \ No newline at end of file diff --git a/build-utils/Build.Utilities/Versioning/Abstractions/IVersioningStrategy.cs b/build-utils/Build.Utilities/Versioning/Abstractions/IVersioningStrategy.cs index bc0c6b45..9717cdec 100644 --- a/build-utils/Build.Utilities/Versioning/Abstractions/IVersioningStrategy.cs +++ b/build-utils/Build.Utilities/Versioning/Abstractions/IVersioningStrategy.cs @@ -1,4 +1,4 @@ -using HLabs.Containers; +using HLabs.ImageReferences; using Semver; namespace Drift.Build.Utilities.Versioning.Abstractions; @@ -16,5 +16,5 @@ public interface IReleaseInfo { Task GetGitTagAsync(); - Task> GetImageReferences(); + Task> GetImageReferences(); } \ No newline at end of file diff --git a/build-utils/Build.Utilities/Versioning/ReleaseVersioningBase.cs b/build-utils/Build.Utilities/Versioning/ReleaseVersioningBase.cs index cb4cf4a7..171c2dc1 100644 --- a/build-utils/Build.Utilities/Versioning/ReleaseVersioningBase.cs +++ b/build-utils/Build.Utilities/Versioning/ReleaseVersioningBase.cs @@ -1,5 +1,5 @@ using Drift.Build.Utilities.Versioning.Abstractions; -using HLabs.Containers; +using HLabs.ImageReferences; using JetBrains.Annotations; using Nuke.Common; using Nuke.Common.Git; @@ -51,9 +51,9 @@ public async Task GetGitTagAsync() { return _cachedGitTag; } - public virtual async Task> GetImageReferences() { + public virtual async Task> GetImageReferences() { return [ - ImageReference.DockerIo( "hojmark", "drift", await GetVersionAsync() ) + "hojmark/drift".Image().Qualify( await GetVersionAsync() ) ]; } diff --git a/build-utils/Build.Utilities/Versioning/Strategies/ReleaseVersioning.cs b/build-utils/Build.Utilities/Versioning/Strategies/ReleaseVersioning.cs index ca8c57f5..f4d62a19 100644 --- a/build-utils/Build.Utilities/Versioning/Strategies/ReleaseVersioning.cs +++ b/build-utils/Build.Utilities/Versioning/Strategies/ReleaseVersioning.cs @@ -1,6 +1,6 @@ using System.Globalization; using Drift.Build.Utilities.Versioning.Abstractions; -using HLabs.Containers; +using HLabs.ImageReferences; using Nuke.Common.Git; using Nuke.Common.Tools.GitHub; using Octokit; @@ -51,9 +51,9 @@ public override async Task GetNameAsync() { return CreateReleaseName( await GetVersionAsync(), includeMetadata: false ); } - public override async Task> GetImageReferences() { + public override async Task> GetImageReferences() { return [ - ImageReference.DockerIo( "hojmark", "drift", Tag.Latest ), + "hojmark/drift".Image().Qualify( Tag.Latest ), ..await base.GetImageReferences() ]; } diff --git a/build/NukeBuild.Container.cs b/build/NukeBuild.Container.cs index 1057e5c9..bc4294c8 100644 --- a/build/NukeBuild.Container.cs +++ b/build/NukeBuild.Container.cs @@ -1,10 +1,12 @@ using System.Linq; using Drift.Build.Utilities; -using Drift.Build.Utilities.ContainerImage; -using HLabs.Containers; +using HLabs.ImageReferences; +using HLabs.ImageReferences.Extensions.Nuke; +using JetBrains.Annotations; using Nuke.Common; using Nuke.Common.Tools.Docker; using Serilog; +using Versioning; // ReSharper disable VariableHidesOuterVariable // ReSharper disable AllUnderscoreLocalParameterName @@ -23,23 +25,25 @@ partial class NukeBuild { [Parameter( "DockerHubPassword - Required for releasing container images to Docker Hub" )] public readonly string DockerHubPassword; + private static readonly PartialImageRef DriftImage = new("drift"); + private static readonly PartialImageRef LocalDriftImage = DriftImage.With( Registry.Localhost ); + private static readonly PartialImageRef DockerHubDriftImage = DriftImage.With( Registry.DockerHub, "hojmark" ); + [CanBeNull] private CanonicalImageRef CanonicalDriftImage = null; + [CanBeNull] private ImageId DriftImageId = null; + Target PublishContainer => _ => _ .DependsOn( PublishBinaries, CleanArtifacts ) .Requires( () => Commit ) .Executes( async () => { using var _ = new OperationTimer( nameof(PublishContainer) ); - // TODO use GetContainerImageReferences (.WithRepo(repo)) var version = await Versioning.Value.GetVersionAsync(); - var localTagVersion = ImageReference.Localhost( "drift", version ); + Log.Information( "Building container image..." ); // var created = DateTime.UtcNow.ToString( "o", CultureInfo.InvariantCulture ); // o = round-trip format / ISO 8601 - - Log.Information( "Building container image {Tag}", localTagVersion ); - DockerTasks.DockerBuild( s => s + var output = DockerTasks.DockerBuild( s => s .SetPath( RootDirectory ) .SetFile( "Containerfile" ) - .SetTag( localTagVersion ) .SetLabel( // Timestamping prevents the build from being idempotent // $"\"org.opencontainers.image.created={created}\"", @@ -48,13 +52,22 @@ partial class NukeBuild { ) ); - // For convenience, tag the image with dev as well - var localTagDev = localTagVersion.WithTag( Tag.Dev ); - Log.Information( "Re-tagging {LocalTagVersion} -> {LocalTagDev}", localTagVersion, localTagDev ); + var imageId = new ImageId( output.Last().Text ); + Log.Information( "Image ID is {ImageId}", imageId ); + + Log.Information( "Tagging image..." ); + // For convenience, tag the image with dev + var devTag = LocalDriftImage.Qualify( Tag.Dev ); DockerTasks.DockerTag( s => s - .SetSourceImage( localTagVersion ) - .SetTargetImage( localTagDev ) + .SetSourceImage( imageId ) + .SetTargetImage( devTag ) ); + + // Determine canonical image reference + var digest = imageId.GetDigest(); + DriftImageId = imageId; + CanonicalDriftImage = LocalDriftImage.Canonicalize( digest ); + Log.Information( "Canonical reference is {ImageRef}", CanonicalDriftImage ); } ); @@ -67,20 +80,18 @@ partial class NukeBuild { .Executes( async () => { using var _ = new OperationTimer( nameof(ReleaseContainer) ); - var version = await Versioning.Value.GetVersionAsync(); - var local = ImageReference.Localhost( "drift", version ); - var @public = ( await Versioning.Value.Release!.GetImageReferences() ) + var publicReferences = ( await Versioning.Value.Release!.GetImageReferences() ) .OrderBy( LatestLast ) // Pushing 'latest' last will make sure it appears as the most recent tag on Docker Hub .ToArray(); - Push( local, @public.ToArray() ); + Push( DriftImageId, publicReferences.ToArray() ); - var repos = @public.Select( r => r.Host ).Distinct(); + var registries = publicReferences.Select( r => r.Registry ).Distinct(); - Log.Information( "🐋 Released to {Repositories}!", string.Join( " and ", repos ) ); + Log.Information( "🐋 Released to {Registries}!", string.Join( " and ", registries ) ); } ); - +/* /// /// Releases container image to public Docker Hub! /// @@ -90,41 +101,41 @@ partial class NukeBuild { .Executes( async () => { using var _ = new OperationTimer( nameof(PreReleaseContainer) ); - var version = await Versioning.Value.GetVersionAsync(); - var local = ImageReference.Localhost( "drift", version ); - var publicc = await Versioning.Value.Release!.GetImageReferences(); + var publicReferences = await Versioning.Value.Release!.GetImageReferences(); - Push( local, publicc.ToArray() ); + Push( ImageIdDrift, publicReferences.ToArray() ); - var repos = publicc.DistinctBy( r => r.Repository ); + var registries = publicReferences.DistinctBy( r => r.Registry ); - Log.Information( "🐋 Released to {Repositories}!", string.Join( " and ", repos ) ); + Log.Information( "🐋 Released to {Registries}!", string.Join( " and ", registries ) ); } - ); + );*/ - private static int LatestLast( ImageReference r ) { - return r.Tag is LatestTag ? 1 : 0; + private static int LatestLast( ImageRef r ) { + return r.Tag == Tag.Latest ? 1 : 0; } - private void Push( ImageReference source, params ImageReference[] targets ) { - ImageReference[] allReferences = [source, ..targets]; - var loginToDockerHub = allReferences.Any( reference => reference.Host == DockerIoRegistry.Instance ); + private void Push( ImageId imageId, params QualifiedImageRef[] targets ) { + var logInToDockerHub = targets.Any( r => r.Registry == Registry.DockerHub ); try { - if ( loginToDockerHub ) { + if ( logInToDockerHub ) { DockerHubLogin(); } Log.Debug( - "Pushing {SourceTag} to: {TargetTags}", - source, + "Pushing {ImageId} to: {TargetTags}", + imageId, string.Join( ", ", targets.Select( t => t.ToString() ) ) ); foreach ( var target in targets ) { - Log.Debug( "Re-tagging {SourceTag} -> {TargetTag}", source, target ); + // Unfortunately, Docker (unlike Podman) does not support pushing an image selected by image ID directly to a + // registry tag (image ID → registry:tag). A local tag must be created first, which prevents this from being a + // single, atomic operation. + Log.Debug( "Tagging {ImageId} with {TargetTag}", DriftImageId, target ); DockerTasks.DockerTag( s => s - .SetSourceImage( source ) + .SetSourceImage( DriftImageId ) .SetTargetImage( target ) ); @@ -137,7 +148,7 @@ private void Push( ImageReference source, params ImageReference[] targets ) { } } finally { - if ( loginToDockerHub ) { + if ( logInToDockerHub ) { DockerHubLogout(); } } @@ -145,19 +156,15 @@ private void Push( ImageReference source, params ImageReference[] targets ) { private void DockerHubLogin() { Log.Debug( "Logging in to Docker Hub" ); - DockerTasks.DockerLogin( s => s + .SetServer( Registry.DockerHub ) .SetUsername( DockerHubUsername ) .SetPassword( DockerHubPassword ) - .SetServer( DockerIoRegistry.Instance ) ); } private static void DockerHubLogout() { Log.Debug( "Logging out of Docker Hub" ); - - DockerTasks.DockerLogout( s => s - .SetServer( "docker.io" ) - ); + DockerTasks.DockerLogout( s => s.SetServer( Registry.DockerHub ) ); } } \ No newline at end of file diff --git a/build/NukeBuild.Release.cs b/build/NukeBuild.Release.cs index 0795b8e5..1993a483 100644 --- a/build/NukeBuild.Release.cs +++ b/build/NukeBuild.Release.cs @@ -29,7 +29,7 @@ internal partial class NukeBuild { ); public Target PreRelease => _ => _ - .DependsOn( PackBinaries, PreReleaseContainer, Test ) + .DependsOn( PackBinaries, ReleaseContainer, Test ) .Executes( async () => { using var _ = new OperationTimer( nameof(PreRelease) ); diff --git a/build/NukeBuild.Test.cs b/build/NukeBuild.Test.cs index dfb2e038..8d78b2c5 100644 --- a/build/NukeBuild.Test.cs +++ b/build/NukeBuild.Test.cs @@ -4,7 +4,6 @@ using System.Threading.Tasks; using Drift.Build.Utilities; using Drift.Build.Utilities.MsBuild; -using HLabs.Containers; using JetBrains.Annotations; using Nuke.Common; using Nuke.Common.Tooling; @@ -71,17 +70,16 @@ sealed partial class NukeBuild { .Executes( async () => { using var _ = new OperationTimer( nameof(TestE2E) ); - var version = await Versioning.Value.GetVersionAsync(); + var imageRef = CanonicalDriftImage ?? throw new ArgumentNullException( nameof(CanonicalDriftImage) ); + Log.Information( "Using image {ImageRef}", imageRef ); foreach ( var runtime in SupportedRuntimes ) { var driftBinary = Paths.PublishDirectoryForRuntime( runtime ) / "drift"; var envVars = new Dictionary { // { nameof(EnvVar.DRIFT_BINARY_PATH), driftBinary }, - { "DRIFT_BINARY_PATH", driftBinary }, - // TODO use this! - // { "DRIFT_CONTAINER_IMAGE_REF", ImageReference.Localhost( "drift", version ).ToString() } - { "DRIFT_CONTAINER_IMAGE_REF", ImageReference.Localhost( "drift", version ).ToString() } + { "DRIFT_BINARY_PATH", driftBinary }, // + { "DRIFT_CONTAINER_IMAGE_REF", imageRef.ToString() } }; var alternateDockerHost = await FindAlternateDockerHostAsync(); diff --git a/build/Versioning/SemVersionExtensions.cs b/build/Versioning/SemVersionExtensions.cs index 68b22572..ddbb0b12 100644 --- a/build/Versioning/SemVersionExtensions.cs +++ b/build/Versioning/SemVersionExtensions.cs @@ -4,6 +4,9 @@ namespace Versioning; internal static class SemVersionExtensions { + /* + * NUKE build extensions + */ internal static DotNetBuildSettings SetVersionProperties( this DotNetBuildSettings settings, SemVersion version @@ -27,7 +30,6 @@ SemVersion version /* * Below methods skips metadata because .NET add the commit hash by itself (somewhere?) */ - internal static string ToDotNetAssemblyVersion( this SemVersion version ) { // Takes major.minor.patch and optional build number return version.WithoutPrereleaseOrMetadata().ToString(); diff --git a/build/Versioning/TagExtensions.cs b/build/Versioning/TagExtensions.cs new file mode 100644 index 00000000..93ea7457 --- /dev/null +++ b/build/Versioning/TagExtensions.cs @@ -0,0 +1,9 @@ +using HLabs.ImageReferences; + +namespace Versioning; + +internal static class TagExtensions { + extension( Tag ) { + public static Tag Dev => new("dev"); + } +} \ No newline at end of file diff --git a/build/_build.csproj b/build/_build.csproj index ec2c6995..6b7e5a43 100644 --- a/build/_build.csproj +++ b/build/_build.csproj @@ -13,7 +13,7 @@ - + diff --git a/src/Cli.E2ETests/Cli.E2ETests.csproj b/src/Cli.E2ETests/Cli.E2ETests.csproj index a80e4cdf..edd8554e 100644 --- a/src/Cli.E2ETests/Cli.E2ETests.csproj +++ b/src/Cli.E2ETests/Cli.E2ETests.csproj @@ -13,7 +13,7 @@ - + diff --git a/src/Cli.E2ETests/DriftImageFixture.cs b/src/Cli.E2ETests/DriftImageFixture.cs index 39597418..29d61742 100644 --- a/src/Cli.E2ETests/DriftImageFixture.cs +++ b/src/Cli.E2ETests/DriftImageFixture.cs @@ -1,12 +1,12 @@ using System.Text.Json; using Drift.Cli.E2ETests.Abstractions; -using HLabs.Containers; +using HLabs.ImageReferences; using Nuke.Common.Tools.Docker; namespace Drift.Cli.E2ETests; internal abstract class DriftImageFixture { - protected static ImageReference DriftImage { + protected static CanonicalImageRef DriftImage { get; private set; } @@ -14,10 +14,9 @@ protected static ImageReference DriftImage { [OneTimeSetUp] public void Setup() { try { - // TODO get from env var - // var reference = EnvironmentVariable.GetOrThrow( EnvVar.DRIFT_CONTAINER_IMAGE_REF ); - // DriftImage = ImageReference.Parse( reference ); - DriftImage = ImageReference.Localhost( "drift", Tag.Dev ); + var reference = EnvironmentVariable.GetOrThrow( EnvVar.DRIFT_CONTAINER_IMAGE_REF ); + DriftImage = reference.Image().Canonicalize(); + // DriftImage = new PartialImageRef( Registry.Localhost, new Repository( "drift" ), new Tag( "dev" ) ).Qualify(); } catch ( Exception e ) { if ( !TestUtilities.Environment.IsCi() ) { From f72a99f508d7001ce1937d2de611bf9a50ae9b3b Mon Sep 17 00:00:00 2001 From: hojmark <1203136+hojmark@users.noreply.github.com> Date: Mon, 16 Feb 2026 22:10:42 +0100 Subject: [PATCH 2/8] update version --- Directory.Packages.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 01df697a..39e55541 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -5,8 +5,8 @@ true - - + + From dbee6a778a80bdf666fea05b747068a4442018e4 Mon Sep 17 00:00:00 2001 From: hojmark <1203136+hojmark@users.noreply.github.com> Date: Tue, 17 Feb 2026 22:19:42 +0100 Subject: [PATCH 3/8] f --- .nuke/build.schema.json | 1 - build/NukeBuild.Container.cs | 35 ++++++++++++++++------------------- build/NukeBuild.Test.cs | 2 +- 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/.nuke/build.schema.json b/.nuke/build.schema.json index bf0a3b58..40e55bc6 100644 --- a/.nuke/build.schema.json +++ b/.nuke/build.schema.json @@ -34,7 +34,6 @@ "CleanProjects", "PackBinaries", "PreRelease", - "PreReleaseContainer", "PublishBinaries", "PublishContainer", "Release", diff --git a/build/NukeBuild.Container.cs b/build/NukeBuild.Container.cs index bc4294c8..75c155b6 100644 --- a/build/NukeBuild.Container.cs +++ b/build/NukeBuild.Container.cs @@ -1,3 +1,4 @@ +using System; using System.Linq; using Drift.Build.Utilities; using HLabs.ImageReferences; @@ -28,8 +29,7 @@ partial class NukeBuild { private static readonly PartialImageRef DriftImage = new("drift"); private static readonly PartialImageRef LocalDriftImage = DriftImage.With( Registry.Localhost ); private static readonly PartialImageRef DockerHubDriftImage = DriftImage.With( Registry.DockerHub, "hojmark" ); - [CanBeNull] private CanonicalImageRef CanonicalDriftImage = null; - [CanBeNull] private ImageId DriftImageId = null; + [CanBeNull] private QualifiedImageRef _driftImageRef; Target PublishContainer => _ => _ .DependsOn( PublishBinaries, CleanArtifacts ) @@ -39,10 +39,14 @@ partial class NukeBuild { var version = await Versioning.Value.GetVersionAsync(); + var tag = new Tag( Guid.NewGuid().ToString( "N" ) ); + _driftImageRef = LocalDriftImage.Qualify( tag ); + Log.Information( "Building container image..." ); // var created = DateTime.UtcNow.ToString( "o", CultureInfo.InvariantCulture ); // o = round-trip format / ISO 8601 - var output = DockerTasks.DockerBuild( s => s + DockerTasks.DockerBuild( s => s .SetPath( RootDirectory ) + .SetTag( _driftImageRef ) .SetFile( "Containerfile" ) .SetLabel( // Timestamping prevents the build from being idempotent @@ -52,22 +56,15 @@ partial class NukeBuild { ) ); - var imageId = new ImageId( output.Last().Text ); - Log.Information( "Image ID is {ImageId}", imageId ); + Log.Information( "Built image: {ImageRef}", _driftImageRef ); Log.Information( "Tagging image..." ); // For convenience, tag the image with dev var devTag = LocalDriftImage.Qualify( Tag.Dev ); DockerTasks.DockerTag( s => s - .SetSourceImage( imageId ) + .SetSourceImage( _driftImageRef ) .SetTargetImage( devTag ) ); - - // Determine canonical image reference - var digest = imageId.GetDigest(); - DriftImageId = imageId; - CanonicalDriftImage = LocalDriftImage.Canonicalize( digest ); - Log.Information( "Canonical reference is {ImageRef}", CanonicalDriftImage ); } ); @@ -84,7 +81,7 @@ partial class NukeBuild { .OrderBy( LatestLast ) // Pushing 'latest' last will make sure it appears as the most recent tag on Docker Hub .ToArray(); - Push( DriftImageId, publicReferences.ToArray() ); + Push( _driftImageRef, publicReferences.ToArray() ); var registries = publicReferences.Select( r => r.Registry ).Distinct(); @@ -115,7 +112,7 @@ private static int LatestLast( ImageRef r ) { return r.Tag == Tag.Latest ? 1 : 0; } - private void Push( ImageId imageId, params QualifiedImageRef[] targets ) { + private void Push( QualifiedImageRef source, params QualifiedImageRef[] targets ) { var logInToDockerHub = targets.Any( r => r.Registry == Registry.DockerHub ); try { @@ -124,8 +121,8 @@ private void Push( ImageId imageId, params QualifiedImageRef[] targets ) { } Log.Debug( - "Pushing {ImageId} to: {TargetTags}", - imageId, + "Pushing {Source} to: {Targets}", + source, string.Join( ", ", targets.Select( t => t.ToString() ) ) ); @@ -133,13 +130,13 @@ private void Push( ImageId imageId, params QualifiedImageRef[] targets ) { // Unfortunately, Docker (unlike Podman) does not support pushing an image selected by image ID directly to a // registry tag (image ID → registry:tag). A local tag must be created first, which prevents this from being a // single, atomic operation. - Log.Debug( "Tagging {ImageId} with {TargetTag}", DriftImageId, target ); + Log.Debug( "Tagging {Source} with {Target}", source, target ); DockerTasks.DockerTag( s => s - .SetSourceImage( DriftImageId ) + .SetSourceImage( source ) .SetTargetImage( target ) ); - Log.Information( "Pushing {TargetTag}", target ); + Log.Information( "Pushing {Target}", target ); DockerTasks.DockerPush( s => s .SetName( target ) ); diff --git a/build/NukeBuild.Test.cs b/build/NukeBuild.Test.cs index 8d78b2c5..dfdbc08c 100644 --- a/build/NukeBuild.Test.cs +++ b/build/NukeBuild.Test.cs @@ -70,7 +70,7 @@ sealed partial class NukeBuild { .Executes( async () => { using var _ = new OperationTimer( nameof(TestE2E) ); - var imageRef = CanonicalDriftImage ?? throw new ArgumentNullException( nameof(CanonicalDriftImage) ); + var imageRef = _driftImageRef ?? throw new ArgumentNullException( nameof(_driftImageRef) ); Log.Information( "Using image {ImageRef}", imageRef ); foreach ( var runtime in SupportedRuntimes ) { From d4cec0669cf65ba781b650d3643d8ea6a19e383e Mon Sep 17 00:00:00 2001 From: hojmark <1203136+hojmark@users.noreply.github.com> Date: Tue, 17 Feb 2026 22:33:24 +0100 Subject: [PATCH 4/8] update hlabs.imagereferences version --- Directory.Packages.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 39e55541..efad11c6 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -5,8 +5,8 @@ true - - + + From 38c2c76339892b1d45ce57abffe774acd68fff78 Mon Sep 17 00:00:00 2001 From: hojmark <1203136+hojmark@users.noreply.github.com> Date: Tue, 17 Feb 2026 22:42:07 +0100 Subject: [PATCH 5/8] debug --- src/Cli.E2ETests/DriftImageFixture.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Cli.E2ETests/DriftImageFixture.cs b/src/Cli.E2ETests/DriftImageFixture.cs index 29d61742..d3259914 100644 --- a/src/Cli.E2ETests/DriftImageFixture.cs +++ b/src/Cli.E2ETests/DriftImageFixture.cs @@ -15,7 +15,13 @@ protected static CanonicalImageRef DriftImage { public void Setup() { try { var reference = EnvironmentVariable.GetOrThrow( EnvVar.DRIFT_CONTAINER_IMAGE_REF ); - DriftImage = reference.Image().Canonicalize(); + try { + DriftImage = reference.Image().Canonicalize(); + } + catch ( Exception e ) { + Console.Error.WriteLine( $"Failed to canonicalize image reference: {reference}" ); + throw; + } // DriftImage = new PartialImageRef( Registry.Localhost, new Repository( "drift" ), new Tag( "dev" ) ).Qualify(); } catch ( Exception e ) { From ee8172d5c6db5b7823d52900613babbed01ad1c8 Mon Sep 17 00:00:00 2001 From: hojmark <1203136+hojmark@users.noreply.github.com> Date: Tue, 17 Feb 2026 22:46:48 +0100 Subject: [PATCH 6/8] debug --- src/Cli.E2ETests/DriftImageFixture.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Cli.E2ETests/DriftImageFixture.cs b/src/Cli.E2ETests/DriftImageFixture.cs index d3259914..9ef7df3c 100644 --- a/src/Cli.E2ETests/DriftImageFixture.cs +++ b/src/Cli.E2ETests/DriftImageFixture.cs @@ -20,6 +20,7 @@ public void Setup() { } catch ( Exception e ) { Console.Error.WriteLine( $"Failed to canonicalize image reference: {reference}" ); + TestContext.Out.WriteLine( $"Failed to canonicalize image reference: {reference}" ); throw; } // DriftImage = new PartialImageRef( Registry.Localhost, new Repository( "drift" ), new Tag( "dev" ) ).Qualify(); From ae2698db6da44ec113c1a968c37450c24a8c71df Mon Sep 17 00:00:00 2001 From: hojmark <1203136+hojmark@users.noreply.github.com> Date: Tue, 17 Feb 2026 23:01:38 +0100 Subject: [PATCH 7/8] fix --- src/Cli.E2ETests/DriftImageFixture.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Cli.E2ETests/DriftImageFixture.cs b/src/Cli.E2ETests/DriftImageFixture.cs index 9ef7df3c..bda85ec5 100644 --- a/src/Cli.E2ETests/DriftImageFixture.cs +++ b/src/Cli.E2ETests/DriftImageFixture.cs @@ -6,7 +6,7 @@ namespace Drift.Cli.E2ETests; internal abstract class DriftImageFixture { - protected static CanonicalImageRef DriftImage { + protected static QualifiedImageRef DriftImage { get; private set; } @@ -16,7 +16,7 @@ public void Setup() { try { var reference = EnvironmentVariable.GetOrThrow( EnvVar.DRIFT_CONTAINER_IMAGE_REF ); try { - DriftImage = reference.Image().Canonicalize(); + DriftImage = reference.QualifiedImage(); } catch ( Exception e ) { Console.Error.WriteLine( $"Failed to canonicalize image reference: {reference}" ); From e6c4d0c91a650aa79778935225f7abd6739dce20 Mon Sep 17 00:00:00 2001 From: hojmark <1203136+hojmark@users.noreply.github.com> Date: Tue, 17 Feb 2026 23:14:32 +0100 Subject: [PATCH 8/8] fix build warning --- src/Cli.E2ETests/DriftImageFixture.cs | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/Cli.E2ETests/DriftImageFixture.cs b/src/Cli.E2ETests/DriftImageFixture.cs index bda85ec5..1821460f 100644 --- a/src/Cli.E2ETests/DriftImageFixture.cs +++ b/src/Cli.E2ETests/DriftImageFixture.cs @@ -15,15 +15,7 @@ protected static QualifiedImageRef DriftImage { public void Setup() { try { var reference = EnvironmentVariable.GetOrThrow( EnvVar.DRIFT_CONTAINER_IMAGE_REF ); - try { - DriftImage = reference.QualifiedImage(); - } - catch ( Exception e ) { - Console.Error.WriteLine( $"Failed to canonicalize image reference: {reference}" ); - TestContext.Out.WriteLine( $"Failed to canonicalize image reference: {reference}" ); - throw; - } - // DriftImage = new PartialImageRef( Registry.Localhost, new Repository( "drift" ), new Tag( "dev" ) ).Qualify(); + DriftImage = reference.QualifiedImage(); } catch ( Exception e ) { if ( !TestUtilities.Environment.IsCi() ) {