blob: df2c0d37b813596c0f984a0064fc9eb8bf62babe [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF 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 argparse
import subprocess
import platform
import urllib.request as ulib
import os
import logging
import importlib
BAZEL_VERSION = "6.3.2"
PYARROW_VERSION = "14.0.0"
PROJECT_ROOT_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "../")
logging.basicConfig(
level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s"
)
def _exec_cmd(cmd: str):
logging.info(f"running command: {cmd}")
try:
result = subprocess.check_output(cmd, shell=True, universal_newlines=True)
except subprocess.CalledProcessError as error:
logging.error(error.stdout)
raise
logging.info(f"command result: {result}")
return result
def _get_os_name_lower():
return platform.system().lower()
def _is_windows():
return _get_os_name_lower() == "windows"
def _get_os_machine():
machine = platform.machine().lower()
# Unified to x86_64(Windows return AMD64, others return x86_64).
return machine.replace("amd64", "x86_64")
def _get_bazel_download_url():
download_url_base = (
f"https://github.com/bazelbuild/bazel/releases/download/{BAZEL_VERSION}"
)
suffix = "exe" if _is_windows() else "sh"
return (
f"{download_url_base}/bazel-{BAZEL_VERSION}{'' if _is_windows() else '-installer'}-"
f"{_get_os_name_lower()}-{_get_os_machine()}.{suffix}"
)
def _cd_project_subdir(subdir):
os.chdir(os.path.join(PROJECT_ROOT_DIR, subdir))
def _run_cpp():
_install_cpp_deps()
# run test
query_result = _exec_cmd("bazel query //...")
_exec_cmd(
"bazel test {}".format(query_result.replace("\n", " ").replace("\r", " "))
)
def _run_rust():
_exec_cmd("rustup component add clippy-preview")
_exec_cmd("rustup component add rustfmt")
logging.info("Executing fury rust tests")
_cd_project_subdir("rust")
cmds = (
"cargo doc --no-deps --document-private-items --all-features --open",
"cargo fmt --all -- --check",
"cargo fmt --all",
"cargo clippy --workspace --all-features --all-targets",
"cargo doc",
"cargo build --all-features --all-targets",
"cargo test",
"cargo clean",
)
for cmd in cmds:
_exec_cmd(cmd)
logging.info("Executing fury rust tests succeeds")
def _run_js():
logging.info("Executing fury javascript tests.")
_cd_project_subdir("javascript")
_exec_cmd("npm install")
_exec_cmd("npm run test")
logging.info("Executing fury javascript tests succeeds.")
def _install_cpp_deps():
_exec_cmd(f"pip install pyarrow=={PYARROW_VERSION}")
_exec_cmd("pip install psutil")
_install_bazel()
def _install_bazel():
local_name = "bazel.exe" if _is_windows() else "bazel-installer.sh"
bazel_download_url = _get_bazel_download_url()
logging.info(bazel_download_url)
ulib.urlretrieve(bazel_download_url, local_name)
os.chmod(local_name, 0o777)
if _is_windows():
bazel_path = os.path.join(os.getcwd(), local_name)
_exec_cmd(f'setx path "%PATH%;{bazel_path}"')
else:
_exec_cmd(f"./{local_name} --user")
os.remove(local_name)
# bazel install status check
_exec_cmd("bazel --version")
# default is byte
psutil = importlib.import_module("psutil")
total_mem = psutil.virtual_memory().total
limit_jobs = int(total_mem / 1024 / 1024 / 1024 / 3)
with open(".bazelrc", "a") as file:
file.write(f"\nbuild --jobs={limit_jobs}")
def _parse_args():
parser = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter
)
parser.set_defaults(func=parser.print_help)
subparsers = parser.add_subparsers()
cpp_parser = subparsers.add_parser(
"cpp",
description="Run C++ CI",
help="Run C++ CI",
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
)
cpp_parser.set_defaults(func=_run_cpp)
rust_parser = subparsers.add_parser(
"rust",
description="Run Rust CI",
help="Run Rust CI",
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
)
rust_parser.set_defaults(func=_run_rust)
js_parser = subparsers.add_parser(
"javascript",
description="Run Javascript CI",
help="Run Javascript CI",
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
)
js_parser.set_defaults(func=_run_js)
args = parser.parse_args()
arg_dict = dict(vars(args))
del arg_dict["func"]
args.func(**arg_dict)
if __name__ == "__main__":
_parse_args()