From f7e2efeddea231f95f75ebde28071af6cf9ddcb7 Mon Sep 17 00:00:00 2001 From: notplants Date: Fri, 13 May 2022 15:38:06 +0200 Subject: [PATCH] Add build_yunohost_binaries.py --- .../build_yunohost_binaries.py | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 peach_package_builder/build_yunohost_binaries.py diff --git a/peach_package_builder/build_yunohost_binaries.py b/peach_package_builder/build_yunohost_binaries.py new file mode 100644 index 0000000..7698242 --- /dev/null +++ b/peach_package_builder/build_yunohost_binaries.py @@ -0,0 +1,96 @@ +""" +script to cross-compile PeachCloud packages for arm64 and other architectures +""" +import subprocess + +from peach_package_builder.constants import * +from peach_package_builder.build_go_sbot import GO_SBOT_VERSION, GO_SSB_DIR + +# constants +PEACHCLOUD_VERSION = "1.0" +PROJECT_PATH = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) +RUST_WORKSPACE_DIR = WORKSPACE_SRC_DIR +BINARIES_DIR = "/srv/files.commoninternet.net/binaries" +PEACH_WORKSPACE_GIT_URL = "https://git.coopcloud.tech/PeachCloud/peach-workspace" +GO_SBOT_GIT_URL = "https://github.com/cryptoscope/ssb.git" +OUTPUT_DIR = "/srv/files.commoninternet.net" + + +def pull_go_repo(): + if not os.path.exists(GO_SSB_DIR): + subprocess.check_call(["git", "clone", GO_SBOT_GIT_URL, GO_SSB_DIR]) + else: + subprocess.check_call(["git", "pull"], cwd=GO_SSB_DIR) + + +def crosscompile_go_sbot(architecture, binaries_dir): + subprocess.check_call(["git", "pull"], cwd=GO_SSB_DIR) + print("[CROSS-COMPILING sbotcli]") + subprocess.check_call(["env", "GOOS=linux", "GOARCH={}".format(architecture), "go", "build", "./cmd/sbotcli"], cwd=GO_SSB_DIR) + print("[CROSS-COMPILING go-sbot]") + subprocess.check_call(["env", "GOOS=linux", "GOARCH={}".format(architecture), "go", "build", "./cmd/go-sbot"], cwd=GO_SSB_DIR) + for binary in ["sbotcli", "go-sbot"]: + binary_path = os.path.join(GO_SSB_DIR, binary) + output_path = os.path.join(binaries_dir, binary) + print("[COPYING {} TO {}]".format(binary_path, output_path)) + subprocess.check_call(["cp", binary_path, output_path]) + + +def build_rust_binary(service_name, binaries_dir, target="aarch64-unknown-linux-gnu"): + """ + this function builds a specific binary + :param service_name: string name of the service + :param target: architecture to build for + :return: + """ + print("[ BUILIDING SERVICE {} ]".format(service_name)) + service_path = os.path.join(RUST_WORKSPACE_DIR, service_name) + subprocess.check_output( + [ + CARGO_PATH, + "build", + "--release", + "--target", + target], + cwd=service_path).decode("utf-8").strip() + binary_path = os.path.join(RUST_WORKSPACE_DIR, "target/{}/release/{}".format(target, service_name)) + output_path = os.path.join(binaries_dir, service_name) + print("[ COPYING {} TO {} ]".format(binary_path, output_path)) + subprocess.call(["cp", binary_path, output_path]) + + +def publish(binaries_dir, architecture): + subprocess.check_call(["mkdir", "-p", OUTPUT_DIR]) + binaries = ["peach-web", "peach-config", "go-sbot", "sbotcli"] + output_folder_name = "peachcloud_{}_Linux_{}".format(PEACHCLOUD_VERSION, architecture) + output_folder_path = os.path.join(OUTPUT_DIR, output_folder_name) + subprocess.check_call(["mkdir", "-p", output_folder_path]) + for binary in binaries: + f_path = os.path.join(binaries_dir, binary) + output_path = os.path.join(output_folder_path, binary) + subprocess.check_call(["cp", f_path, output_path]) + # copy static files for peach-web + peach_web_static_path = os.path.join(RUST_WORKSPACE_DIR, "peach-web/static") + output_static_path = os.path.join(binaries_dir, "static") + subprocess.check_call(["cp", "-r", peach_web_static_path, output_static_path]) + # create a tar + tar_path = output_folder_path + ".tar.gz" + subprocess.check_call(["tar", "-czvf", tar_path, "-C", binaries_dir, "."], cwd=binaries_dir) + + +if __name__ == '__main__': + subprocess.check_call(["mkdir", "-p", OUTPUT_DIR]) + subprocess.check_call(["mkdir", "-p", BINARIES_DIR]) + pull_go_repo() + architectures = [ + ("aarch64-unknown-linux-gnu", "arm64", "aarch64"), + ("x86_64-unknown-linux-gnu", "amd64", "amd64"), + ] + for rust_architecture, go_architecture, yunohost_architecture in architectures: + print("BUILDING WITH ARCHITECTURE {}, {}, {}".format(rust_architecture, go_architecture, yunohost_architecture)) + binaries_dir = os.path.join(BINARIES_DIR, yunohost_architecture) + subprocess.check_call(["mkdir", "-p", binaries_dir]) + crosscompile_go_sbot(architecture=go_architecture, binaries_dir=binaries_dir) + build_rust_binary("peach-web", target=rust_architecture, binaries_dir=binaries_dir) + build_rust_binary("peach-config", target=rust_architecture, binaries_dir=binaries_dir) + publish(binaries_dir=binaries_dir, architecture=yunohost_architecture)