build/lib/tools/info/repo-reprepro.py

135 lines
5.3 KiB
Python
Raw Permalink Normal View History

#!/usr/bin/env python3
#
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2023 Ricardo Pardini <ricardo@pardini.net>
# This file is a part of the Armbian Build Framework https://github.com/armbian/build/
#
import json
import logging
import os
import sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from common import armbian_utils
# Prepare logging
armbian_utils.setup_logging()
log: logging.Logger = logging.getLogger("repo-reprepro")
# This is called like this:
# /usr/bin/python3 /armbian/lib/tools/info/repo-reprero.py /armbian/output/info/debs-to-repo-info.json /armbian/output/info/reprepro /armbian/output/info/reprepro/conf
debs_info_json_path = sys.argv[1]
reprepro_script_output_dir = sys.argv[2]
reprepro_conf_output_dir = sys.argv[3]
reprepro_conf_distributions_fn = os.path.join(reprepro_conf_output_dir, f"distributions")
reprepro_conf_options_fn = os.path.join(reprepro_conf_output_dir, f"options")
reprepro_output_script_fn = os.path.join(reprepro_script_output_dir, f"reprepro.sh")
# From the environment...
gpg_keyid = armbian_utils.get_from_env("REPO_GPG_KEYID")
# read the json file
with open(debs_info_json_path) as f:
artifact_debs = json.load(f)
# Now aggregate all repo_targets and their artifacts.
# This will be used to generate the reprepro config file.
repo_targets: dict[str, list] = {}
for artifact in artifact_debs:
one_repo_target = artifact["repo_target"]
if one_repo_target not in repo_targets:
repo_targets[one_repo_target] = []
repo_targets[one_repo_target].append(artifact)
# for each target
log.info(f"Generating repo config...")
all_distro_lines: list[str] = []
for one_repo_target in repo_targets:
distro_dict: dict[str, str] = {}
distro_dict["Origin"] = f"Armbian origin {one_repo_target}"
distro_dict["Label"] = f"Armbian label {one_repo_target}"
distro_dict["Codename"] = f"{one_repo_target}"
distro_dict["Suite"] = f"{one_repo_target}"
distro_dict["Architectures"] = "amd64 armhf arm64 riscv64"
distro_dict["Components"] = "main"
distro_dict["Description"] = f"Apt repository for Armbian"
if (gpg_keyid is not None) and (gpg_keyid != ""):
log.warning(f'Using REPO_GPG_KEYID from environment: {gpg_keyid}')
distro_dict["SignWith"] = gpg_keyid
else:
log.warning(f"Didn't get REPO_GPG_KEYID from environment. Will not sign the repo.")
for key in distro_dict:
all_distro_lines.append(f"{key}: {distro_dict[key]}")
all_distro_lines.append("")
# create the reprerepo distributions file for the target
with open(reprepro_conf_distributions_fn, "w") as f:
for line in all_distro_lines:
log.info(f"| {line}")
f.write(f"{line}\n")
log.info(f"Wrote {reprepro_conf_distributions_fn}")
options: list[str] = []
options.append("verbose")
# create the reprerepo options file for the target
with open(reprepro_conf_options_fn, "w") as f:
for option in options:
f.write(f"{option}\n")
log.info(f"Wrote {reprepro_conf_options_fn}")
# Prepare the reprepro-invoking bash script
bash_lines = [
"#!/bin/bash",
'set -e',
'set -o pipefail',
'mkdir -p "${REPO_CONF_LOCATION}"',
'cp -rv "${REPREPRO_INFO_DIR}/conf"/* "${REPO_CONF_LOCATION}"/',
# run clearvanished
'echo "reprepro clearvanished..."',
'reprepro -b "${REPO_LOCATION}" --delete clearvanished || echo "clearvanished failed"',
# run reprepro check
'echo "reprepro initial check..."',
'reprepro -b "${REPO_LOCATION}" check || echo "initial check failed"'
]
# Copy the config files to the repo dir (from REPREPRO_INFO_DIR/conf to REPO_CONF_LOCATION script-side)
for one_repo_target in repo_targets:
artifacts = repo_targets[one_repo_target]
log.info(f"Artifacts for target '{one_repo_target}': {len(artifacts)}")
all_debs_to_include: list[str] = []
# for each artifact
for artifact in artifacts:
# for each deb
for key in artifact["debs"]:
deb = artifact["debs"][key]
relative_deb_path = deb["relative_deb_path"]
all_debs_to_include.append(relative_deb_path)
all_debs_to_include_quoted = ['"${INCOMING_DEBS_DIR}/' + x + '"' for x in all_debs_to_include]
if len(all_debs_to_include) > 0:
# add all debs to the repop
cmds = ["reprepro", "-b", '"${REPO_LOCATION}"', "--component", "main", "includedeb", one_repo_target] + all_debs_to_include_quoted
bash_lines.append(f"echo 'reprepro importing {len(all_debs_to_include_quoted)} debs for target {one_repo_target}...' ")
bash_lines.append(" ".join(cmds))
# Always export at the end
export_cmds = ["reprepro", "-b", '"${REPO_LOCATION}"', "export"]
bash_lines.append(f"echo 'reprepro exporting...' ")
bash_lines.append(" ".join(export_cmds))
with open(reprepro_output_script_fn, "w") as f:
for line in bash_lines:
f.write(f"{line}\n")
log.info(f"Wrote {reprepro_output_script_fn}")