From 35a2a575fd7332cbfcbfd131b58f3965a9e78e91 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Sun, 9 Sep 2018 17:18:20 +0300 Subject: Add: support for CI builds --- ick_helpers.py | 151 ++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 101 insertions(+), 50 deletions(-) diff --git a/ick_helpers.py b/ick_helpers.py index 76e8bbc..3345c5e 100644 --- a/ick_helpers.py +++ b/ick_helpers.py @@ -128,6 +128,11 @@ class Version: def __str__(self): return self._full_version + def upstream_append(self, morever): + assert '-' in self._full_version + parts = self._full_version.split('-') + self._full_version = '{}{}-1'.format(self.upstream, morever) + @property def full(self): return self._full_version @@ -145,57 +150,13 @@ class Version: return parts[1] -class DebianReleaseBuilder: +class DebianBuilderBase: - def __init__(self, ex, resultsdir, debfullname, debemail): + def __init__(self, ex, debfullname, debemail): self.ex = ex - self.results = resultsdir self.debfullname = debfullname self.debemail = debemail - def build(self, tag, distribution): - cwd = os.getcwd() - - self.checkout(tag) - - upstream_tarball = self.create_upstream_tarball(tag) - debug('upstream_tarball:', upstream_tarball) - self.stash(upstream_tarball) - - source = self.get_source_package() - version = self.get_version() - curdist = self.get_distribution() - debug('Source package:', source) - debug('Version:', version) - debug('Distribution:', curdist) - - orig_tarball = self.create_debian_orig_tarball( - upstream_tarball, source, version) - - if curdist != distribution: - self.set_distribution(version, distribution) - - self.create_dsc() - self.build_deb() - - debian_files = glob.glob('{}_{}*'.format(source, version.upstream)) - debian_files = [x for x in debian_files if '+git' not in x] - debug('DEBIAN:', debian_files) - self.stash(*debian_files) - - filenames = glob.glob('{}_{}*'.format(source, version.upstream)) - filenames.append(upstream_tarball) - self.cleanup(filenames) - - debug() - - def checkout(self, tag): - self.ex.run('git', 'reset', '--hard', check=False) - self.ex.run('git', 'clean', '-fdx', check=False) - self.ex.run('git', 'checkout', 'master', check=False) - self.ex.run('git', 'branch', '-d', '__ickbuild', check=False) - self.ex.run('git', 'checkout', '-b', '__ickbuild', tag) - def create_upstream_tarball(self, tag): basename = '{}.tar.xz'.format(tag) tarball = os.path.abspath(basename) @@ -205,19 +166,26 @@ class DebianReleaseBuilder: def create_debian_orig_tarball(self, upstream_tarball, source, version): tarball = '{}_{}.orig.tar.xz'.format(source, version.upstream) os.link(upstream_tarball, tarball) + debug('upstream_tarball:', tarball) return tarball def get_source_package(self): output = self.ex.get_stdout('dpkg-parsechangelog', '-S', 'Source') - return output.strip() + source = output.strip() + debug('Source package:', source) + return source def get_version(self): output = self.ex.get_stdout('dpkg-parsechangelog', '-S', 'Version') - return Version(output.strip()) + version = Version(output.strip()) + debug('Version:', version) + return version def get_distribution(self): output = self.ex.get_stdout('dpkg-parsechangelog', '-S', 'Distribution') - return output.strip() + curdist = output.strip() + debug('Distribution:', curdist) + return curdist def set_distribution(self, version, distribution): env = dict(os.environ) @@ -225,7 +193,7 @@ class DebianReleaseBuilder: env['DEBEMAIL'] = self.debemail newver = '{}.{}'.format(version.full, distribution) debug('newver:', newver) - msg = 'Build release for {} in CI.'.format(distribution) + msg = 'Build in ick.' self.ex.run( 'dch', '--no-conf', '-v', newver, '-D', distribution, '--force-distribution', msg, env=env) @@ -237,6 +205,47 @@ class DebianReleaseBuilder: def build_deb(self): self.ex.run('dpkg-buildpackage', '-b', '--no-sign') + +class DebianReleaseBuilder(DebianBuilderBase): + + def __init__(self, ex, resultsdir, debfullname, debemail): + super().__init__(ex, debfullname, debemail) + self.results = resultsdir + + def build(self, tag, distribution): + self.checkout(tag) + + upstream_tarball = self.create_upstream_tarball(tag) + self.stash(upstream_tarball) + + source = self.get_source_package() + version = self.get_version() + curdist = self.get_distribution() + + orig_tarball = self.create_debian_orig_tarball( + upstream_tarball, source, version) + + if curdist != distribution: + self.set_distribution(version, distribution) + + self.create_dsc() + self.build_deb() + + debian_files = glob.glob('{}_{}*'.format(source, version.upstream)) + debian_files = [x for x in debian_files if '+git' not in x] + self.stash(*debian_files) + + filenames = glob.glob('{}_{}*'.format(source, version.upstream)) + filenames.append(upstream_tarball) + self.cleanup(filenames) + + def checkout(self, tag): + self.ex.run('git', 'reset', '--hard', check=False) + self.ex.run('git', 'clean', '-fdx', check=False) + self.ex.run('git', 'checkout', 'master', check=False) + self.ex.run('git', 'branch', '-d', '__ickbuild', check=False) + self.ex.run('git', 'checkout', '-b', '__ickbuild', tag) + def stash(self, *filenames): if not os.path.exists(self.results): os.mkdir(self.results) @@ -251,6 +260,31 @@ class DebianReleaseBuilder: os.remove(filename) +class DebianCIBuilder: + + def __init__(self, ex, debfullname, debemail): + self.ex = ex + self.debfullname = debfullname + self.debemail = debemail + + def build(self, distribution): + upstream_tarball = self.create_upstream_tarball(tag) + + source = self.get_source_package() + version = self.get_version() + curdist = self.get_distribution() + + orig_tarball = self.create_debian_orig_tarball( + upstream_tarball, source, version) + + morever = '.0ci{}.{}'.format(os.environ['BUILD_NUMBER'], distribution) + version.upstream_append(morever) + self.set_distribution(version, distribution) + + self.create_dsc() + self.build_deb() + + class KnownTags: filename = '.known_tags' @@ -281,6 +315,7 @@ def find_upstream_dirs(sources): dirname = source['location'] control = os.path.join(dirname, 'debian', 'control') if os.path.exists(control): + debug('Found debian/control in', dirname) yield dirname @@ -307,3 +342,19 @@ def build_debian_releases(params, resultsdir): else: debug('Already built, not building', tag, 'for', distribution) known.remember(tag, distribution) + + +def ci_build_debian(params): + sources = params['sources'] + distribution = params['distribution_ci'] + debfullname = params['DEBFULLNAME'] + debemail = params['DEBEMAIL'] + dirnames = find_upstream_dirs(sources) + + for dirname in dirnames: + ex = Exec(dirname) + project = ex.get_project_name() + tags = ex.find_release_tags(project) + debug('release tags:', tags) + builder = DebianCIBuilder(ex, debfullname, debemail) + builder.build(distribution) -- cgit v1.2.1