# HG changeset patch # User Georges Racinet <georges.racinet@octobus.net> # Date 1615187743 -3600 # Mon Mar 08 08:15:43 2021 +0100 # Node ID 0b260d291f77da57f87f77e85cb49392651ca727 # Parent 74f4f366680e7ec6f654fefa329cf761e3aaa8d0 push-release: added consistency check on /RELEASE file could be really weird if something got wrong in Omnibus package version logic. Also an opportunity to display the build number for human operator alert if it's unexpected diff --git a/push-release b/push-release --- a/push-release +++ b/push-release @@ -22,6 +22,10 @@ parser.add_argument('--stable-series', help="Example: 0-14") +class InvalidBuildNumber(RuntimeError): + pass + + def testing_img(stable_series, py_version): return image_tag('testing', py_version=py_version, stable_series=stable_series) @@ -36,8 +40,9 @@ return '%s-py%d' % (default, py_version) -def read_version(stable_series, py_version): - img = testing_img(stable_series, py_version=py_version) +def read_check_version(stable_series): + """Read version files and check consistency.""" + img = testing_img(stable_series, py_version=None) logger.info("Reading version metadata from image %r", img) cmd = ('docker', 'run', '-it', '--rm', img) @@ -46,10 +51,20 @@ 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()) - return archival, version + assert release[0].rstrip() == "RELEASE_PACKAGE=heptapod" + release_version, build_number = release[1].rstrip().rsplit('-', 1) + assert release_version == "RELEASE_VERSION=" + version + try: + build_number = int(build_number) + except TypeError: + raise InvalidBuildNumber(release[1]) + + return archival, version, build_number def call(cmd, simulate=True): @@ -75,8 +90,16 @@ logging.basicConfig(level=getattr(logging, parsed_args.logging_level.upper())) stable_series = parsed_args.stable_series -archival, version = read_version(stable_series=stable_series, py_version=None) -logger.info("Detected version %r in testing image", version) +try: + archival, version, build_nr = read_check_version( + stable_series=stable_series) +except InvalidBuildNumber as exc: + logger.error("Invalid build number in /RELEASE file: %r. " + "Bailing", **exc.args) + sys.exit(1) + +logger.info("Detected version %r (Omnibus build %r) in testing image", + version, build_nr) if not parsed_args.simulate and not parsed_args.no_confirmation: print("Are you sure you want to tag and push version %r?" % version)