Merge branch 'debug_flag' into 'master'

[build] Replace unused --reset-server with --debug

See merge request fdroid/fdroidserver!1038
This commit is contained in:
Jochen Sprickerhof 2024-04-12 13:55:57 +00:00
commit 30b607752f
3 changed files with 93 additions and 15 deletions

View File

@ -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

View File

@ -240,6 +240,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
@ -304,8 +306,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:
@ -394,15 +400,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))
@ -858,8 +865,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,
@ -933,8 +940,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):

View File

@ -471,6 +471,77 @@ class BuildTest(unittest.TestCase):
self.assertTrue(ndk_dir.exists())
self.assertTrue(os.path.exists(config['ndk_paths'][ndk_version]))
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"""
os.chdir(self.testdir)