dev/release/verify.py (115 lines of code) (raw):
#!/usr/bin/env python3
# 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.
# Derived from Apache OpenDAL v0.45.1
# https://github.com/apache/opendal/blob//5079125/scripts/verify.py
import subprocess
import os
from pathlib import Path
BASE_DIR = Path(os.getcwd())
# Define colors for output
YELLOW = "\033[37;1m"
GREEN = "\033[32;1m"
ENDCOLOR = "\033[0m"
def check_signature(pkg):
"""Check the GPG signature of the package."""
try:
subprocess.check_call(["gpg", "--verify", f"{pkg}.asc", pkg])
print(f"{GREEN}> Success to verify the gpg sign for {pkg}{ENDCOLOR}")
except subprocess.CalledProcessError:
print(f"{YELLOW}> Failed to verify the gpg sign for {pkg}{ENDCOLOR}")
def check_sha512sum(pkg):
"""Check the sha512 checksum of the package."""
try:
subprocess.check_call(["sha512sum", "--check", f"{pkg}.sha512"])
print(f"{GREEN}> Success to verify the checksum for {pkg}{ENDCOLOR}")
except subprocess.CalledProcessError:
print(f"{YELLOW}> Failed to verify the checksum for {pkg}{ENDCOLOR}")
def extract_packages():
for file in BASE_DIR.glob("*.tar.gz"):
subprocess.run(["tar", "-xzf", file], check=True)
def check_license(dir):
print(f"> Start checking LICENSE file in {dir}")
if not (dir / "LICENSE").exists():
raise f"{YELLOW}> LICENSE file is not found{ENDCOLOR}"
print(f"{GREEN}> LICENSE file exists in {dir}{ENDCOLOR}")
def check_notice(dir):
print(f"> Start checking NOTICE file in {dir}")
if not (dir / "NOTICE").exists():
raise f"{YELLOW}> NOTICE file is not found{ENDCOLOR}"
print(f"{GREEN}> NOTICE file exists in {dir}{ENDCOLOR}")
def install_conda():
print("Start installing conda")
subprocess.run(["wget", "https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh"], check=True)
subprocess.run(["bash", "Miniconda3-latest-Linux-x86_64.sh", "-b"], check=True)
print(f"{GREEN}Success to install conda{ENDCOLOR}")
def maybe_setup_conda(dependencies):
# Optionally setup a conda environment with the given dependencies
if ("USE_CONDA" in os.environ) and (os.environ["USE_CONDA"] > 0):
print("Configuring conda environment...")
subprocess.run(["conda", "deactivate"], check=False, stderr=subprocess.STDOUT)
create_env_command = ["conda", "create", "--name", "graphar", "--yes", "python=3.8"]
subprocess.run(create_env_command, check=True, stderr=subprocess.STDOUT)
install_deps_command = ["conda", "install", "--name", "graphar", "--yes"] + dependencies
subprocess.run(install_deps_command, check=True, stderr=subprocess.STDOUT)
subprocess.run(["conda", "activate", "graphar"], check=True, stderr=subprocess.STDOUT, shell=True)
def build_and_test_cpp(dir):
print("Start building, install and test C++ library")
maybe_setup_conda(["--file", f"{dir}/dev/release/conda_env_cpp.txt"])
cmake_command = ["cmake", ".", "-DBUILD_TESTS=ON"]
subprocess.run(
cmake_command,
cwd=dir / "cpp",
check=True,
stderr=subprocess.STDOUT,
)
build_and_install_command = [
"cmake",
"--build",
".",
"--target",
"install",
]
subprocess.run(
build_and_install_command,
cwd=dir / "cpp",
check=True,
stderr=subprocess.STDOUT,
)
test_command = [
"ctest",
"--output-on-failure",
"--timeout",
"300",
"-VV"
]
subprocess.run(
test_command,
cwd=dir / "cpp",
check=True,
stderr=subprocess.STDOUT,
)
print(f"{GREEN}Success to build graphar c++{ENDCOLOR}")
def build_and_test_scala(dir):
print("Start building, install and test Scala with Spark library")
maybe_setup_conda(["--file", f"{dir}/dev/release/conda_env_scala.txt"])
build_command_32=["mvn", "clean", "package", "-P", "datasource32"]
subprocess.run(
build_command_32,
cwd=dir / "maven-projects/spark",
check=True,
stderr=subprocess.STDOUT,
)
build_command_33=["mvn", "clean", "package", "-P", "datasource33"]
subprocess.run(
build_command_33,
cwd=dir / "maven-projects/spark",
check=True,
stderr=subprocess.STDOUT,
)
print(f"{GREEN}Success to build graphar scala{ENDCOLOR}")
if __name__ == "__main__":
# Get a list of all files in the current directory
files = [f for f in os.listdir(".") if os.path.isfile(f)]
for pkg in files:
# Skip files that don't have a corresponding .asc or .sha512 file
if not os.path.exists(f"{pkg}.asc") or not os.path.exists(f"{pkg}.sha512"):
continue
print(f"> Checking {pkg}")
# Perform the checks
check_signature(pkg)
check_sha512sum(pkg)
extract_packages()
for dir in BASE_DIR.glob("apache-graphar-*-src/"):
check_license(dir)
check_notice(dir)
build_and_test_cpp(dir)
build_and_test_scala(dir)