private void pushImages(ProgressEventDispatcher.Factory progressDispatcherFactory) {
    results.imagePushResults =
        executorService.submit(
            () -> {
              try (ProgressEventDispatcher progressDispatcher =
                  progressDispatcherFactory.create(
                      "scheduling pushing manifests",
                      results.baseImagesAndBuiltImages.get().size())) {

                realizeFutures(results.applicationLayerPushResults.get());

                List<Future<BuildResult>> buildResults = new ArrayList<>();
                for (Map.Entry<Image, Future<Image>> entry :
                    results.baseImagesAndBuiltImages.get().entrySet()) {
                  Image baseImage = entry.getKey();
                  Future<Image> builtImage = entry.getValue();

                  buildResults.add(
                      pushImage(baseImage, builtImage, progressDispatcher.newChildProducer()));
                }
                return buildResults;
              }
            });
  }
Run all steps and return a BuildResult after a build is completed.

@return a {@link BuildResult} with build metadata
@throws ExecutionException if an error occurred during asynchronous execution of steps
@throws InterruptedException if the build was interrupted while waiting for results
jib-core/src/main/java/com/google/cloud/tools/jib/builder/steps/StepsRunner.java