@@ -8,8 +8,8 @@ namespace Microsoft.NET.Build.Containers;
8
8
9
9
internal static class ImagePublisher
10
10
{
11
- public static async Task PublishImage (
12
- BuiltImage image ,
11
+ public static async Task PublishImageAsync (
12
+ BuiltImage singleArchImage ,
13
13
SourceImageReference sourceImageReference ,
14
14
DestinationImageReference destinationImageReference ,
15
15
Microsoft . Build . Utilities . TaskLoggingHelper Log ,
@@ -23,22 +23,26 @@ public static async Task PublishImage(
23
23
{
24
24
case DestinationImageReferenceKind . LocalRegistry :
25
25
await PushToLocalRegistryAsync (
26
- image ,
26
+ singleArchImage ,
27
27
sourceImageReference ,
28
28
destinationImageReference ,
29
29
Log ,
30
30
BuildEngine ,
31
31
telemetry ,
32
- cancellationToken ) . ConfigureAwait ( false ) ;
32
+ cancellationToken ,
33
+ destinationImageReference . LocalRegistry ! . LoadAsync ,
34
+ Strings . ContainerBuilder_ImageUploadedToLocalDaemon ) . ConfigureAwait ( false ) ;
33
35
break ;
34
36
case DestinationImageReferenceKind . RemoteRegistry :
35
37
await PushToRemoteRegistryAsync (
36
- image ,
38
+ singleArchImage ,
37
39
sourceImageReference ,
38
40
destinationImageReference ,
39
41
Log ,
40
42
BuildEngine ,
41
- cancellationToken ) . ConfigureAwait ( false ) ;
43
+ cancellationToken ,
44
+ destinationImageReference . RemoteRegistry ! . PushAsync ,
45
+ Strings . ContainerBuilder_ImageUploadedToRegistry ) . ConfigureAwait ( false ) ;
42
46
break ;
43
47
default :
44
48
throw new ArgumentOutOfRangeException ( ) ;
@@ -47,8 +51,8 @@ await PushToRemoteRegistryAsync(
47
51
telemetry . LogPublishSuccess ( ) ;
48
52
}
49
53
50
- public static async Task PublishImage (
51
- BuiltImage [ ] images ,
54
+ public static async Task PublishImageAsync (
55
+ BuiltImage [ ] multiArchImage ,
52
56
SourceImageReference sourceImageReference ,
53
57
DestinationImageReference destinationImageReference ,
54
58
Microsoft . Build . Utilities . TaskLoggingHelper Log ,
@@ -62,22 +66,35 @@ public static async Task PublishImage(
62
66
{
63
67
case DestinationImageReferenceKind . LocalRegistry :
64
68
await PushToLocalRegistryAsync (
65
- images ,
69
+ multiArchImage ,
66
70
sourceImageReference ,
67
71
destinationImageReference ,
68
72
Log ,
69
73
BuildEngine ,
70
74
telemetry ,
71
- cancellationToken ) . ConfigureAwait ( false ) ;
75
+ cancellationToken ,
76
+ destinationImageReference . LocalRegistry ! . LoadAsync ,
77
+ Strings . ContainerBuilder_ImageUploadedToLocalDaemon ) . ConfigureAwait ( false ) ;
72
78
break ;
73
79
case DestinationImageReferenceKind . RemoteRegistry :
74
80
await PushToRemoteRegistryAsync (
75
- images ,
81
+ multiArchImage ,
76
82
sourceImageReference ,
77
83
destinationImageReference ,
78
84
Log ,
79
85
BuildEngine ,
80
- cancellationToken ) . ConfigureAwait ( false ) ;
86
+ cancellationToken ,
87
+ async ( images , source , destination , token ) =>
88
+ {
89
+ ( string imageIndex , string mediaType ) = ImageIndexGenerator . GenerateImageIndex ( images ) ;
90
+ await destinationImageReference . RemoteRegistry ! . PushManifestListAsync (
91
+ destinationImageReference . Repository ,
92
+ destinationImageReference . Tags ,
93
+ imageIndex ,
94
+ mediaType ,
95
+ cancellationToken ) . ConfigureAwait ( false ) ;
96
+ } ,
97
+ Strings . ImageIndexUploadedToRegistry ) . ConfigureAwait ( false ) ;
81
98
break ;
82
99
default :
83
100
throw new ArgumentOutOfRangeException ( ) ;
@@ -86,14 +103,16 @@ await PushToRemoteRegistryAsync(
86
103
telemetry . LogPublishSuccess ( ) ;
87
104
}
88
105
89
- private static async Task PushToLocalRegistryAsync (
90
- BuiltImage image ,
106
+ private static async Task PushToLocalRegistryAsync < T > (
107
+ T image ,
91
108
SourceImageReference sourceImageReference ,
92
109
DestinationImageReference destinationImageReference ,
93
110
Microsoft . Build . Utilities . TaskLoggingHelper Log ,
94
111
IBuildEngine ? BuildEngine ,
95
112
Telemetry telemetry ,
96
- CancellationToken cancellationToken )
113
+ CancellationToken cancellationToken ,
114
+ Func < T , SourceImageReference , DestinationImageReference , CancellationToken , Task > loadFunc ,
115
+ string successMessage )
97
116
{
98
117
ILocalRegistry localRegistry = destinationImageReference . LocalRegistry ! ;
99
118
if ( ! ( await localRegistry . IsAvailableAsync ( cancellationToken ) . ConfigureAwait ( false ) ) )
@@ -104,10 +123,10 @@ private static async Task PushToLocalRegistryAsync(
104
123
}
105
124
try
106
125
{
107
- await localRegistry . LoadAsync ( image , sourceImageReference , destinationImageReference , cancellationToken ) . ConfigureAwait ( false ) ;
126
+ await loadFunc ( image , sourceImageReference , destinationImageReference , cancellationToken ) . ConfigureAwait ( false ) ;
108
127
if ( BuildEngine != null )
109
128
{
110
- Log . LogMessage ( MessageImportance . High , Strings . ContainerBuilder_ImageUploadedToLocalDaemon , destinationImageReference , localRegistry ) ;
129
+ Log . LogMessage ( MessageImportance . High , successMessage , destinationImageReference , localRegistry ) ;
111
130
}
112
131
}
113
132
catch ( ContainerHttpException e )
@@ -128,112 +147,26 @@ private static async Task PushToLocalRegistryAsync(
128
147
}
129
148
}
130
149
131
- private static async Task PushToLocalRegistryAsync (
132
- BuiltImage [ ] images ,
150
+ private static async Task PushToRemoteRegistryAsync < T > (
151
+ T image ,
133
152
SourceImageReference sourceImageReference ,
134
153
DestinationImageReference destinationImageReference ,
135
154
Microsoft . Build . Utilities . TaskLoggingHelper Log ,
136
155
IBuildEngine ? BuildEngine ,
137
- Telemetry telemetry ,
138
- CancellationToken cancellationToken )
156
+ CancellationToken cancellationToken ,
157
+ Func < T , SourceImageReference , DestinationImageReference , CancellationToken , Task > pushFunc ,
158
+ string successMessage )
139
159
{
140
- ILocalRegistry localRegistry = destinationImageReference . LocalRegistry ! ;
141
- if ( ! ( await localRegistry . IsAvailableAsync ( cancellationToken ) . ConfigureAwait ( false ) ) )
142
- {
143
- telemetry . LogMissingLocalBinary ( ) ;
144
- Log . LogErrorWithCodeFromResources ( nameof ( Strings . LocalRegistryNotAvailable ) ) ;
145
- return ;
146
- }
147
160
try
148
161
{
149
- await localRegistry . LoadAsync ( images , sourceImageReference , destinationImageReference , cancellationToken ) . ConfigureAwait ( false ) ;
150
- if ( BuildEngine != null )
151
- {
152
- Log . LogMessage ( MessageImportance . High , Strings . ContainerBuilder_ImageUploadedToLocalDaemon , destinationImageReference , localRegistry ) ;
153
- }
154
- }
155
- catch ( ContainerHttpException e )
156
- {
157
- if ( BuildEngine != null )
158
- {
159
- Log . LogErrorFromException ( e , true ) ;
160
- }
161
- }
162
- catch ( AggregateException ex ) when ( ex . InnerException is DockerLoadException dle )
163
- {
164
- telemetry . LogLocalLoadError ( ) ;
165
- Log . LogErrorFromException ( dle , showStackTrace : false ) ;
166
- }
167
- catch ( ArgumentException argEx )
168
- {
169
- Log . LogErrorFromException ( argEx , showStackTrace : false ) ;
170
- }
171
- }
172
-
173
- private static async Task PushToRemoteRegistryAsync (
174
- BuiltImage image ,
175
- SourceImageReference sourceImageReference ,
176
- DestinationImageReference destinationImageReference ,
177
- Microsoft . Build . Utilities . TaskLoggingHelper Log ,
178
- IBuildEngine ? BuildEngine ,
179
- CancellationToken cancellationToken )
180
- {
181
- try
182
- {
183
- await destinationImageReference . RemoteRegistry ! . PushAsync (
162
+ await pushFunc (
184
163
image ,
185
164
sourceImageReference ,
186
165
destinationImageReference ,
187
166
cancellationToken ) . ConfigureAwait ( false ) ;
188
167
if ( BuildEngine != null )
189
168
{
190
- Log . LogMessage ( MessageImportance . High , Strings . ContainerBuilder_ImageUploadedToRegistry , destinationImageReference , destinationImageReference . RemoteRegistry ! . RegistryName ) ;
191
- }
192
- }
193
- catch ( UnableToAccessRepositoryException )
194
- {
195
- if ( BuildEngine != null )
196
- {
197
- Log . LogErrorWithCodeFromResources ( nameof ( Strings . UnableToAccessRepository ) , destinationImageReference . Repository , destinationImageReference . RemoteRegistry ! . RegistryName ) ;
198
- }
199
- }
200
- catch ( ContainerHttpException e )
201
- {
202
- if ( BuildEngine != null )
203
- {
204
- Log . LogErrorFromException ( e , true ) ;
205
- }
206
- }
207
- catch ( Exception e )
208
- {
209
- if ( BuildEngine != null )
210
- {
211
- Log . LogErrorWithCodeFromResources ( nameof ( Strings . RegistryOutputPushFailed ) , e . Message ) ;
212
- Log . LogMessage ( MessageImportance . Low , "Details: {0}" , e ) ;
213
- }
214
- }
215
- }
216
-
217
- private static async Task PushToRemoteRegistryAsync (
218
- BuiltImage [ ] images ,
219
- SourceImageReference sourceImageReference ,
220
- DestinationImageReference destinationImageReference ,
221
- Microsoft . Build . Utilities . TaskLoggingHelper Log ,
222
- IBuildEngine ? BuildEngine ,
223
- CancellationToken cancellationToken )
224
- {
225
- try
226
- {
227
- ( string imageIndex , string mediaType ) = ImageIndexGenerator . GenerateImageIndex ( images ) ;
228
- await destinationImageReference . RemoteRegistry ! . PushManifestListAsync (
229
- destinationImageReference . Repository ,
230
- destinationImageReference . Tags ,
231
- imageIndex ,
232
- mediaType ,
233
- cancellationToken ) . ConfigureAwait ( false ) ;
234
- if ( BuildEngine != null )
235
- {
236
- Log . LogMessage ( MessageImportance . High , Strings . ImageIndexUploadedToRegistry , destinationImageReference , destinationImageReference . RemoteRegistry ! . RegistryName ) ;
169
+ Log . LogMessage ( MessageImportance . High , successMessage , destinationImageReference , destinationImageReference . RemoteRegistry ! . RegistryName ) ;
237
170
}
238
171
}
239
172
catch ( UnableToAccessRepositoryException )
0 commit comments