예제 #1
0
 def wait_for_task(cls, build_dict, task_id, results_dir):
     session = KojiHelper.create_session()
     task_dict = KojiHelper.watch_koji_tasks(session, [task_id])
     rpms, logs = KojiHelper.download_task_results(session, list(task_dict),
                                                   results_dir)
     exit_code = cls._verify_tasks(session, task_dict)
     if exit_code:
         raise BinaryPackageBuildError(exit_code=exit_code)
     return rpms, logs
예제 #2
0
 def get_detached_task(cls, task_id, results_dir):
     session = KojiHelper.create_session()
     rpms, logs = KojiHelper.download_task_results(session, [task_id],
                                                   results_dir)
     task = session.getTaskInfo(task_id)
     exit_code = cls._verify_tasks(session, {task_id: task['state']})
     if exit_code:
         raise BinaryPackageBuildError(exit_code=exit_code)
     if not rpms:
         raise RebaseHelperError(
             'Koji tasks are not finished yet. Try again later.')
     return rpms, logs
예제 #3
0
 def _scratch_build(cls, srpm, **kwargs):
     session = KojiHelper.create_session()
     remote = KojiHelper.upload_srpm(session, srpm)
     task_id = session.build(remote, cls.target_tag, dict(scratch=True))
     if kwargs['builds_nowait']:
         return None, None, task_id
     url = KojiHelper.get_task_url(session, task_id)
     logger.info('Koji task is here: %s\n', url)
     session.logout()
     task_dict = KojiHelper.watch_koji_tasks(session, [task_id])
     path = os.path.dirname(srpm).replace('SRPM', 'RPM')
     rpms, logs = KojiHelper.download_task_results(session, list(task_dict),
                                                   path)
     exit_code = cls._verify_tasks(session, task_dict)
     if exit_code:
         raise BinaryPackageBuildError(exit_code=exit_code)
     return rpms, logs, task_id
예제 #4
0
 def get_task_info(cls, build_dict):
     session = KojiHelper.create_session()
     url = KojiHelper.get_task_url(session, build_dict['koji_task_id'])
     return 'Scratch build for {} version is: {}'.format(
         build_dict['version'], url)
예제 #5
0
    def build_binary_packages(self):
        """Function calls build class for building packages"""
        try:
            builder = Builder(self.conf.buildtool)
        except NotImplementedError as e:
            raise RebaseHelperError('{}. Supported build tools are {}'.format(
                six.text_type(e), Builder.get_supported_tools()))

        for version in ['old', 'new']:
            successful_builds = 0
            try_build_again = False
            while successful_builds < 1:
                results_dir = '{}-build'.format(os.path.join(self.results_dir, version))
                spec = None
                task_id = None
                koji_build_id = None
                build_dict = {}

                if self.conf.build_tasks is None:
                    spec = self.spec_file if version == 'old' else self.rebase_spec_file
                    package_name = spec.get_package_name()
                    package_version = spec.get_version()
                    package_full_version = spec.get_full_version()

                    if version == 'old' and self.conf.get_old_build_from_koji:
                        if KojiHelper.functional:
                            session = KojiHelper.create_session()
                            koji_version, koji_build_id = KojiHelper.get_latest_build(session, package_name)
                            if koji_version:
                                if koji_version != package_version:
                                    logger.warning('Version of the latest Koji build (%s) with id (%s) '
                                                   'differs from version in SPEC file (%s)!',
                                                   koji_version, koji_build_id, package_version)
                                package_version = package_full_version = koji_version
                            else:
                                logger.warning('Unable to find the latest Koji build!')
                        else:
                            logger.warning('Unable to get the latest Koji build!')

                    build_dict = dict(
                        name=package_name,
                        version=package_version,
                        builds_nowait=self.conf.builds_nowait,
                        build_tasks=self.conf.build_tasks,
                        builder_options=self.conf.builder_options,
                        srpm=results_store.get_build(version).get('srpm'),
                        srpm_logs=results_store.get_build(version).get('logs'))

                    # prepare for building
                    builder.prepare(spec, self.conf)

                    logger.info('Building binary packages for %s version %s', package_name, package_full_version)
                else:
                    task_id = self.conf.build_tasks[0] if version == 'old' else self.conf.build_tasks[1]

                try:
                    if self.conf.build_tasks is None:
                        if koji_build_id:
                            session = KojiHelper.create_session()
                            build_dict['rpm'], build_dict['logs'] = KojiHelper.download_build(session,
                                                                                              koji_build_id,
                                                                                              results_dir)
                        else:
                            build_dict.update(builder.build(spec, results_dir, **build_dict))
                    if builder.creates_tasks() and task_id and not koji_build_id:
                        if not self.conf.builds_nowait:
                            build_dict['rpm'], build_dict['logs'] = builder.wait_for_task(build_dict,
                                                                                          task_id,
                                                                                          results_dir)
                        elif self.conf.build_tasks:
                            build_dict['rpm'], build_dict['logs'] = builder.get_detached_task(task_id, results_dir)
                    build_dict = self._sanitize_build_dict(build_dict)
                    results_store.set_build_data(version, build_dict)
                    successful_builds += 1
                except RebaseHelperError:
                    # Proper RebaseHelperError instance was created already. Re-raise it.
                    raise
                except BinaryPackageBuildError as e:
                    build_dict.update(builder.get_logs())
                    build_dict['binary_package_build_error'] = six.text_type(e)
                    build_dict = self._sanitize_build_dict(build_dict)
                    results_store.set_build_data(version, build_dict)

                    if e.logfile is None:
                        msg = 'Building {} RPM packages failed; see logs in {} for more information'.format(
                            version, os.path.join(results_dir, 'RPM')
                        )
                    else:
                        msg = 'Building {} RPM packages failed; see {} for more information'.format(version, e.logfile)

                    logger.info(msg)
                    if self.rebase_spec_file:
                        # Save current rebase spec file content
                        self.rebase_spec_file.save()
                    if not self.conf.non_interactive and \
                            ConsoleHelper.get_message('Do you want to try it one more time'):
                        try_build_again = True
                    else:
                        raise RebaseHelperError(msg, logfiles=builder.get_logs().get('logs'))
                except Exception:
                    raise RebaseHelperError('Building package failed with unknown reason. '
                                            'Check all available log files.')

                if try_build_again:
                    successful_builds = 0
                    try_build_again = False

                    logger.info('Now it is time to make changes to  %s if necessary.', self.rebase_spec_file.path)
                    if not ConsoleHelper.get_message('Do you want to continue with the rebuild now'):
                        raise KeyboardInterrupt
                    # Update rebase spec file content after potential manual modifications
                    self.rebase_spec_file._read_spec_content()  # pylint: disable=protected-access
                    self.rebase_spec_file._update_data()  # pylint: disable=protected-access
                    # clear current version output directories
                    if os.path.exists(os.path.join(results_dir, 'RPM')):
                        shutil.rmtree(os.path.join(results_dir, 'RPM'))

        if self.conf.builds_nowait and not self.conf.build_tasks:
            if builder.creates_tasks():
                self.print_task_info(builder)