# HG changeset patch # User Georges Racinet <georges.racinet@octobus.net> # Date 1668966294 -3600 # Sun Nov 20 18:44:54 2022 +0100 # Node ID be9d7ede98130fdffd5ecf68744b2553d331fb40 # Parent c9cebb04a5f7dc526697921e32af3f75426ae063 push-release: switch to object-oriented style We will have to init some constants after CLI parsing, it's cleaner to make attributes out of them. diff --git a/push-release b/push-release --- a/push-release +++ b/push-release @@ -12,6 +12,57 @@ BASE_IMAGE = 'octobus/heptapod' GITLAB_RAILS = '/opt/gitlab/embedded/service/gitlab-rails/' + +class Releaser: + + def __init__(self, simulate): + self.simulate = simulate + + def testing_img(self, stable_series): + return self.image_tag('testing', + stable_series=stable_series) + + def image_tag(self, label, stable_series=None): + if stable_series is not None: + label = '-'.join((stable_series, label)) + return ':'.join((self.docker_hub_base_image(), label)) + + def read_check_version(self, stable_series, validate_build_number=True): + """Read version files and check consistency.""" + img = self.testing_img(stable_series) + logger.info("Reading version metadata from image %r", img) + + cmd = ('docker', 'run', '-it', '--rm', img) + + archival = subprocess.check_output( + cmd + ('cat', GITLAB_RAILS + '.hg_archival.txt')).decode() + version = subprocess.check_output( + cmd + ('cat', GITLAB_RAILS + 'HEPTAPOD_VERSION')).decode().strip() + release = subprocess.check_output( + cmd + ('cat', '/RELEASE')).decode().splitlines() + version = version.replace(".rc", "rc") + assert any(re.match(r'^tag: heptapod-{}$'.format(version), line) + for line in archival.splitlines()) + assert release[0].rstrip() == "RELEASE_PACKAGE=heptapod" + release_version, build_number = release[1].rstrip().rsplit('-', 1) + assert release_version.replace('~', '') == "RELEASE_VERSION=" + version + if validate_build_number: + try: + int(build_number) + except TypeError: + raise InvalidBuildNumber(release[1]) + + return archival, version, build_number + + def push_tag(self, label, stable_series=None, tag_series=None): + img_tag = self.image_tag(label, stable_series=tag_series) + call(('docker', 'tag', + self.testing_img(stable_series), + img_tag), + simulate=self.simulate) + call(('docker', 'push', img_tag), simulate=self.simulate) + + parser = argparse.ArgumentParser( "Create Docker image tags from the current testing, after some " "verifications.") @@ -44,45 +95,6 @@ pass -def testing_img(stable_series): - return image_tag('testing', - stable_series=stable_series) - - -def image_tag(label, stable_series=None): - if stable_series is not None: - label = '-'.join((stable_series, label)) - return ':'.join((BASE_IMAGE, label)) - - -def read_check_version(stable_series, validate_build_number=True): - """Read version files and check consistency.""" - img = testing_img(stable_series) - logger.info("Reading version metadata from image %r", img) - - cmd = ('docker', 'run', '-it', '--rm', img) - - archival = subprocess.check_output( - cmd + ('cat', GITLAB_RAILS + '.hg_archival.txt')).decode() - version = subprocess.check_output( - cmd + ('cat', GITLAB_RAILS + 'HEPTAPOD_VERSION')).decode().strip() - release = subprocess.check_output( - cmd + ('cat', '/RELEASE')).decode().splitlines() - version = version.replace(".rc", "rc") - assert any(re.match(r'^tag: heptapod-{}$'.format(version), line) - for line in archival.splitlines()) - assert release[0].rstrip() == "RELEASE_PACKAGE=heptapod" - release_version, build_number = release[1].rstrip().rsplit('-', 1) - assert release_version.replace('~', '') == "RELEASE_VERSION=" + version - if validate_build_number: - try: - int(build_number) - except TypeError: - raise InvalidBuildNumber(release[1]) - - return archival, version, build_number - - def call(cmd, simulate=True): logger.info("Simulation mode, would run %r" if simulate else "Running %r", cmd) @@ -90,24 +102,15 @@ subprocess.check_call(cmd) -def push_tag(label, - stable_series=None, tag_series=None, - simulate=True): - img_tag = image_tag(label, - stable_series=tag_series) - call(('docker', 'tag', - testing_img(stable_series), - img_tag), - simulate=simulate) - call(('docker', 'push', img_tag), simulate=simulate) - - parsed_args = parser.parse_args() logging.basicConfig(level=getattr(logging, parsed_args.logging_level.upper())) stable_series = parsed_args.series +releaser = Releaser(simulate=parsed_args.simulate, + ) + try: - archival, version, build_nr = read_check_version( + archival, version, build_nr = releaser.read_check_version( stable_series=stable_series, validate_build_number=not parsed_args.arbitrary_build_number) except InvalidBuildNumber as exc: @@ -125,18 +128,13 @@ print("Not confirmed, bye") sys.exit(0) -simulate = parsed_args.simulate - -push_tag(version, - simulate=simulate, - stable_series=stable_series) -push_tag('latest', - simulate=simulate, - tag_series=stable_series, - stable_series=stable_series) +releaser.push_tag(version, + stable_series=stable_series) +releaser.push_tag('latest', + tag_series=stable_series, + stable_series=stable_series) if stable_series is None: future_stable_series = '-'.join(version.split('.', 2)[:2]) - push_tag('latest', - simulate=simulate, - tag_series=future_stable_series, - stable_series=stable_series) + releaser.push_tag('latest', + tag_series=future_stable_series, + stable_series=stable_series)