From 565f59459e4890de3cb85d0072ed73303004b556 Mon Sep 17 00:00:00 2001 From: Tomas Kopecek Date: Jan 19 2022 14:26:32 +0000 Subject: kiwi: use separate --release --- diff --git a/plugins/builder/kiwi.py b/plugins/builder/kiwi.py index a818315..277f08a 100644 --- a/plugins/builder/kiwi.py +++ b/plugins/builder/kiwi.py @@ -16,7 +16,6 @@ class KiwiBuildTask(BuildImageTask): _taskWeight = 4.0 def get_nvrp(self, desc_path): - # TODO: update release in desc kiwi_files = glob.glob('%s/*.kiwi' % desc_path) if len(kiwi_files) != 1: raise koji.GenericError("Repo must contain only one .kiwi file.") @@ -28,16 +27,11 @@ class KiwiBuildTask(BuildImageTask): name = image.getAttribute('name') version = None - release = None for preferences in image.getElementsByTagName('preferences'): try: version = preferences.getElementsByTagName('version')[0].childNodes[0].data except Exception: pass - try: - release = preferences.getElementsByTagName('release')[0].childNodes[0].data - except Exception: - release = None profile = None try: for p in image.getElementsByTagName('profiles')[0].getElementsByTagName('profile'): @@ -48,7 +42,7 @@ class KiwiBuildTask(BuildImageTask): pass if not version: raise koji.BuildError("Description file doesn't contain preferences/version") - return name, version, release, profile + return name, version, profile def handler(self, target, arches, desc_url, desc_path, opts=None): target_info = self.session.getBuildTarget(target, strict=True) @@ -101,18 +95,20 @@ class KiwiBuildTask(BuildImageTask): path = os.path.join(scmsrcdir, desc_path) - name, version, release, default_profile = self.get_nvrp(path) + name, version, default_profile = self.get_nvrp(path) if opts.get('profile') or default_profile: # package name is a combination of name + profile # in case profiles are not used, let's use the standalone name name = "%s-%s" % (name, opts.get('profile', default_profile)) bld_info = {} + if opts.get('release'): + release = opts['release'] + else: + release = self.session.getNextRelease({'name': name, 'version': version}) if not opts['scratch']: bld_info = self.initImageBuild(name, version, release, target_info, opts) release = bld_info['release'] - elif not release: - release = self.session.getNextRelease({'name': name, 'version': version}) try: subtasks = {} @@ -191,8 +187,7 @@ class KiwiCreateImageTask(BaseBuildTask): Methods = ['createKiwiImage'] _taskWeight = 2.0 - def prepareDescription(self, desc_path, name, version, release, repos): - # TODO: update release in desc + def prepareDescription(self, desc_path, name, version, repos): kiwi_files = glob.glob('%s/*.kiwi' % desc_path) if len(kiwi_files) != 1: raise koji.GenericError("Repo must contain only one .kiwi file.") @@ -236,15 +231,6 @@ class KiwiCreateImageTask(BaseBuildTask): releasever_node.appendChild(text) preferences.appendChild(releasever_node) - # TODO: release is part of version (major.minor.release) - # try: - # preferences.getElementsByTagName('release')[0].childNodes[0].data = release - # except Exception: - # rel_node = newxml.createElement('release') - # text = newxml.createTextNode(release) - # rel_node.appendChild(rel_node) - # preferences.appendChild(rel_node) - types = [] for pref in image.getElementsByTagName('preferences'): for type in pref.getElementsByTagName('type'): @@ -362,7 +348,7 @@ class KiwiCreateImageTask(BaseBuildTask): repos.append(baseurl) path = os.path.join(scmsrcdir, desc_path) - desc, types = self.prepareDescription(path, name, version, release, repos) + desc, types = self.prepareDescription(path, name, version, repos) self.uploadFile(desc) cmd = ['kiwi-ng'] @@ -378,6 +364,16 @@ class KiwiCreateImageTask(BaseBuildTask): if rv: raise koji.GenericError("Kiwi failed") + # rename artifacts accordingly to release + bundle_dir = '/builddir/result/bundle' + cmd = ['kiwi-ng', 'result', 'bundle', + '--target-dir', target_dir, + '--bundle-dir', bundle_dir, + '--id', release] + rv = broot.mock(['--cwd', broot.tmpdir(within=True), '--chroot', '--'] + cmd) + if rv: + raise koji.GenericError("Kiwi failed") + resultdir = joinpath(broot.rootdir(), target_dir[1:]) try: # new version has json format, older pickle (needs python3-kiwi installed) @@ -385,7 +381,7 @@ class KiwiCreateImageTask(BaseBuildTask): except (FileNotFoundError, JSONDecodeError): # try old variant import pickle - result = pickle.load(open(joinpath(resultdir, 'kiwi.result'), 'rb')) # nosec + result = pickle.load(open(joinpath(resultdir, 'kiwi.result'), 'rb')) # nosec # convert from namedtuple's to normal dict result_files = {k: v._asdict() for k, v in result.result_files.items()} @@ -408,18 +404,22 @@ class KiwiCreateImageTask(BaseBuildTask): if os.path.exists(root_log_path): self.uploadFile(root_log_path, remoteName="image-root.log") - # for type in types: - # img_file = '%s.%s-%s.%s' % (name, version, arch, type) - # self.uploadFile(os.path.join(broot.rootdir()), remoteName=img_file) - # imgdata['files'].append(img_file) for ftype in ('disk_image', 'disk_format_image', 'installation_image'): fdata = result_files.get(ftype) if not fdata: continue - fpath = os.path.join(broot.rootdir(), fdata['filename'][1:]) + # hack to use correct paths derived from results + filename = os.path.basename(fdata['filename']) + (name, ext) = os.path.splitext(filename) + filename = f'{name}-{release}{ext}' + fpath = os.path.dirname(fdata['filename'])[len(target_dir) + 1:] + fpath = os.path.join(broot.rootdir(), bundle_dir[1:], fpath, filename) img_file = os.path.basename(fpath) - self.uploadFile(fpath, remoteName=os.path.basename(img_file)) - imgdata['files'].append(img_file) + if os.path.exists(fpath): + self.uploadFile(fpath, remoteName=os.path.basename(img_file)) + imgdata['files'].append(img_file) + else: + self.logger.debug(f'File {img_file} is not present in bundle but is in results') if not self.opts.get('scratch'): if False: diff --git a/plugins/cli/kiwi.py b/plugins/cli/kiwi.py index 9ae9046..7e7af2c 100644 --- a/plugins/cli/kiwi.py +++ b/plugins/cli/kiwi.py @@ -18,6 +18,7 @@ def handle_kiwi_build(goptions, session, args): parser = OptionParser(usage=usage) parser.add_option("--scratch", action="store_true", default=False, help="Perform a scratch build") + parser.add_option("--release", help="Release of the output image") parser.add_option("--repo", action="append", help="Specify a repo that will override the repo used to install " "RPMs in the image. May be used multiple times. The " @@ -50,6 +51,7 @@ def handle_kiwi_build(goptions, session, args): for arch in options.optional_arches.split(',') if arch], 'profile': options.kiwi_profile, + 'release': options.release, } arches = [] diff --git a/plugins/hub/kiwi.py b/plugins/hub/kiwi.py index 2ab0cdd..3adf6e9 100644 --- a/plugins/hub/kiwi.py +++ b/plugins/hub/kiwi.py @@ -16,7 +16,7 @@ koji.tasks.LEGACY_SIGNATURES['createKiwiImage'] = [ @export def kiwiBuild(target, arches, desc_url, desc_path, optional_arches=None, profile=None, - scratch=False, priority=None, repos=None): + scratch=False, priority=None, repos=None, release=None): context.session.assertPerm('image') taskOpts = { 'channel': 'image', @@ -32,6 +32,7 @@ def kiwiBuild(target, arches, desc_url, desc_path, optional_arches=None, profile 'optional_arches': optional_arches, 'profile': profile, 'scratch': scratch, + 'release': release, 'repos': repos or [], } return kojihub.make_task('kiwiBuild',