""" Builds a container image with the provided image name and tag. Usage: python build_image.py [] """ import subprocess import pathlib import logging import typing import sys import os import re logger = logging.getLogger("build-image") def get_tag(is_ci: bool) -> str: """ Gets an image tag composed of the short sha of the current commit and, depending on the is_ci flag, a "-dev" suffix. """ result = subprocess.run( "git rev-parse --short HEAD", shell=True, capture_output=True, check=True ) sha = re.sub(r"\n", "", str(result.stdout.decode('utf-8'))) if not is_ci: return f"{sha}-dev" return sha def build_image(image_name: str, tag: str, image_path: typing.Optional[pathlib.Path]): """ Calls Podman to build the container image defined at image_path, which defaults to the current directory. The built image is named and tagged using image_name and tag. """ if image_path is None: image_path = pathlib.Path("./Dockerfile") cwd = image_path.parent image_path = image_path.relative_to(cwd) subprocess.run( f"podman build --no-cache -t {image_name}:{tag} -f {str(image_path)}", shell=True, check=True, cwd=cwd, ) def run(args: list[str]): """ CLI entrypoint. """ if len(args) < 1: raise ValueError( "There should be at least one argument. " "Correct usage: python build_image.py [image-path]" ) if len(args) > 2: raise ValueError( "Unrecognized arguments. " "Correct usage: python build_image.py [image-path]" ) tagged_image_name = args[0] image_name_parts = tagged_image_name.split(":") name = image_name_parts[0] tag = ( image_name_parts[1] if len(image_name_parts) == 2 else get_tag(bool(os.environ.get("CI", False))) ) image_path = args[1] if len(args) == 2 else None build_image(name, tag, pathlib.Path(image_path)) if __name__ == "__main__": try: run(sys.argv[1:]) except Exception as e: # pylint: disable=broad-exception-caught logger.error(e) exit(1)