From 2c5cf67014f3c755c2f1b42794f804388a64e35c Mon Sep 17 00:00:00 2001 From: Neal Gompa Date: Sat, 16 Nov 2024 20:18:31 -0500 Subject: kiwi-build: Update to mimic production builds more closely Production builds in Fedora have a couple extra features: * ISOs have custom overrides to set the correct volume/app IDs * Image filenames are structured to follow roughly NVRA format Now we support these features with extra helper scripts. If a "image release" value is passed in, then we fully mimic the production image build process. This will be particularly useful for making respins of Fedora images with updates applied. --- scripts/fedora-kiwi-bundle-format-generator | 31 +++++++++ scripts/fedora-live-iso-label-generator | 101 ++++++++++++++++++++++++++++ 2 files changed, 132 insertions(+) create mode 100755 scripts/fedora-kiwi-bundle-format-generator create mode 100755 scripts/fedora-live-iso-label-generator (limited to 'scripts') diff --git a/scripts/fedora-kiwi-bundle-format-generator b/scripts/fedora-kiwi-bundle-format-generator new file mode 100755 index 0000000..571a17b --- /dev/null +++ b/scripts/fedora-kiwi-bundle-format-generator @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 + +# Simple tool to generate bundle formats for kiwi image builds +# Author: Neal Gompa +# SPDX-3.0-License-Identifier: GPL-3.0-or-later +# SPDX-2.0-License-Identifier: GPL-3.0+ + +from argparse import ArgumentParser +from pathlib import Path + +import xml.etree.ElementTree as ET + + +parser = ArgumentParser(description="Generator of ISO labels for Fedora live media builds") +parser.add_argument("kiwi_file", type=Path, default="Fedora.kiwi", help="kiwi description file") +parser.add_argument("image_profile", type=str, help="kiwi image profile") +parser.add_argument("--oci-variant", "-o", action="store_true", help="generate oci variant") +args = parser.parse_args() + +xml_tree = ET.parse(args.kiwi_file) +image_root = xml_tree.getroot() + +image_basename = image_root.attrib["name"] +image_profile = args.image_profile + +image_bundle_format = f"{image_basename}-{image_profile}-%v.%I.%A" + +if args.oci_variant: + print(f"{image_bundle_format}.%T") +else: + print(image_bundle_format) diff --git a/scripts/fedora-live-iso-label-generator b/scripts/fedora-live-iso-label-generator new file mode 100755 index 0000000..6aaa799 --- /dev/null +++ b/scripts/fedora-live-iso-label-generator @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 + +# Simple tool to generate volume IDs and application IDs for ISOs for kiwi image builds +# Author: Neal Gompa +# SPDX-3.0-License-Identifier: GPL-3.0-or-later +# SPDX-2.0-License-Identifier: GPL-3.0+ + +# Used to map kiwi profiles to application IDs (which may also +# may be used for connecting to volume ID substitutions). +profile_to_application_id = { + "KDE-Desktop": "KDE_Desktop", + "KDE-Mobile": "KDE_Mobile", +} + +# Used by Pungi to replace "Cloud" with "C" (etc.) in ISO volume IDs. +# There is a hard 32-character limit on ISO volume IDs, so we use +# these to try and produce short enough but legible IDs. Note this is +# duplicated in Koji for live images, as livemedia-creator does not +# allow Pungi to tell it what volume ID to use. Note: +# https://fedoraproject.org/wiki/User:Adamwill/Draft_fedora_image_naming_policy +# "-Workstation-" is a temporary workaround. See +# https://pagure.io/pungi-fedora/pull-request/525 +# Replace "Cloud" with "C" in volume id etc. +# WARNING: This list *MUST* remain in sync with pungi-fedora! +# https://pagure.io/pungi-fedora/blob/main/f/general.conf +volume_id_substitutions = { + "Beta": "B", + "Rawhide": "rawh", + "Astronomy_KDE": "AstK", + "Silverblue": "SB", + "Kinoite": "Knt", + "Cinnamon": "Cinn", + "Cloud": "C", + "Comp_Neuro": "CNr", + "Design_suite": "Dsgn", + "Electronic_Lab": "Elec", + "Everything": "E", + "Games": "Game", + "Images": "img", + "Jam_KDE": "Jam", + "KDE_Desktop": "KDE", + "KDE_Mobile": "KDEM", + "MATE_Compiz": "MATE", + "MiracleWM": "MirWM", + "Onyx": "Onyx", + # Note https://pagure.io/pungi-fedora/issue/533 + "Python-Classroom": "Clss", + "Python_Classroom": "Clss", + "Robotics": "Robo", + "Scientific_KDE": "SciK", + "Security": "Sec", + "Sericea": "Src", + "Server": "S", + "-Workstation-": "-WS-", +} + + + +from argparse import ArgumentParser +from pathlib import Path + +import xml.etree.ElementTree as ET + + +parser = ArgumentParser(description="Generator of ISO labels for Fedora live media builds") +parser.add_argument("kiwi_file", type=Path, default="Fedora.kiwi", help="kiwi description file") +parser.add_argument("image_profile", type=str, help="kiwi image profile") +parser.add_argument("--output-kiwi-args", "-k", action="store_true", help="generate kiwi args instead of csv") +args = parser.parse_args() + +xml_tree = ET.parse(args.kiwi_file) +image_root = xml_tree.getroot() + +image_basename = image_root.attrib["name"] +image_version = image_root.find("preferences/version").text + +image_volid_version = image_version + +if image_volid_version == "Rawhide": + image_volid_version = "rawh" + +image_profile = args.image_profile +if image_profile.endswith("-Live"): + image_profile_baseprefix = image_profile[:-5] +else: + image_profile_baseprefix = image_profile + +image_profile_variant_appid_prefix = image_profile_baseprefix + +if image_profile_baseprefix in profile_to_application_id.keys(): + image_profile_variant_appid_prefix = profile_to_application_id[image_profile_baseprefix] + +image_profile_variant_volid_prefix = volume_id_substitutions[image_profile_variant_appid_prefix] + +image_appid = f"{image_basename}-{image_profile_variant_appid_prefix}-Live-{image_version}" +image_volid = f"{image_basename}-{image_profile_variant_volid_prefix}-Live-{image_volid_version}" + +if args.output_kiwi_args: + print(f"--set-type-attr=application_id={image_appid} --set-type-attr=volid={image_volid}") +else: + print(f"application_id,{image_appid},volid,{image_volid}") -- cgit v1.3.1+13