class CoprBuildEndHandler(FedmsgHandler): topic = "org.fedoraproject.prod.copr.build.end" triggers = [TheJobTriggerType.copr_end] def __init__( self, config: ServiceConfig, job_config: Optional[JobConfig], event: CoprBuildEvent, ): super().__init__(config=config, job_config=job_config, event=event) self.project = self.event.get_project() self.package_config = self.event.get_package_config() self.build_job_helper = CoprBuildJobHelper( config=self.config, package_config=self.package_config, project=self.project, event=event, ) def was_last_build_successful(self): """ Check if the last copr build of the PR was successful :return: bool """ comments = self.project.get_pr_comments(pr_id=self.event.pr_id, reverse=True) for comment in comments: if comment.author.startswith("packit-as-a-service"): if "Congratulations!" in comment.comment: return True return False # if there is no comment from p-s return False def run(self): if self.event.chroot == "srpm-builds": # we don't want to set check for this msg = "SRPM build in copr has finished" logger.debug(msg) return HandlerResults(success=True, details={"msg": msg}) build_pg = CoprBuild.get_by_build_id( str(self.event.build_id), self.event.chroot ) if not build_pg: # TODO: how could this happen? msg = f"Copr build {self.event.build_id} not in CoprBuildDB" logger.warning(msg) return HandlerResults(success=False, details={"msg": msg}) if build_pg.status in [ PG_COPR_BUILD_STATUS_FAILURE, PG_COPR_BUILD_STATUS_SUCCESS, ]: msg = ( f"Copr build {self.event.build_id} is already" f" processed (status={build_pg.status})." ) logger.info(msg) return HandlerResults(success=True, details={"msg": msg}) url = get_log_url(build_pg.id) # https://pagure.io/copr/copr/blob/master/f/common/copr_common/enums.py#_42 if self.event.status != COPR_API_SUCC_STATE: failed_msg = "RPMs failed to be built." self.build_job_helper.report_status_to_all_for_chroot( state=CommitStatus.failure, description=failed_msg, url=url, chroot=self.event.chroot, ) build_pg.set_status(PG_COPR_BUILD_STATUS_FAILURE) return HandlerResults(success=False, details={"msg": failed_msg}) if ( self.build_job_helper.job_build and self.build_job_helper.job_build.trigger == TheJobTriggerType.pull_request and not self.was_last_build_successful() and self.package_config.notifications.pull_request.successful_build ): msg = ( f"Congratulations! One of the builds has completed. :champagne:\n\n" "You can install the built RPMs by following these steps:\n\n" "* `sudo yum install -y dnf-plugins-core` on RHEL 8\n" "* `sudo dnf install -y dnf-plugins-core` on Fedora\n" f"* `dnf copr enable {self.event.owner}/{self.event.project_name}`\n" "* And now you can install the packages.\n" "\nPlease note that the RPMs should be used only in a testing environment." ) self.project.pr_comment(pr_id=self.event.pr_id, body=msg) self.build_job_helper.report_status_to_build_for_chroot( state=CommitStatus.success, description="RPMs were built successfully.", url=url, chroot=self.event.chroot, ) self.build_job_helper.report_status_to_test_for_chroot( state=CommitStatus.pending, description="RPMs were built successfully.", url=url, chroot=self.event.chroot, ) build_pg.set_status(PG_COPR_BUILD_STATUS_SUCCESS) if ( self.build_job_helper.job_tests and self.event.chroot in self.build_job_helper.tests_chroots ): testing_farm_handler = GithubTestingFarmHandler( config=self.config, job_config=self.build_job_helper.job_tests, event=self.event, chroot=self.event.chroot, ) testing_farm_handler.run() else: logger.debug("Testing farm not in the job config.") return HandlerResults(success=True, details={})
class CoprBuildEndHandler(FedmsgHandler): topic = "org.fedoraproject.prod.copr.build.end" name = JobType.copr_build_finished def __init__(self, config: ServiceConfig, job: JobConfig, event: CoprBuildEvent): super().__init__(config=config, job=job, event=event) self.project = self.event.get_project() self.package_config = self.event.get_package_config() self.build_job_helper = CoprBuildJobHelper( config=self.config, package_config=self.package_config, project=self.project, event=event, ) def was_last_build_successful(self): """ Check if the last copr build of the PR was successful :return: bool """ comments = self.project.get_pr_comments(pr_id=self.event.pr_id, reverse=True) for comment in comments: if comment.author.startswith("packit-as-a-service"): if "Congratulations!" in comment.comment: return True return False # if there is no comment from p-s return False def run(self): if self.event.chroot == "srpm-builds": # we don't want to set check for this msg = "SRPM build in copr has finished" logger.debug(msg) return HandlerResults(success=True, details={"msg": msg}) # TODO: drop the code below once we move to PG completely; the build is present in event # pg build_pg = CoprBuild.get_by_build_id(str(self.event.build_id), self.event.chroot) if not build_pg: logger.info( f"build {self.event.build_id} is not in pg, falling back to redis" ) # redis - old school build = CoprBuildDB().get_build(self.event.build_id) if not build: # TODO: how could this happen? msg = f"Copr build {self.event.build_id} not in CoprBuildDB" logger.warning(msg) return HandlerResults(success=False, details={"msg": msg}) if build_pg: url = get_log_url(build_pg.id) else: url = copr_url_from_event(self.event) # https://pagure.io/copr/copr/blob/master/f/common/copr_common/enums.py#_42 if self.event.status != 1: failed_msg = "RPMs failed to be built." self.build_job_helper.report_status_to_all_for_chroot( state="failure", description=failed_msg, url=url, chroot=self.event.chroot, ) if build_pg: build_pg.set_status("failure") return HandlerResults(success=False, details={"msg": failed_msg}) if self.build_job_helper.job_build and not self.was_last_build_successful( ): msg = ( f"Congratulations! One of the builds has completed. :champagne:\n\n" "You can install the built RPMs by following these steps:\n\n" "* `sudo yum install -y dnf-plugins-core` on RHEL 8\n" "* `sudo dnf install -y dnf-plugins-core` on Fedora\n" f"* `dnf copr enable {self.event.owner}/{self.event.project_name}`\n" "* And now you can install the packages.\n" "\nPlease note that the RPMs should be used only in a testing environment." ) self.project.pr_comment(pr_id=self.event.pr_id, body=msg) self.build_job_helper.report_status_to_build_for_chroot( state="success", description="RPMs were built successfully.", url=url, chroot=self.event.chroot, ) self.build_job_helper.report_status_to_test_for_chroot( state="pending", description="RPMs were built successfully.", url=url, chroot=self.event.chroot, ) if build_pg: build_pg.set_status("success") if (self.build_job_helper.job_tests and self.event.chroot in self.build_job_helper.tests_chroots): testing_farm_handler = GithubTestingFarmHandler( config=self.config, job=self.build_job_helper.job_tests, event=self.event, chroot=self.event.chroot, ) testing_farm_handler.run() else: logger.debug("Testing farm not in the job config.") return HandlerResults(success=True, details={})
def run(self): build_job_helper = CoprBuildJobHelper( service_config=self.service_config, package_config=self.package_config, project=self.project, metadata=self.data, db_trigger=self.db_trigger, job_config=self.job_config, ) if self.copr_event.chroot == "srpm-builds": # we don't want to set check for this msg = "SRPM build in copr has finished." logger.debug(msg) return TaskResults(success=True, details={"msg": msg}) if not self.build: # TODO: how could this happen? msg = f"Copr build {self.copr_event.build_id} not in CoprBuildDB." logger.warning(msg) return TaskResults(success=False, details={"msg": msg}) if self.build.status in [ PG_COPR_BUILD_STATUS_FAILURE, PG_COPR_BUILD_STATUS_SUCCESS, ]: msg = (f"Copr build {self.copr_event.build_id} is already" f" processed (status={self.copr_event.build.status}).") logger.info(msg) return TaskResults(success=True, details={"msg": msg}) end_time = (datetime.utcfromtimestamp(self.copr_event.timestamp) if self.copr_event.timestamp else None) self.build.set_end_time(end_time) url = get_copr_build_info_url_from_flask(self.build.id) # https://pagure.io/copr/copr/blob/master/f/common/copr_common/enums.py#_42 if self.copr_event.status != COPR_API_SUCC_STATE: failed_msg = "RPMs failed to be built." build_job_helper.report_status_to_all_for_chroot( state=CommitStatus.failure, description=failed_msg, url=url, chroot=self.copr_event.chroot, ) self.build.set_status(PG_COPR_BUILD_STATUS_FAILURE) return TaskResults(success=False, details={"msg": failed_msg}) if (build_job_helper.job_build and build_job_helper.job_build.trigger == JobConfigTriggerType.pull_request and self.copr_event.pr_id and isinstance(self.project, GithubProject) and not self.was_last_packit_comment_with_congratulation() and self.job_config.notifications.pull_request.successful_build): msg = ( f"Congratulations! One of the builds has completed. :champagne:\n\n" "You can install the built RPMs by following these steps:\n\n" "* `sudo yum install -y dnf-plugins-core` on RHEL 8\n" "* `sudo dnf install -y dnf-plugins-core` on Fedora\n" f"* `dnf copr enable {self.copr_event.owner}/{self.copr_event.project_name}`\n" "* And now you can install the packages.\n" "\nPlease note that the RPMs should be used only in a testing environment." ) self.project.pr_comment(pr_id=self.copr_event.pr_id, body=msg) build_job_helper.report_status_to_build_for_chroot( state=CommitStatus.success, description="RPMs were built successfully.", url=url, chroot=self.copr_event.chroot, ) build_job_helper.report_status_to_test_for_chroot( state=CommitStatus.pending, description="RPMs were built successfully.", url=url, chroot=self.copr_event.chroot, ) self.build.set_status(PG_COPR_BUILD_STATUS_SUCCESS) if (build_job_helper.job_tests and self.copr_event.chroot in build_job_helper.tests_targets): signature( TaskName.testing_farm.value, kwargs={ "package_config": dump_package_config(self.package_config), "job_config": dump_job_config(build_job_helper.job_tests), "event": self.data.get_dict(), "chroot": self.copr_event.chroot, "build_id": self.build.id, }, ).apply_async() else: logger.debug("Testing farm not in the job config.") return TaskResults(success=True, details={})