def test_copr_and_koji_build_for_one_trigger(clean_before_and_after): pr1 = PullRequestModel.get_or_create( pr_id=1, namespace="the-namespace", repo_name="the-repo-name", project_url="https://github.com/the-namespace/the-repo-name", ) # SRPMBuildModel is (sadly) not shared between Koji and Copr builds. srpm_build_for_copr, run_model_for_copr = SRPMBuildModel.create_with_new_run( trigger_model=pr1, commit_sha="687abc76d67d") srpm_build_for_copr.set_logs("asd\nqwe\n") srpm_build_for_copr.set_status("success") srpm_build_for_koji, run_model_for_koji = SRPMBuildModel.create_with_new_run( trigger_model=pr1, commit_sha="687abc76d67d") srpm_build_for_copr.set_logs("asd\nqwe\n") srpm_build_for_copr.set_status("success") copr_build = CoprBuildModel.create( build_id="123456", commit_sha="687abc76d67d", project_name="SomeUser-hello-world-9", owner="packit", web_url="https://copr.something.somewhere/123456", target=SampleValues.target, status="pending", run_model=run_model_for_copr, ) koji_build = KojiBuildModel.create( build_id="987654", commit_sha="687abc76d67d", web_url="https://copr.something.somewhere/123456", target=SampleValues.target, status="pending", run_model=run_model_for_koji, ) assert copr_build in pr1.get_copr_builds() assert koji_build in pr1.get_koji_builds() assert srpm_build_for_copr in pr1.get_srpm_builds() assert srpm_build_for_koji in pr1.get_srpm_builds() assert copr_build.get_job_trigger_model( ) == koji_build.get_job_trigger_model() assert srpm_build_for_copr.get_trigger_object() == pr1 assert srpm_build_for_koji.get_trigger_object() == pr1 assert copr_build.get_trigger_object() == pr1 assert koji_build.get_trigger_object() == pr1 assert len(koji_build.runs) == 1 assert koji_build.runs[0] == run_model_for_koji assert len(copr_build.runs) == 1 assert copr_build.runs[0] == run_model_for_copr
def packit_build_752(): pr_model = PullRequestModel.get_or_create( pr_id=752, namespace="packit-service", repo_name="packit", project_url="https://github.com/packit-service/packit", ) srpm_build, run_model = SRPMBuildModel.create_with_new_run( "asd\nqwe\n", success=True, trigger_model=pr_model) yield CoprBuildModel.create( build_id=str(BUILD_ID), commit_sha="687abc76d67d", project_name="packit-service-packit-752", owner="packit", web_url=("https://download.copr.fedorainfracloud.org/" "results/packit/packit-service-packit-752"), target="fedora-rawhide-x86_64", status="pending", run_model=run_model, )
def run_copr_build_from_source_script(self) -> TaskResults: """ Run copr build using custom source method. """ try: pr_id = self.metadata.pr_id script = create_source_script( url=self.metadata.project_url, ref=self.metadata.git_ref, pr_id=str(pr_id) if pr_id else None, merge_pr=self.package_config.merge_pr_in_ci, target_branch=self.project.get_pr(pr_id).target_branch if pr_id else None, job_config=self.job_config, ) build_id, web_url = self.submit_copr_build(script=script) except Exception as ex: self.handle_build_submit_error(ex) return TaskResults( success=False, details={"msg": "Submit of the Copr build failed.", "error": str(ex)}, ) self._srpm_model, self.run_model = SRPMBuildModel.create_with_new_run( copr_build_id=str(build_id), commit_sha=self.metadata.commit_sha, trigger_model=self.db_trigger, copr_web_url=web_url, ) self.report_status_to_all( description="SRPM build in Copr was submitted...", state=BaseCommitStatus.pending, url=get_srpm_build_info_url(self.srpm_model.id), ) self.handle_rpm_build_start(build_id, web_url, waiting_for_srpm=True) return TaskResults(success=True, details={})
def _create_srpm(self): """ Create SRPM. Returns: Task results if job is done because of merge conflicts, `None` otherwise. """ # we want to get packit logs from the SRPM creation process # so we stuff them into a StringIO buffer stream = StringIO() handler = logging.StreamHandler(stream) packit_logger = logging.getLogger("packit") packit_logger.setLevel(logging.DEBUG) packit_logger.addHandler(handler) formatter = PackitFormatter() handler.setFormatter(formatter) srpm_success = True exception: Optional[Exception] = None extra_logs: str = "" results: Optional[TaskResults] = None try: self._srpm_path = Path( self.api.create_srpm( srpm_dir=self.api.up.local_project.working_dir)) except SandcastleTimeoutReached as ex: exception = ex extra_logs = "\nYou have reached 10-minute timeout while creating SRPM.\n" except ApiException as ex: exception = ex # this is an internal error: let's not expose anything to public extra_logs = ( "\nThere was a problem in the environment the packit-service is running in.\n" "Please hang tight, the help is coming.") except PackitMergeException as ex: exception = ex results = TaskResults( success=True, details={ "msg": "Merge conflicts were detected, cannot build SRPM.", "exception": str(ex), }, ) except Exception as ex: exception = ex # collect the logs now packit_logger.removeHandler(handler) stream.seek(0) srpm_logs = stream.read() if exception: logger.info(f"exception while running SRPM build: {exception}") logger.debug(f"{exception!r}") srpm_success = False # when do we NOT want to send stuff to sentry? if not isinstance(exception, PackitMergeException): sentry_integration.send_to_sentry(exception) # this needs to be done AFTER we gather logs # so that extra logs are after actual logs srpm_logs += extra_logs if hasattr(exception, "output"): output = getattr(exception, "output", "") # mypy srpm_logs += f"\nOutput of the command in the sandbox:\n{output}\n" srpm_logs += ( f"\nMessage: {exception}\nException: {exception!r}\n{self.msg_retrigger}" "\nPlease join #packit on irc.libera.chat if you need help with the error above.\n" ) self._srpm_model, self.run_model = SRPMBuildModel.create_with_new_run( logs=srpm_logs, success=srpm_success, trigger_model=self.db_trigger, ) return results