From 729478ee7cb4ff97b4c282f08668416148e64f13 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 25 Oct 2021 19:16:17 +0200 Subject: [PATCH] build: replace unused --reset-server with --debug --- completion/bash-completion | 2 +- fdroidserver/build.py | 35 +++++++++++-------- tests/build.TestCase | 71 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 93 insertions(+), 15 deletions(-) diff --git a/completion/bash-completion b/completion/bash-completion index dd32b30f..9c8a770c 100644 --- a/completion/bash-completion +++ b/completion/bash-completion @@ -83,7 +83,7 @@ __complete_options() { __complete_build() { opts="-v -q -l -s -t -f -a" - lopts="--verbose --quiet --latest --stop --test --server --reset-server --skip-scan --scan-binary --no-tarball --force --all --no-refresh" + lopts="--verbose --quiet --latest --stop --test --server --debug --skip-scan --scan-binary --no-tarball --force --all --no-refresh" case "${prev}" in :) __vercode diff --git a/fdroidserver/build.py b/fdroidserver/build.py index cc291eac..28ac036f 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -238,6 +238,8 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): cmdline += ' --no-tarball' if (options.scan_binary or config.get('scan_binary')) and not options.skipscan: cmdline += ' --scan-binary' + if options.debug: + cmdline += ' --debug' cmdline += " %s:%s" % (app.id, build.versionCode) ssh_channel.exec_command('bash --login -c "' + cmdline + '"') # nosec B601 inputs are sanitized @@ -302,8 +304,12 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): finally: # Suspend the build server. vm = vmtools.get_build_vm('builder') - logging.info('destroying buildserver after build') - vm.destroy() + if options.debug: + vm.suspend() + logging.warning('buildserver suspended') + else: + logging.info('destroying buildserver after build') + vm.destroy() # deploy logfile to repository web server if output: @@ -392,15 +398,16 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext raise BuildException("Error running sudo command for %s:%s" % (app.id, build.versionName), p.output) - p = FDroidPopen(['sudo', 'passwd', '--lock', 'root']) - if p.returncode != 0: - raise BuildException("Error locking root account for %s:%s" % - (app.id, build.versionName), p.output) + if not options.debug: + p = FDroidPopen(['sudo', 'passwd', '--lock', 'root']) + if p.returncode != 0: + raise BuildException("Error locking root account for %s:%s" % + (app.id, build.versionName), p.output) - p = FDroidPopen(['sudo', 'SUDO_FORCE_REMOVE=yes', 'dpkg', '--purge', 'sudo']) - if p.returncode != 0: - raise BuildException("Error removing sudo for %s:%s" % - (app.id, build.versionName), p.output) + p = FDroidPopen(['sudo', 'SUDO_FORCE_REMOVE=yes', 'dpkg', '--purge', 'sudo']) + if p.returncode != 0: + raise BuildException("Error removing sudo for %s:%s" % + (app.id, build.versionName), p.output) log_path = os.path.join(log_dir, common.get_toolsversion_logname(app, build)) @@ -918,8 +925,8 @@ def parse_commandline(): help=_("Test mode - put output in the tmp directory only, and always build, even if the output already exists.")) parser.add_argument("--server", action="store_true", default=False, help=_("Use build server")) - parser.add_argument("--reset-server", action="store_true", default=False, - help=_("Reset and create a brand new build server, even if the existing one appears to be ok.")) + parser.add_argument("--debug", action="store_true", default=False, + help=_("Don't remove sudo and keep VM running after build (useful for debugging).")) # this option is internal API for telling fdroid that # it's running inside a buildserver vm. parser.add_argument("--on-server", dest="onserver", action="store_true", default=False, @@ -990,8 +997,8 @@ def main(): if config['build_server_always']: options.server = True - if options.reset_server and not options.server: - parser.error("option %s: Using --reset-server without --server makes no sense" % "reset-server") + if options.debug and not (options.server or options.onserver): + parser.error("option %s: Using --debug only works with --server" % "debug") log_dir = 'logs' if not os.path.isdir(log_dir): diff --git a/tests/build.TestCase b/tests/build.TestCase index 0bfee1be..7c17b003 100755 --- a/tests/build.TestCase +++ b/tests/build.TestCase @@ -303,6 +303,77 @@ class BuildTest(unittest.TestCase): ) self.assertTrue(os.path.exists(config['ndk_paths']['r21e'])) + def test_build_local_sudo(self): + """Test if `fdroid build --on-server` removes sudo""" + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + os.chdir(testdir) + + config = {'ndk_paths': {}, 'sdk_path': tempfile.mkdtemp(prefix='android-sdk-')} + fdroidserver.common.config = config + fdroidserver.build.config = config + fdroidserver.build.options = mock.Mock() + fdroidserver.build.options.scan_binary = False + fdroidserver.build.options.notarball = True + fdroidserver.build.options.skipscan = True + fdroidserver.build.options.debug = False + + app = fdroidserver.metadata.App() + app.id = 'mocked.app.id' + build = fdroidserver.metadata.Build() + build.commit = '1.0' + build.output = app.id + '.apk' + build.versionCode = 1 + build.versionName = '1.0' + vcs = mock.Mock() + + def make_fake_apk(output, build): + with open(build.output, 'w') as fp: + fp.write('APK PLACEHOLDER') + return output + + fdroidopen = mock.Mock() + + fdroidopen.return_value = FakeProcess + + # use "as _ignored" just to make a pretty layout + with mock.patch( + 'fdroidserver.common.replace_build_vars', wraps=make_fake_apk + ) as _ignored, mock.patch( + 'fdroidserver.common.get_native_code', return_value='x86' + ) as _ignored, mock.patch( + 'fdroidserver.common.get_apk_id', + return_value=(app.id, build.versionCode, build.versionName), + ) as _ignored, mock.patch( + 'fdroidserver.common.is_apk_and_debuggable', return_value=False + ) as _ignored, mock.patch( + 'fdroidserver.common.sha256sum', + return_value='ad7ce5467e18d40050dc51b8e7affc3e635c85bd8c59be62de32352328ed467e', + ) as _ignored, mock.patch( + 'fdroidserver.common.is_apk_and_debuggable', return_value=False + ) as _ignored, mock.patch( + 'fdroidserver.build.FDroidPopen', fdroidopen + ) as fdroidopen: + _ignored # silence the linters + fdroidserver.build.build_local( + app, + build, + vcs, + build_dir=testdir, + output_dir=testdir, + log_dir=os.getcwd(), + srclib_dir=None, + extlib_dir=None, + tmp_dir=None, + force=False, + onserver=True, + refresh=False, + ) + fdroidopen.assert_called_with( + ['sudo', 'SUDO_FORCE_REMOVE=yes', 'dpkg', '--purge', 'sudo'] + ) + def test_build_local_clean(self): """Test if `fdroid build` cleans ant and gradle build products""" testdir = tempfile.mkdtemp(