private void pushContainerConfigurations(
      ProgressEventDispatcher.Factory progressDispatcherFactory) {
    results.baseImagesAndContainerConfigPushResults =
        executorService.submit(
            () -> {
              try (ProgressEventDispatcher progressDispatcher =
                  progressDispatcherFactory.create(
                      "scheduling pushing container configurations",
                      results.baseImagesAndBuiltImages.get().size())) {

                Map<Image, Future<BlobDescriptor>> configPushResults = new LinkedHashMap<>();
                for (Map.Entry<Image, Future<Image>> entry :
                    results.baseImagesAndBuiltImages.get().entrySet()) {
                  Image baseImage = entry.getKey();
                  Future<Image> builtImage = entry.getValue();

                  Future<BlobDescriptor> pushResult =
                      pushContainerConfiguration(builtImage, progressDispatcher.newChildProducer());
                  configPushResults.put(baseImage, pushResult);
                }
                return configPushResults;
              }
            });
  }
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