in src/image.py [0:0]
def build(self):
"""
The build function builds the specified docker image
Returns:
returns the build status
"""
self.summary["start_time"] = datetime.now()
if not self.to_build:
self.log = ["Not built"]
self.build_status = constants.NOT_BUILT
self.summary["status"] = constants.STATUS_MESSAGE[self.build_status]
return self.build_status
if self.info.get("base_image_uri"):
self.build_args["BASE_IMAGE"] = self.info["base_image_uri"]
if self.info.get("extra_build_args"):
self.build_args.update(self.info.get("extra_build_args"))
if self.info.get("labels"):
self.labels.update(self.info.get("labels"))
with open(self.context.context_path, "rb") as context_file:
response = []
cache_from = None
if self.cache_tag:
response.append("Pulling cached image")
self.client.pull(repository=self.repository, tag=self.cache_tag)
cache_from = [f"{self.repository}:{self.cache_tag}"]
response.append(f"Setting cache to: {cache_from}")
for line in self.client.build(
fileobj=context_file,
path=self.dockerfile,
custom_context=True,
rm=True,
decode=True,
tag=self.ecr_url,
buildargs=self.build_args,
labels=self.labels,
cache_from=cache_from
):
if line.get("error") is not None:
self.context.remove()
response.append(line["error"])
self.log = response
self.build_status = constants.FAIL
self.summary["status"] = constants.STATUS_MESSAGE[self.build_status]
self.summary["end_time"] = datetime.now()
return self.build_status
if line.get("stream") is not None:
response.append(line["stream"])
elif line.get("status") is not None:
response.append(line["status"])
else:
response.append(str(line))
self.context.remove()
self.summary["image_size"] = int(
self.client.inspect_image(self.ecr_url)["Size"]
) / (1024 * 1024)
if self.summary["image_size"] > self.info["image_size_baseline"] * 1.20:
response.append("Image size baseline exceeded")
response.append(f"{self.summary['image_size']} > 1.2 * {self.info['image_size_baseline']}")
response += self.collect_installed_packages_information()
self.build_status = constants.FAIL_IMAGE_SIZE_LIMIT
else:
self.build_status = constants.SUCCESS
for line in self.client.push(
self.repository, self.tag, stream=True, decode=True
):
if line.get("error") is not None:
response.append(line["error"])
self.log = response
self.build_status = constants.FAIL
self.summary["status"] = constants.STATUS_MESSAGE[self.build_status]
self.summary["end_time"] = datetime.now()
return self.build_status
if line.get("stream") is not None:
response.append(line["stream"])
else:
response.append(str(line))
self.summary["status"] = constants.STATUS_MESSAGE[self.build_status]
self.summary["end_time"] = datetime.now()
self.summary["ecr_url"] = self.ecr_url
self.log = response
return self.build_status