From 03e8e8413d9c89a5b8fb05e912992e578bec285d Mon Sep 17 00:00:00 2001 From: Pavel Raiskup Date: Jun 06 2019 07:31:27 +0000 Subject: [rpmbuild] clean /var/cache/mock automatically This is to prevent "no space left on device" on / partition. Since we recycle user-dedicated builder machines heavily, we need to clean directories like $ ls -1 /var/cache/mock BUILD_ID-fedora-rawhide-x86_64 BUILD_ID-fedora-rawhide-x86_64-bootstrap which contain yum/dnf caches there (soon to be enabled), and mock's root_cache. If we don't do this, after several (tens?) of builds on the same builder, the / partition might be wasted. This is especially important in Fedora Copr on aarch64 where we have small disks. --- diff --git a/rpmbuild/copr_rpmbuild/builders/mock.py b/rpmbuild/copr_rpmbuild/builders/mock.py index 30fa1a1..66f9658 100644 --- a/rpmbuild/copr_rpmbuild/builders/mock.py +++ b/rpmbuild/copr_rpmbuild/builders/mock.py @@ -9,6 +9,7 @@ from ..helpers import locate_spec, locate_srpm, CONF_DIRS, get_mock_uniqueext, G log = logging.getLogger("__main__") +MOCK_CALL = ['unbuffer', 'mock'] class MockBuilder(object): def __init__(self, task, sourcedir, resultdir, config): @@ -34,10 +35,13 @@ class MockBuilder(object): spec = locate_spec(self.sourcedir) shutil.copy(spec, self.resultdir) - self.produce_srpm(spec, self.sourcedir, configdir, self.resultdir) + try: + self.produce_srpm(spec, self.sourcedir, configdir, self.resultdir) - srpm = locate_srpm(self.resultdir) - self.produce_rpm(srpm, configdir, self.resultdir) + srpm = locate_srpm(self.resultdir) + self.produce_rpm(srpm, configdir, self.resultdir) + finally: + self.clean_cache(configdir) def prepare_configs(self, configdir): site_config_path = os.path.join(configdir, "site-defaults.cfg") @@ -65,8 +69,7 @@ class MockBuilder(object): repos=self.repos, pkg_manager_conf=self.pkg_manager_conf) def produce_srpm(self, spec, sources, configdir, resultdir): - cmd = [ - "unbuffer", "/usr/bin/mock", + cmd = MOCK_CALL + [ "--buildsrpm", "--spec", spec, "--sources", sources, @@ -94,9 +97,18 @@ class MockBuilder(object): if process.returncode != 0: raise RuntimeError("Build failed") + @classmethod + def clean_cache(cls, configdir): + """ Do best effort /var/mock/cache cleanup. """ + cmd = MOCK_CALL + [ + "--configdir", configdir, + "-r", "child", + "--scrub", "cache", + ] + subprocess.call(cmd) # ignore failure here, if any def produce_rpm(self, srpm, configdir, resultdir): - cmd = ["unbuffer", "/usr/bin/mock", + cmd = MOCK_CALL + [ "--rebuild", srpm, "--configdir", configdir, "--resultdir", resultdir, diff --git a/rpmbuild/tests/test_mock.py b/rpmbuild/tests/test_mock.py index c5b3607..473c67e 100644 --- a/rpmbuild/tests/test_mock.py +++ b/rpmbuild/tests/test_mock.py @@ -87,7 +87,7 @@ class TestMockBuilder(unittest.TestCase): process = mock.MagicMock(returncode=0) popen_mock.return_value = process builder.produce_rpm("/path/to/pkg.src.rpm", "/path/to/configs", "/path/to/results") - assert_cmd = ['unbuffer', '/usr/bin/mock', + assert_cmd = ['unbuffer', 'mock', '--rebuild', '/path/to/pkg.src.rpm', '--configdir', '/path/to/configs', '--resultdir', '/path/to/results',