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 build_model(self) -> Optional[KojiBuildModel]: if not super().build_model: self._build_model = KojiBuildModel.create( build_id=str(self.build_id), commit_sha=self._commit_sha, web_url=self.web_url, target="noarch", # TODO: where to get this info from? status=self.state.value, run_model=RunModel.create( type=JobTriggerModelType.branch_push, trigger_id=GitBranchModel.get_or_create( branch_name=self.branch_name, repo_name=self.repo_name, namespace=self.namespace, project_url=self.project_url, ).id, ), ) return self._build_model
class KojiBuildJobHelper(BaseBuildJobHelper): job_type_build = JobType.production_build job_type_test = None status_name_build: str = "production-build" status_name_test: str = None def __init__( self, service_config: ServiceConfig, package_config: PackageConfig, project: GitProject, metadata: EventData, db_trigger, job_config: JobConfig, targets_override: Optional[Set[str]] = None, ): super().__init__( service_config=service_config, package_config=package_config, project=project, metadata=metadata, db_trigger=db_trigger, job_config=job_config, targets_override=targets_override, ) self.msg_retrigger: str = MSG_RETRIGGER.format( job="build", command="production-build", place="pull request" ) # Lazy properties self._supported_koji_targets = None @property def is_scratch(self) -> bool: return self.job_build and self.job_build.metadata.scratch @property def build_targets_all(self) -> Set[str]: """ Return all valid Koji targets/chroots from config. """ return get_koji_targets(*self.configured_build_targets) @property def tests_targets_all(self) -> Set[str]: """ [not used now] Return all valid test targets/chroots from config. """ return get_koji_targets(*self.configured_tests_targets) @property def supported_koji_targets(self): if self._supported_koji_targets is None: self._supported_koji_targets = get_all_koji_targets() return self._supported_koji_targets def run_koji_build(self) -> TaskResults: self.report_status_to_all( description="Building SRPM ...", state=BaseCommitStatus.running ) if results := self.create_srpm_if_needed(): return results if self.srpm_model.status != PG_BUILD_STATUS_SUCCESS: msg = "SRPM build failed, check the logs for details." self.report_status_to_all( state=BaseCommitStatus.failure, description=msg, url=get_srpm_build_info_url(self.srpm_model.id), ) return TaskResults(success=False, details={"msg": msg}) try: # We need to do it manually # because we don't use PackitAPI.build, but PackitAPI.up.koji_build self.api.init_kerberos_ticket() except PackitCommandFailedError as ex: msg = f"Kerberos authentication error: {ex.stderr_output}" logger.error(msg) self.report_status_to_all( state=BaseCommitStatus.error, description=msg, url=get_srpm_build_info_url(self.srpm_model.id), ) return TaskResults(success=False, details={"msg": msg}) errors: Dict[str, str] = {} for target in self.build_targets: if target not in self.supported_koji_targets: msg = f"Target not supported: {target}" self.report_status_to_all_for_chroot( state=BaseCommitStatus.error, description=msg, url=get_srpm_build_info_url(self.srpm_model.id), chroot=target, ) errors[target] = msg continue try: build_id, web_url = self.run_build(target=target) except Exception as ex: sentry_integration.send_to_sentry(ex) # TODO: Where can we show more info about failure? # TODO: Retry self.report_status_to_all_for_chroot( state=BaseCommitStatus.error, description=f"Submit of the build failed: {ex}", url=get_srpm_build_info_url(self.srpm_model.id), chroot=target, ) errors[target] = str(ex) continue koji_build = KojiBuildModel.create( build_id=str(build_id), commit_sha=self.metadata.commit_sha, web_url=web_url, target=target, status="pending", run_model=self.run_model, ) url = get_koji_build_info_url(id_=koji_build.id) self.report_status_to_all_for_chroot( state=BaseCommitStatus.running, description="Building RPM ...", url=url, chroot=target, ) if errors: return TaskResults( success=False, details={ "msg": "Koji build submit was not successful for all chroots.", "errors": errors, }, ) # TODO: release the hounds! """ celery_app.send_task( "task.babysit_koji_build", args=(build_metadata.build_id,), countdown=120, # do the first check in 120s ) """ return TaskResults(success=True, details={})