From be641dee57d189c12c87ad22b5316164fa1db4bc Mon Sep 17 00:00:00 2001 From: mprahl Date: Nov 07 2019 16:18:38 +0000 Subject: [PATCH 1/2] Set skip_if_unavailable=True on localrepo to avoid module-build-macros failures for local builds When module-build-macros is built, the localrepo hasn't been generated yet. This has caused errors on Fedora 31. --- diff --git a/module_build_service/builder/MockModuleBuilder.py b/module_build_service/builder/MockModuleBuilder.py index 65ceacb..6e64525 100644 --- a/module_build_service/builder/MockModuleBuilder.py +++ b/module_build_service/builder/MockModuleBuilder.py @@ -109,7 +109,13 @@ class MockModuleBuilder(GenericBuilder): os.makedirs(self.configdir) # Generate path to mock config and add local repository there. - self._add_repo("localrepo", "file://" + self.resultsdir, "metadata_expire=1\n") + # Set skip_if_unavailable=True since the repo isn't available until after + # module-build-macros is built. + self._add_repo( + "localrepo", + "file://" + self.resultsdir, + "metadata_expire=1\nskip_if_unavailable=True\n", + ) # Remove old files from the previous build of this tag but only # before the first build is done, otherwise we would remove files From 1160d47e7a965c962dda278a4de81f5ec8026c6d Mon Sep 17 00:00:00 2001 From: mprahl Date: Nov 07 2019 16:18:50 +0000 Subject: [PATCH 2/2] Stop adding repo entries for empty tags for local builds DNF fails on Fedora 31 when there is a repo entry to an empty directory. --- diff --git a/module_build_service/builder/MockModuleBuilder.py b/module_build_service/builder/MockModuleBuilder.py index 6e64525..cba9684 100644 --- a/module_build_service/builder/MockModuleBuilder.py +++ b/module_build_service/builder/MockModuleBuilder.py @@ -373,18 +373,22 @@ class MockModuleBuilder(GenericBuilder): repo_name = tag = source koji_config = get_koji_config(self.config) koji_session = koji.ClientSession(koji_config.server, opts=koji_config) + # Check to see if there are any external repos tied to the tag + for ext_repo in koji_session.getTagExternalRepos(tag): + self._add_repo(ext_repo["external_repo_name"], ext_repo["url"]) + repo = koji_session.getRepo(repo_name) if repo: baseurl = koji.PathInfo(topdir=koji_config.topurl).repo(repo["id"], repo_name) baseurl = "{0}/{1}/".format(baseurl, self.arch) else: repo_dir = os.path.join(self.config.cache_dir, "koji_tags", tag) - create_local_repo_from_koji_tag( + should_add_repo = create_local_repo_from_koji_tag( self.config, tag, repo_dir, [self.arch, "noarch"]) + if not should_add_repo: + continue baseurl = "file://" + repo_dir - # Check to see if there are any external repos tied to the tag - for ext_repo in koji_session.getTagExternalRepos(repo_name): - self._add_repo(ext_repo["external_repo_name"], ext_repo["url"]) + self._add_repo(repo_name, baseurl) self._write_mock_config() diff --git a/module_build_service/builder/utils.py b/module_build_service/builder/utils.py index 5309b5e..e922915 100644 --- a/module_build_service/builder/utils.py +++ b/module_build_service/builder/utils.py @@ -72,6 +72,8 @@ def create_local_repo_from_koji_tag(config, tag, repo_dir, archs=None): Downloads the packages build for one of `archs` (defaults to ['x86_64', 'noarch']) in Koji tag `tag` to `repo_dir` and creates repository in that directory. Needs config.koji_profile and config.koji_config to be set. + + If the there are no builds associated with the tag, False is returned. """ # Placed here to avoid py2/py3 conflicts... @@ -92,6 +94,10 @@ def create_local_repo_from_koji_tag(config, tag, repo_dir, archs=None): except koji.GenericError: log.exception("Failed to list rpms in tag %r" % tag) + if not builds: + log.debug("No builds are associated with the tag %r", tag) + return False + # Reformat builds so they are dict with build_id as a key. builds = {build["build_id"]: build for build in builds} @@ -162,3 +168,5 @@ def create_local_repo_from_koji_tag(config, tag, repo_dir, archs=None): log.info("Creating local repository in %s" % repo_dir) execute_cmd(["/usr/bin/createrepo_c", repo_dir]) + + return True