scripts/build.py (79 lines of code) (raw):

# # Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one # or more contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright # ownership. Elasticsearch B.V. licenses this file to you under # the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. # import platform import sys from pathlib import Path from time import time from scripts.utils import ( Constants, container_backend, detect_git, detect_pyinstaller, project_version, ) def run() -> None: git = detect_git() commit_hash_short = git("rev-parse", "--short", "HEAD").strip() current_time_epoch = int(time()) version = project_version() python_version = platform.python_version() image_id = f"{version}-{current_time_epoch}-{commit_hash_short}" # Create dist dir local_dist_path = Path("dist") local_dist_path.mkdir(parents=True, exist_ok=False) local_dist_path = local_dist_path.absolute() system = platform.system().lower() if system == "darwin": pyinstaller = detect_pyinstaller() pyinstaller("terranova.spec", _out=sys.stdout, _err=sys.stderr) arch = platform.machine() arch = "amd64" if arch == "x86_64" else arch Path("./dist/terranova").replace( Path(f"./dist/terranova-{version}-{system}-{arch}") ) elif system == "linux": # Use cross-build to build both amd64 and arm64 versions. cmd, env = container_backend() for arch in ["amd64", "arm64"]: platform_arch = f"linux/{arch}" cmd( "buildx", "build", "--load", "--platform", platform_arch, "--build-arg", f"base_image_version={python_version}", "-t", f"{Constants.REGISTRY_URL}/terranova:{image_id}", "-f", "Containerfile", ".", _out=sys.stdout, _err=sys.stderr, _env=env, ) container_id = cmd( "run", "-d", "--platform", platform_arch, "--entrypoint=cat", f"{Constants.REGISTRY_URL}/terranova:{image_id}", _err=sys.stderr, _env=env, ).strip() cmd( "cp", f"{container_id}:/opt/terranova/dist/terranova", (local_dist_path / f"terranova-{version}-linux-{arch}").as_posix(), _out=sys.stdout, _err=sys.stderr, _env=env, ) cmd( "rm", "-f", container_id, _out=sys.stdout, _err=sys.stderr, _env=env, ) else: print(f"Unsupported system: {system}", file=sys.stderr)