diff --git a/rpmbuild/copr-rpmbuild.spec b/rpmbuild/copr-rpmbuild.spec index 605e90da9..cca3e05fa 100644 --- a/rpmbuild/copr-rpmbuild.spec +++ b/rpmbuild/copr-rpmbuild.spec @@ -40,6 +40,7 @@ BuildRequires: %{python}-requests BuildRequires: %{python_pfx}-jinja2 BuildRequires: %{python_pfx}-specfile >= 0.21.0 BuildRequires: python3-backoff >= 1.9.0 +BuildRequires: python3-pyyaml BuildRequires: /usr/bin/argparse-manpage BuildRequires: python-rpm-macros @@ -57,6 +58,7 @@ Requires: %{python_pfx}-munch Requires: %{python}-requests Requires: %{python_pfx}-specfile >= 0.21.0 Requires: python3-backoff >= 1.9.0 +Requires: python3-pyyaml Requires: mock >= 5.0 Requires: git diff --git a/rpmbuild/copr_rpmbuild/builders/mock.py b/rpmbuild/copr_rpmbuild/builders/mock.py index b3cc31461..2adf031e8 100644 --- a/rpmbuild/copr_rpmbuild/builders/mock.py +++ b/rpmbuild/copr_rpmbuild/builders/mock.py @@ -12,6 +12,7 @@ get_mock_uniqueext, GentlyTimeoutedPopen, macros_for_task, + mock_snippets_for_tags, ) log = logging.getLogger("__main__") @@ -19,7 +20,7 @@ MOCK_CALL = ['unbuffer', 'mock'] class MockBuilder(object): - def __init__(self, task, sourcedir, resultdir, config): + def __init__(self, task, sourcedir, resultdir, config, rpmbuild_config): self.task_id = task.get("task_id") self.build_id = re.sub("-.*", "", self.task_id) self.chroot = task.get("chroot") @@ -42,6 +43,9 @@ def __init__(self, task, sourcedir, resultdir, config): self.macros = macros_for_task(task, config) self.uniqueext = get_mock_uniqueext() self.allow_user_ssh = task.get("allow_user_ssh") + self.tags = task.get("tags", []) + + self.rpmbuild_config = rpmbuild_config def run(self): open(self.logfile, 'w').close() # truncate logfile @@ -82,6 +86,9 @@ def render_config_template(self): copr_build_id=self.build_id, isolation=self.isolation, macros=self.macros, + mock_snippets=mock_snippets_for_tags( + self.rpmbuild_config.job_tag_to_mock_snippets, self.tags + ) or None, ) def produce_srpm(self, spec, sources, resultdir): diff --git a/rpmbuild/copr_rpmbuild/config.py b/rpmbuild/copr_rpmbuild/config.py new file mode 100644 index 000000000..95adbea00 --- /dev/null +++ b/rpmbuild/copr_rpmbuild/config.py @@ -0,0 +1,17 @@ +import os +import yaml + +CONFIG_PATH = "/etc/copr-rpmbuild/copr-rpmbuild.yaml", + +class Config: + def __init__(self): + self.job_tag_to_mock_snippets = [] + + def load_config(self): + if not os.path.exists(CONFIG_PATH): + return + + with open(CONFIG_PATH, "r") as file: + config_data = yaml.safe_load(file) or {} + + self.job_tag_to_mock_snippets = config_data.get('job_tag_to_mock_snippets', []) diff --git a/rpmbuild/copr_rpmbuild/helpers.py b/rpmbuild/copr_rpmbuild/helpers.py index f18cba23f..a7e62cbcf 100644 --- a/rpmbuild/copr_rpmbuild/helpers.py +++ b/rpmbuild/copr_rpmbuild/helpers.py @@ -469,3 +469,15 @@ def package_version(name): return pkg_resources.require(name)[0].version except pkg_resources.DistributionNotFound: return "git" + + +def mock_snippets_for_tags(job_tag_to_mock_snippets, tags): + """ + Return a list of mock snippets for a given list of tags + """ + mock_snippets = [] + for tag in tags: + snippet = job_tag_to_mock_snippets.get(tag) + if snippet: + mock_snippets.append(snippet) + return mock_snippets diff --git a/rpmbuild/copr_rpmbuild/providers/base.py b/rpmbuild/copr_rpmbuild/providers/base.py index 8250e4036..b24c87ff0 100644 --- a/rpmbuild/copr_rpmbuild/providers/base.py +++ b/rpmbuild/copr_rpmbuild/providers/base.py @@ -8,7 +8,7 @@ from copr_common.request import SafeRequest from copr_rpmbuild.helpers import CONF_DIRS -from copr_rpmbuild.helpers import run_cmd +from copr_rpmbuild.helpers import run_cmd, mock_snippets_for_tags log = logging.getLogger("__main__") @@ -18,7 +18,7 @@ class Provider(object): # pylint: disable=too-many-instance-attributes _safe_resultdir = None - def __init__(self, source_dict, config, macros=None, task=None): + def __init__(self, source_dict, config, rpmbuild_config, macros=None, task=None): self.source_dict = source_dict self.config = config self.request = SafeRequest(log=log) @@ -51,6 +51,15 @@ def __init__(self, source_dict, config, macros=None, task=None): if e.errno != errno.EEXIST: raise + self.rpmbuild_config = rpmbuild_config + + # Mock snippets to render in the mock config + self.mock_snippets = None + if self.task is not None: + self.mock_snippets = mock_snippets_for_tags( + self.rpmbuild_config.job_tag_to_mock_snippets, self.task.get("tags") + ) or None, + # Change home directory to workdir and create .rpmmacros there os.environ["HOME"] = self.workdir self.create_rpmmacros() @@ -130,7 +139,7 @@ def render_mock_config_template(self, template_name): """ jinja_env = Environment(loader=FileSystemLoader(CONF_DIRS)) template = jinja_env.get_template(template_name) - return template.render(macros=self.macros) + return template.render(macros=self.macros, mock_snippets=self.mock_snippets) def produce_srpm(self): """ diff --git a/rpmbuild/copr_rpmbuild/providers/custom.py b/rpmbuild/copr_rpmbuild/providers/custom.py index ce5469a62..e7335781b 100644 --- a/rpmbuild/copr_rpmbuild/providers/custom.py +++ b/rpmbuild/copr_rpmbuild/providers/custom.py @@ -51,6 +51,7 @@ def render_mock_config_template(self, *_args): chroot=self.chroot, repos=self.repos, macros=self.macros, + mock_snippets=self.mock_snippets, ) def produce_srpm(self): diff --git a/rpmbuild/mock-custom-build.cfg.j2 b/rpmbuild/mock-custom-build.cfg.j2 index c71e85609..15a8d998a 100644 --- a/rpmbuild/mock-custom-build.cfg.j2 +++ b/rpmbuild/mock-custom-build.cfg.j2 @@ -16,6 +16,12 @@ config_opts["root"] = "copr-custom-" + config_opts["root"] # /bin/mock calls (when tmpfs_enable is on). config_opts['plugin_conf']['tmpfs_opts']['keep_mounted'] = True +{%- if mock_snippets %} +{% for snippet in mock_snippets %} +{{ snippet }} +{% endfor %} +{% endif %} + {%- for key, value in macros.items() %} config_opts['macros']['{{ key }}'] = '{{ value }}' {%- endfor %} diff --git a/rpmbuild/mock.cfg.j2 b/rpmbuild/mock.cfg.j2 index 25f3bbf19..3043b482b 100644 --- a/rpmbuild/mock.cfg.j2 +++ b/rpmbuild/mock.cfg.j2 @@ -4,6 +4,12 @@ config_opts.setdefault('plugin_conf', {}) config_opts['plugin_conf'].setdefault('tmpfs_opts', {}) config_opts['plugin_conf']['tmpfs_opts']['keep_mounted'] = True +{%- if mock_snippets %} +{% for snippet in mock_snippets %} +{{ snippet }} +{% endfor %} +{% endif %} + {% if buildroot_pkgs %} config_opts['chroot_additional_packages'] = '{{ buildroot_pkgs| join(" ") }}' {% endif %}