public async Task <BuildResult> CallAsync() { await pullAndCacheBaseImageLayersStep.GetFuture().ConfigureAwait(false); await buildAndCacheApplicationLayersStep.GetFuture().ConfigureAwait(false); await buildImageStep.GetFuture().ConfigureAwait(false); string description = string.Format( CultureInfo.CurrentCulture, Resources.WriteTarFileStepDescriptionFormat, outputPath.GetFileName()); buildConfiguration.GetEventHandlers().Dispatch(LogEvent.Progress(description)); using (progressEventDispatcherFactory.Create(description, this.Index)) { Image image = await buildImageStep.GetFuture().ConfigureAwait(false); // Builds the image to a tarball. Files.CreateDirectories(outputPath.GetParent()); using (Stream outputStream = new BufferedStream(FileOperations.NewLockingOutputStream(outputPath))) { await new ImageTarball(image, buildConfiguration.GetTargetImageConfiguration().GetImage()) .WriteToAsync(outputStream).ConfigureAwait(false); } return(await BuildResult.FromImageAsync(image, buildConfiguration.GetTargetFormat()).ConfigureAwait(false)); } }
public async Task <BuildResult> CallAsync() { IReadOnlyList <BlobDescriptor> baseImageDescriptors = await pushBaseImageLayersStep.GetFuture().ConfigureAwait(false); IReadOnlyList <BlobDescriptor> appLayerDescriptors = await pushApplicationLayersStep.GetFuture().ConfigureAwait(false); BlobDescriptor containerConfigurationBlobDescriptor = await pushContainerConfigurationStep.GetFuture().ConfigureAwait(false); ImmutableHashSet <string> targetImageTags = buildConfiguration.GetAllTargetImageTags(); using (var progressEventDispatcher = progressEventDispatcherFactory.Create("pushing image manifest", this.Index)) using (var factory = progressEventDispatcher.NewChildProducer()("[child progress]pushing image manifest", targetImageTags.Count)) using (TimerEventDispatcher ignored = new TimerEventDispatcher(buildConfiguration.GetEventHandlers(), DESCRIPTION)) { RegistryClient registryClient = buildConfiguration .NewTargetImageRegistryClientFactory() .SetAuthorization(await authenticatePushStep.GetFuture().ConfigureAwait(false)) .NewRegistryClient(); // Constructs the image. ImageToJsonTranslator imageToJsonTranslator = new ImageToJsonTranslator(await buildImageStep.GetFuture().ConfigureAwait(false)); // Gets the image manifest to push. IBuildableManifestTemplate manifestTemplate = imageToJsonTranslator.GetManifestTemplate( buildConfiguration.GetTargetFormat(), containerConfigurationBlobDescriptor); // Pushes to all target image tags. IList <Task <DescriptorDigest> > pushAllTagsFutures = new List <Task <DescriptorDigest> >(); var idx = 0; ProgressEventDispatcher.Factory progressEventDispatcherFactory = factory.NewChildProducer(); foreach (string tag in targetImageTags) { idx++; using (progressEventDispatcherFactory.Create("tagging with " + tag, idx)) { buildConfiguration.GetEventHandlers().Dispatch(LogEvent.Info("Tagging with " + tag + "...")); pushAllTagsFutures.Add(registryClient.PushManifestAsync(manifestTemplate, tag)); } } DescriptorDigest imageDigest = await Digests.ComputeJsonDigestAsync(manifestTemplate).ConfigureAwait(false); DescriptorDigest imageId = containerConfigurationBlobDescriptor.GetDigest(); BuildResult result = new BuildResult(imageDigest, imageId); await Task.WhenAll(pushAllTagsFutures).ConfigureAwait(false); return(result); } }
public async Task <BuildResult> CallAsync() { await pullAndCacheBaseImageLayersStep.GetFuture().ConfigureAwait(false); await buildAndCacheApplicationLayersStep.GetFuture().ConfigureAwait(false); await buildImageStep.GetFuture().ConfigureAwait(false); buildConfiguration .GetEventHandlers() .Dispatch(LogEvent.Progress(Resources.LoadDockerStepDescription)); using (progressEventDispatcherFactory.Create(Resources.LoadDockerStepDescription, 1)) { Image image = await buildImageStep.GetFuture().ConfigureAwait(false); IImageReference targetImageReference = buildConfiguration.GetTargetImageConfiguration().GetImage(); // Load the image to docker daemon. buildConfiguration .GetEventHandlers() .Dispatch( LogEvent.Debug(await dockerClient.LoadAsync(new ImageTarball(image, targetImageReference)).ConfigureAwait(false))); // Tags the image with all the additional tags, skipping the one 'docker load' already loaded. foreach (string tag in buildConfiguration.GetAllTargetImageTags()) { if (tag.Equals(targetImageReference.GetTag(), StringComparison.Ordinal)) { continue; } ImageReference taggedImageReference = targetImageReference.WithTag(tag); await dockerClient.TagAsync(targetImageReference, taggedImageReference).ConfigureAwait(false); } return(await BuildResult.FromImageAsync(image, buildConfiguration.GetTargetFormat()).ConfigureAwait(false)); } }
public async Task <BlobDescriptor> CallAsync() { Image image = await buildImageStep.GetFuture().ConfigureAwait(false); using (ProgressEventDispatcher progressEventDispatcher = progressEventDispatcherFactory.Create("pushing container configuration", this.Index)) using (TimerEventDispatcher ignored = new TimerEventDispatcher(buildConfiguration.GetEventHandlers(), DESCRIPTION)) { ContainerConfigurationTemplate containerConfiguration = new ImageToJsonTranslator(image).GetContainerConfiguration(); BlobDescriptor blobDescriptor = await Digests.ComputeJsonDescriptorAsync(containerConfiguration).ConfigureAwait(false); return(await new PushBlobStep( buildConfiguration, progressEventDispatcher.NewChildProducer(), authenticatePushStep, blobDescriptor, Blobs.FromJson(containerConfiguration)).GetFuture().ConfigureAwait(false)); } }