diff --git a/package_release.py b/package_release.py index 36dde3c47b55218b095297dfa28280ba96c02205..b7bc8241e9faa3e9cd26d28b39d77f8e41b25912 100755 --- a/package_release.py +++ b/package_release.py @@ -5,7 +5,69 @@ import json import os import sys import shutil -import subprocess +import hashlib +import tempfile + + +def md5(fname): + hash_md5 = hashlib.md5() + with open(fname, "rb") as f: + for chunk in iter(lambda: f.read(4096), b""): + hash_md5.update(chunk) + return hash_md5.hexdigest() + + +def copy_files(files, input_dir, subdir, output_dir, outlocal_dir): + md5sums = {} + if output_dir is not None: + os.makedirs(os.path.join(output_dir, subdir), exist_ok=True) + if outlocal_dir is not None: + os.makedirs(os.path.join(outlocal_dir, subdir), exist_ok=True) + + for f in files: + source_file = os.path.join(input_dir, f) + if os.path.exists(source_file): + + if output_dir is not None: + target_file = os.path.join( + output_dir, subdir, os.path.basename(source_file) + ) + print("Copy: %s -> %s" % (source_file, target_file)) + shutil.copyfile(source_file, target_file, follow_symlinks=True) + + if outlocal_dir is not None: + target_file = os.path.join( + outlocal_dir, subdir, os.path.basename(source_file) + ) + print("Copy: %s -> %s" % (source_file, target_file)) + shutil.copyfile(source_file, target_file, follow_symlinks=True) + + md5sums[os.path.basename(source_file)] = md5(source_file) + else: + print("Missing: " + source_file) + + # Write md5sums file: + with tempfile.TemporaryDirectory() as tmp: + source_file = os.path.join(tmp, subdir, "md5sums.txt") + os.makedirs(os.path.dirname(source_file), exist_ok=True) + + with open(source_file, "w") as f_md5: + for f, h in md5sums.items(): + f_md5.write("{} {}\n".format(h, f)) + + if output_dir is not None: + target_file = os.path.join( + output_dir, subdir, os.path.basename(source_file) + ) + print("Copy: %s -> %s" % (source_file, target_file)) + shutil.copyfile(source_file, target_file, follow_symlinks=True) + + if outlocal_dir is not None: + target_file = os.path.join( + outlocal_dir, subdir, os.path.basename(source_file) + ) + print("Copy: %s -> %s" % (source_file, target_file)) + shutil.copyfile(source_file, target_file, follow_symlinks=True) def main(): @@ -14,7 +76,6 @@ def main(): "--images-dir", help="""Yocto images directory""", dest="images_dir", - required=True, ) parser.add_argument( "--release-dir", @@ -27,13 +88,30 @@ def main(): help="""Yocto sdk directory""", dest="sdk_dir", ) + parser.add_argument( + "--doc-dir", + help="""Documentation directory""", + dest="doc_dir", + ) args, _ = parser.parse_known_args() # Get bitbake variables from testdata.json file - testdata_files = glob.glob(args.images_dir + "/*.testdata.json") + testdata_files = [] + if args.images_dir is not None: + testdata_files += glob.glob(args.images_dir + "/*.testdata.json") + if args.sdk_dir is not None: + testdata_files += glob.glob(args.sdk_dir + "/*.testdata.json") + + # Debug stuff if not testdata_files: - sys.exit("ERROR: no *.testdata.json file found in images directory") + print(args.images_dir) + for f in glob.glob(args.images_dir + "/*"): + print("-- ", f) + print(args.sdk_dir) + for f in glob.glob(args.sdk_dir + "/*"): + print("-- ", f) + sys.exit("ERROR: no *.testdata.json file found in image or sdk dir.") with open(testdata_files[0], "r") as f: buildvars = json.load(f) @@ -43,45 +121,41 @@ def main(): sdkname = buildvars["TOOLCHAIN_OUTPUTNAME"] artifacts_image = buildvars["DISTRO_IMAGES"].split() artifacts_all = buildvars["DISTRO_RELEASE_ARTEFACTS"].split() + artifacts_all.append("BUILD_SRCREVS.log") # Set directories (use relative path) release_name = "GUF-Yocto-%s" % version - output_dir = "%s/%s/%s" % (args.release_dir, release_name, machine) - images_dir_relative = os.path.relpath(args.images_dir, output_dir) - + # output_dir = "%s/%s/%s" % (args.release_dir, release_name, machine) + output_dir = os.path.join(args.release_dir, release_name) # Create output directory os.makedirs(output_dir, exist_ok=True) - # Create symlinks for all images (to reduce size and network load) - for artifact in artifacts_image: - source_file = "%s/%s" % (images_dir_relative, artifact) - target_file = "%s/%s" % (output_dir, artifact) - print("Create link: %s -> %s" % (target_file, source_file)) - os.symlink(source_file, target_file) - - # Copy all other artifacts - for artifact in artifacts_all: - if artifact in artifacts_image: - continue - source_file = "%s/%s" % (args.images_dir, artifact) - target_file = "%s/%s" % (output_dir, artifact) - print("Copy: %s -> %s" % (target_file, source_file)) - shutil.copyfile(source_file, target_file, follow_symlinks=True) + # local output ( mount on host machine) + release_name_local = "Yocto-%s" % version + if version.startswith("fngsystem"): + outlocal_base = "/artifacts-fngsystem" + else: + outlocal_base = "/artifacts-yocto" + # outlocal_dir = "%s/%s/%s" % (outlocal_base, release_name_local, machine) + outlocal_dir = os.path.join(outlocal_base, release_name_local) + os.makedirs(outlocal_dir, exist_ok=True) + + if args.doc_dir is not None: + doc_files = glob.glob(args.doc_dir + "/*.md") + copy_files(doc_files, "", "", output_dir, outlocal_dir) + + if args.images_dir is not None: + # Add some additional files to the artifacts + for artifact in artifacts_image: + artifacts_all.append(artifact.split(".")[0] + ".manifest") + artifacts_all.append(artifact.split(".")[0] + ".testdata.json") + + copy_files(artifacts_all, args.images_dir, machine, output_dir, outlocal_dir) # Handle SDK if available - if args.sdk_dir != "": - sdkfile = "{}.sh".format(sdkname) - sdkfilepath = "{}/{}".format(args.sdk_dir, sdkfile) - sdkoutput_dir = "{}/sdk".format(output_dir) - sdkfile_parts = "{}/{}.part".format(sdkoutput_dir, sdkfile) - if os.path.exists(sdkfilepath): - print("Copy and split SDK from ", sdkfilepath) - os.makedirs(sdkoutput_dir, exist_ok=True) - subprocess.run( - ["split", "-b", "512M", sdkfilepath, sdkfile_parts], check=True - ) - else: - print("Skipping SDK, not found at ", sdkfilepath) + if args.sdk_dir is not None: + sdkfiles = glob.glob(args.sdk_dir + sdkname + "*") + copy_files(sdkfiles, "", os.path.join(machine, "sdk"), None, outlocal_dir) if __name__ == "__main__":