示例#1
0
    def _build_rpm(cls,
                   srpm,
                   results_dir,
                   rpm_results_dir,
                   root=None,
                   arch=None,
                   builder_options=None):
        """Builds RPMs using mock.

        Args:
            srpm: Path to SRPM.
            results_dir: Path to directory where logs will be placed.
            rpm_results_dir: Path to directory where rpms will be placed.
            root: Path to where chroot will be built
            arch: Target architectures for the build.
            builder_options: Additional options for mock.

        Returns:
            Tuple where first element is list of paths to built RPMs and
            the second element is list of paths to logs.

        """
        logger.info("Building RPMs")
        output = os.path.join(results_dir, "mock_output.log")

        cmd = [
            cls.CMD, '--old-chroot', '--rebuild', srpm, '--resultdir',
            results_dir
        ]
        if root is not None:
            cmd.extend(['--root', root])
        if arch is not None:
            cmd.extend(['--arch', arch])
        if builder_options is not None:
            cmd.extend(builder_options)

        if not check_mock_privileges():
            cmd = ['pkexec'] + cmd

        ret = ProcessHelper.run_subprocess(cmd, output_file=output)
        logs = []
        for log in PathHelper.find_all_files(results_dir, '*.log'):
            logs.append(os.path.join(rpm_results_dir, os.path.basename(log)))

        if ret == 0:
            return [
                f for f in PathHelper.find_all_files(results_dir, '*.rpm')
                if not f.endswith('.src.rpm')
            ], logs
        else:
            logfile = get_mock_logfile_path(ret,
                                            rpm_results_dir,
                                            tmp_path=results_dir)
        raise BinaryPackageBuildError("Building RPMs failed!",
                                      rpm_results_dir,
                                      logfile=logfile,
                                      logs=logs)
示例#2
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(logs=logs,
                                       logfile=get_mock_logfile_path(
                                           exit_code, results_dir))
     return rpms, logs
示例#3
0
 def wait_for_task(cls, build_dict, task_id, results_dir):
     client = CoprHelper.get_client()
     build_id = int(task_id)
     failed = not CoprHelper.watch_build(client, build_id)
     rpms, logs = CoprHelper.download_build(client, build_id, results_dir)
     build_url = CoprHelper.get_build_url(client, build_id)
     logs.append(build_url)
     if failed:
         logger.error('Copr build failed %s', build_url)
         raise BinaryPackageBuildError(logs=logs)
     return rpms, logs
示例#4
0
 def get_detached_task(cls, task_id, results_dir):
     client = CoprHelper.get_client()
     build_id = int(task_id)
     status = CoprHelper.get_build_status(client, build_id)
     if status in ['importing', 'pending', 'starting', 'running']:
         raise RebaseHelperError('Copr build is not finished yet. Try again later')
     else:
         rpm, logs = CoprHelper.download_build(client, build_id, results_dir)
         if status not in ['succeeded', 'skipped']:
             logger.info('Copr build %d did not complete successfully', build_id)
             raise BinaryPackageBuildError(logs=logs)
         return rpm, logs
示例#5
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(logs=logs,
                                       logfile=get_mock_logfile_path(
                                           exit_code, results_dir))
     if not rpms:
         raise RebaseHelperError(
             'Koji tasks are not finished yet. Try again later.')
     return rpms, logs
示例#6
0
    def _build_rpm(cls,
                   srpm,
                   workdir,
                   results_dir,
                   rpm_results_dir,
                   builder_options=None):
        """Builds RPMs using rpmbuild

        Args:
            srpm: Path to SRPM.
            workdir: Path to working directory with rpmbuild directory structure.
            results_dir: Path to directory where logs will be placed.
            rpm_results_dir: Path to directory where RPMs will be placed.
            builder_options: Additional options for rpmbuild.

        Returns:
            Tuple, the first element is a list of paths to built RPMs,
            the second is a list of paths to logs.

        """
        logger.info("Building RPMs")
        output = os.path.join(results_dir, "build.log")

        cmd = [cls.CMD, '--rebuild', srpm]
        if builder_options is not None:
            cmd.extend(builder_options)
        ret = ProcessHelper.run_subprocess_cwd_env(cmd,
                                                   env={'HOME': workdir},
                                                   output_file=output)

        build_log_path = os.path.join(rpm_results_dir, 'build.log')
        logs = []
        for log in PathHelper.find_all_files(results_dir, '*.log'):
            logs.append(os.path.join(rpm_results_dir, os.path.basename(log)))

        if ret == 0:
            return [
                f for f in PathHelper.find_all_files(workdir, '*.rpm')
                if not f.endswith('.src.rpm')
            ], logs
        # An error occurred, raise an exception
        raise BinaryPackageBuildError("Building RPMs failed!",
                                      results_dir,
                                      logfile=build_log_path,
                                      logs=logs)
示例#7
0
 def _scratch_build(cls, results_dir, srpm, **kwargs):
     session = KojiHelper.create_session(login=True)
     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(logs=logs,
                                       logfile=get_mock_logfile_path(
                                           exit_code, results_dir))
     return rpms, logs, task_id
示例#8
0
    def _build_rpms(cls, srpm, name, **kwargs):
        project = cls.PREFIX + name
        client = CoprHelper.get_client()
        options = kwargs.get('app_kwargs', {})
        hide = not options.get('copr_project_frontpage')
        permanent = options.get('copr_project_permanent')
        chroots = options.get('copr_chroots')

        CoprHelper.create_project(client, project, chroots, cls.DESCRIPTION, cls.INSTRUCTIONS, permanent, hide)
        build_id = CoprHelper.build(client, project, srpm)
        if kwargs['builds_nowait']:
            return None, None, build_id
        build_url = CoprHelper.get_build_url(client, build_id)
        logger.info('Copr build is here: %s', build_url)
        failed = not CoprHelper.watch_build(client, build_id)
        destination = os.path.dirname(srpm).replace('SRPM', 'RPM')
        rpms, logs = CoprHelper.download_build(client, build_id, destination)
        logs.append(build_url)
        if failed:
            logger.error('Copr build failed %s', build_url)
            raise BinaryPackageBuildError(logs=logs)
        return rpms, logs, build_id