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)
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
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
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
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
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)
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
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