private void pushBaseImagesLayers(ProgressEventDispatcher.Factory progressDispatcherFactory) {
    results.baseImagesAndLayerPushResults =
        executorService.submit(
            () -> {
              try (ProgressEventDispatcher progressDispatcher =
                  progressDispatcherFactory.create(
                      "scheduling pushing base images layers",
                      results.baseImagesAndLayers.get().size())) {

                Map<Image, List<Future<BlobDescriptor>>> layerPushResults = new LinkedHashMap<>();
                for (Map.Entry<Image, List<Future<PreparedLayer>>> entry :
                    results.baseImagesAndLayers.get().entrySet()) {
                  Image baseImage = entry.getKey();
                  List<Future<PreparedLayer>> baseLayers = entry.getValue();

                  List<Future<BlobDescriptor>> pushResults =
                      pushBaseImageLayers(baseLayers, progressDispatcher.newChildProducer());
                  layerPushResults.put(baseImage, pushResults);
                }
                return layerPushResults;
              }
            });
  }
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