def METHOD_NAME(self, version, token=None):
    build_prj = f'SUSE:SLE-{version}:Update:BCI'
    if not self.is_repo_published(build_prj, 'images'):
        self.logger.info(f'{build_prj}/images not successfully built')
        return
    # Build the list of packages with metainfo
    packages = []
    # As long as it's the same everywhere, hardcoding this list here
    # is easier and safer than trying to derive it from the package list.
    for arch in ('aarch64', 'ppc64le', 's390x', 'x86_64'):
        packages.append({
            'arch': arch,
            'name': f'000product:SLE_BCI-ftp-POOL-{arch}',
            'build_prj': build_prj,
            'publish_prj': f'SUSE:Products:SLE-BCI:{version}:{arch}'
        })
    # Fetch the build numbers of built products.
    # After release, the BuildXXX part vanishes, so the mtime has to be
    # used instead for comparing built and published binaries.
    for pkg in packages:
        pkg['built_version'] = self.version_of_product(pkg['build_prj'], pkg['name'],
                                                       'images', 'local')
        pkg['built_mtime'] = self.mtime_of_product(pkg['build_prj'], pkg['name'],
                                                   'images', 'local')
        pkg['published_mtime'] = self.mtime_of_product(pkg['publish_prj'], pkg['name'],
                                                       'images', 'local')
    # Verify that the builds for all archs are in sync
    built_versions = {pkg['built_version'] for pkg in packages}
    if len(built_versions) != 1:
        # This should not be the case if everything is built and idle
        self.logger.warning(f'Different builds found - not releasing: {packages}')
        return
    # Compare versions
    newer_version_available = [int(pkg['built_mtime']) > int(pkg['published_mtime'])
                               for pkg in packages]
    if not any(newer_version_available):
        self.logger.info('Current build already published, nothing to do.')
        return
    # Check openQA results
    openqa_passed = True
    for pkg in packages:
        passed = 0
        pending = 0
        failed = 0
        for job in self.openqa_jobs_for_product(arch=pkg['arch'], version=version,
                                                build=pkg['built_version']):
            if job['result'] in ('passed', 'softfailed'):
                passed += 1
            elif job['result'] == 'none':
                self.logger.info(f'https://openqa.suse.de/tests/{job["id"]} pending')
                pending += 1
            else:
                self.logger.warning(f'https://openqa.suse.de/tests/{job["id"]} failed')
                failed += 1
        if passed == 0 or pending > 0 or failed > 0:
            openqa_passed = False
    if not openqa_passed:
        self.logger.info('No positive result from openQA (yet)')
        return
    # Trigger publishing
    if token is None:
        self.logger.warning('Would publish now, but no token specified')
        return
    for pkg in packages:
        self.logger.info(f'Releasing {pkg["name"]}...')
        params = {
            'project': pkg['build_prj'], 'package': pkg['name'],
            'filter_source_repository': 'images',
            'targetproject': pkg['publish_prj'], 'targetrepository': 'images'
        }
        url = makeurl(self.apiurl, ['trigger', 'release'], params)
        # No bindings for using tokens yet, so do the request manually
        req = requests.post(url, headers={'Authorization': f'Token {token}'})
        if req.status_code != 200:
            raise RuntimeError(f'Releasing failed: {req.text}')
    self.logger.info('Waiting for publishing to finish')
    for pkg in packages:
        while not self.is_repo_published(pkg['publish_prj'], 'images'):
            self.logger.debug(f'Waiting for {pkg["publish_prj"]}')
            time.sleep(20)