Added fpm_options parameter for building package

Some parameters can be added into package informations.

Change-Id: I625339b6fdc44340fcb41842b5527263a8afd2b4
This commit is contained in:
Daniel Pawlik 2018-06-21 19:46:15 +00:00
parent 1476f6c3aa
commit 816cd79ba7
6 changed files with 59 additions and 7 deletions

View File

@ -11,3 +11,8 @@ settings:
projects:
- name: glance
gitref: stable/mitaka
fpm_options:
# Additional FPM options: https://github.com/jordansissel/fpm/wiki#usage
- '--architecture all'
- '--provides some-package'
- '--replaces second-package'

View File

@ -23,7 +23,7 @@ from giftwrap.settings import Settings
class BuildSpec(object):
def __init__(self, manifest, version, build_type=None, parallel=True,
limit_projects=None):
limit_projects=None, fpm_options=None):
self._manifest = yaml.load(manifest)
self.version = version
self.build_type = build_type
@ -34,6 +34,7 @@ class BuildSpec(object):
manifest_settings['build_type'] = build_type
if build_type == 'docker':
parallel = False
self.fpm_options = fpm_options
manifest_settings['parallel_build'] = parallel
self.settings = Settings.factory(manifest_settings)
self.projects = self._render_projects(limit_projects)

View File

@ -103,7 +103,8 @@ class PackageBuilder(Builder):
pkg = Package(project.package_name, project.version,
project.install_path, self._spec.settings.output_dir,
self._spec.settings.force_overwrite,
project.system_dependencies)
project.system_dependencies,
project._fpm_options)
pkg.build()
def _finalize_build(self):

View File

@ -39,7 +39,7 @@ class OpenstackProject(object):
gitdepth=None, venv_command=None, install_command=None,
install_path=None, package_name=None, stackforge=False,
system_dependencies=[], pip_dependencies=[],
postinstall_dependencies=[]):
postinstall_dependencies=[], fpm_options=None):
self._settings = settings
self.name = name
self._version = version
@ -55,6 +55,7 @@ class OpenstackProject(object):
self.system_dependencies = system_dependencies
self.pip_dependencies = pip_dependencies
self.postinstall_dependencies = postinstall_dependencies
self._fpm_options = fpm_options
@property
def version(self):

View File

@ -29,13 +29,14 @@ SUPPORTED_DISTROS = {
class Package(object):
def __init__(self, name, version, install_path, output_dir,
overwrite=False, dependencies=None):
overwrite=False, dependencies=None, fpm_options=None):
self.name = name
self.version = version
self.install_path = install_path
self.output_dir = output_dir
self.overwrite = overwrite
self.dependencies = dependencies
self.fpm_options = fpm_options
def _get_platform_target(self):
current_distro = platform.linux_distribution()[0]
@ -46,6 +47,11 @@ class Package(object):
raise Exception("Sorry, '%s' is an unsupported distribution" %
current_distro)
def _add_commands(self, command_type):
# You can have defined multiple projects in yaml, iterate on projects
# and add to the command strings declared in yaml e.g.: copy_file
return ' '.join(map(str, command_type))
def build(self):
target = self._get_platform_target()
overwrite = ''
@ -60,6 +66,21 @@ class Package(object):
os.makedirs(self.output_dir)
# not wrapping in a try block - handled by caller
execute("fpm %s -s dir -t %s -n %s -v %s %s %s" % (overwrite,
target, self.name, self.version, deps, self.install_path),
self.output_dir)
execute_command = "fpm %s -s dir -t %s -n %s -v %s " % (overwrite,
target,
self.name,
self.version)
if self.fpm_options:
# Adding fpm options e.g.: like architecture, description, etc.
# More actions have been described:
# https://github.com/jordansissel/fpm/wiki#usage
execute_command += self._add_commands(self.fpm_options)
execute_command = ("%s %s %s" % (execute_command, deps,
self.install_path))
execute(execute_command, self.output_dir)
else:
# Execute standard command
execute_command = "%s %s %s" % (execute_command, deps,
self.install_path)
execute(execute_command, self.output_dir)

View File

@ -59,3 +59,26 @@ class TestBuildSpec(unittest.TestCase):
self.assertEqual(2, len(bs.projects))
for project in bs.projects:
self.assertEqual('99', project.version)
def test_build_spec_projects_with_fpm_options(self):
fpm_options = ['--architecture all', '--replaces some-package',
'--provides funny-package',
'--depends very-funny-package']
manifest = {
'settings': {},
'projects': [
{
'name': 'project1',
'fpm_options': fpm_options,
},
],
}
with tempfile.TemporaryFile(mode='w+') as tf:
version = '0'
yaml.safe_dump(manifest, tf)
tf.flush()
tf.seek(0)
bs = build_spec.BuildSpec(tf, version)
self.assertEqual(1, len(bs.projects))
for project in bs.projects:
self.assertEqual(fpm_options, project._fpm_options)