def cli_build_image(args): if args.plugin_files: args.plugin_files = [os.path.abspath(f) for f in args.plugin_files] if args.source__provider == 'json': with open(args.json_path) as json_fp: common_kwargs = json.load(json_fp) if args.substitute: process_substitutions(common_kwargs, args.substitute) else: common_kwargs = construct_kwargs(**vars(args)) response = BuildResults() if args.method == "hostdocker": response = build_image_using_hosts_docker(args.build_image, **common_kwargs) elif args.method == "privileged": response = build_image_in_privileged_container(args.build_image, **common_kwargs) elif args.method == 'here': build_result = build_image_here(plugin_files=args.plugin_files, **common_kwargs) if build_result.is_failed(): response.return_code = -1 else: response.return_code = 0 if response.return_code != 0: logger.error("build failed") sys.exit(response.return_code)
def _build(self, build_method): """ build image from provided build_args :return: BuildResults """ logger.info("building image '%s'", self.image) self.ensure_not_built() self.temp_dir = tempfile.mkdtemp() temp_path = os.path.join(self.temp_dir, BUILD_JSON) try: with open(temp_path, 'w') as build_json: json.dump(self.build_args, build_json) self.build_container_id = build_method(self.build_image, self.temp_dir) try: logs_gen = self.dt.logs(self.build_container_id, stream=True) wait_for_command(logs_gen) return_code = self.dt.wait(self.build_container_id) except KeyboardInterrupt: logger.info("killing build container on user's request") self.dt.remove_container(self.build_container_id, force=True) results = BuildResults() results.return_code = 1 return results else: results = self._load_results(self.build_container_id) results.return_code = return_code return results finally: shutil.rmtree(self.temp_dir)
def _build(self, build_method): """ build image from provided build_args :return: BuildResults """ logger.info("building image '%s'", self.image) self._ensure_not_built() self.temp_dir = tempfile.mkdtemp() temp_path = os.path.join(self.temp_dir, BUILD_JSON) try: with open(temp_path, 'w') as build_json: json.dump(self.build_args, build_json) self.build_container_id = build_method(self.build_image, self.temp_dir) try: logs_gen = self.dt.logs(self.build_container_id, stream=True) wait_for_command(logs_gen) return_code = self.dt.wait(self.build_container_id) except KeyboardInterrupt: logger.info("killing build container on user's request") self.dt.remove_container(self.build_container_id, force=True) results = BuildResults() results.return_code = 1 return results else: results = self._load_results(self.build_container_id) results.return_code = return_code return results finally: shutil.rmtree(self.temp_dir)
def test_build_results_encoder(): results = BuildResults() expected_data = {} for attr in BUILD_RESULTS_ATTRS: setattr(results, attr, attr) expected_data[attr] = attr data = json.loads(json.dumps(results, cls=BuildResultsEncoder)) assert data == expected_data
def test_build_results_decoder(): data = {} expected_results = BuildResults() for attr in BUILD_RESULTS_ATTRS: setattr(expected_results, attr, attr) data[attr] = attr results = json.loads(json.dumps(data), cls=BuildResultsJSONDecoder) for attr in set(BUILD_RESULTS_ATTRS) - {'build_logs'}: assert getattr(results, attr) == getattr(expected_results, attr)
def _load_results(self, container_id): """ load results from recent build :return: BuildResults """ if self.temp_dir: dt = DockerTasker() # results_path = os.path.join(self.temp_dir, RESULTS_JSON) # df_path = os.path.join(self.temp_dir, 'Dockerfile') # try: # with open(results_path, 'r') as results_fp: # results = json.load(results_fp, cls=BuildResultsJSONDecoder) # except (IOError, OSError) as ex: # logger.error("Can't open results: '%s'", ex) # for l in self.dt.logs(self.build_container_id, stream=False): # logger.debug(l.strip()) # raise RuntimeError("Can't open results: '%s'" % ex) # results.dockerfile = open(df_path, 'r').read() results = BuildResults() results.build_logs = dt.logs(container_id, stream=False) results.container_id = container_id return results
def _load_results(self, container_id): """ load results from recent build :return: BuildResults """ if self.temp_dir: dt = DockerTasker() # FIXME: load results only when requested # results_path = os.path.join(self.temp_dir, RESULTS_JSON) # df_path = os.path.join(self.temp_dir, 'Dockerfile') # try: # with open(results_path, 'r') as results_fp: # results = json.load(results_fp, cls=BuildResultsJSONDecoder) # except (IOError, OSError) as ex: # logger.error("Can't open results: '%s'", repr(ex)) # for l in self.dt.logs(self.build_container_id, stream=False): # logger.debug(l.strip()) # raise RuntimeError("Can't open results: '%s'" % repr(ex)) # results.dockerfile = open(df_path, 'r').read() results = BuildResults() results.build_logs = dt.logs(container_id, stream=False) results.container_id = container_id return results