예제 #1
0
class CoprBuildStartHandler(FedmsgHandler):
    topic = "org.fedoraproject.prod.copr.build.start"
    name = JobType.copr_build_started

    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 run(self):
        if self.event.chroot == "srpm-builds":
            # we don't want to set the check status for this
            msg = "SRPM build in copr has started"
            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})

        status = "pending"
        if build_pg:
            url = get_log_url(build_pg.id)
            build_pg.set_status(status)
            copr_build_logs = get_copr_build_logs_url(self.event)
            build_pg.set_build_logs_url(copr_build_logs)
        else:
            url = copr_url_from_event(self.event)

        self.build_job_helper.report_status_to_all_for_chroot(
            description="RPM build has started...",
            state=status,
            url=url,
            chroot=self.event.chroot,
        )
        msg = f"Build on {self.event.chroot} in copr has started..."
        return HandlerResults(success=True, details={"msg": msg})
예제 #2
0
class CoprBuildStartHandler(FedmsgHandler):
    topic = "org.fedoraproject.prod.copr.build.start"
    triggers = [TheJobTriggerType.copr_start]

    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 run(self):
        if self.event.chroot == "srpm-builds":
            # we don't want to set the check status for this
            msg = "SRPM build in copr has started"
            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 = CoprBuildModel.get_by_build_id(str(self.event.build_id),
                                               self.event.chroot)
        if not build:
            msg = f"Copr build {self.event.build_id} not in CoprBuildDB"
            logger.warning(msg)
            return HandlerResults(success=False, details={"msg": msg})

        url = get_log_url(build.id)
        build.set_status("pending")
        copr_build_logs = get_copr_build_logs_url(self.event)
        build.set_build_logs_url(copr_build_logs)

        self.build_job_helper.report_status_to_all_for_chroot(
            description="RPM build has started...",
            state=CommitStatus.pending,
            url=url,
            chroot=self.event.chroot,
        )
        msg = f"Build on {self.event.chroot} in copr has started..."
        return HandlerResults(success=True, details={"msg": msg})
예제 #3
0
    def run(self):
        build_job_helper = CoprBuildJobHelper(
            config=self.config,
            package_config=self.event.package_config,
            project=self.event.project,
            event=self.event,
        )

        if self.event.chroot == "srpm-builds":
            # we don't want to set the check status for this
            msg = "SRPM build in copr has started."
            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 = CoprBuildModel.get_by_build_id(
            str(self.event.build_id), self.event.chroot
        )
        if not build:
            msg = f"Copr build {self.event.build_id} not in CoprBuildDB."
            logger.warning(msg)
            return HandlerResults(success=False, details={"msg": msg})

        start_time = (
            datetime.utcfromtimestamp(self.event.timestamp)
            if self.event.timestamp
            else None
        )
        build.set_start_time(start_time)
        url = get_copr_build_log_url_from_flask(build.id)
        build.set_status("pending")
        copr_build_logs = get_copr_build_logs_url(self.event)
        build.set_build_logs_url(copr_build_logs)

        build_job_helper.report_status_to_all_for_chroot(
            description="RPM build is in progress...",
            state=CommitStatus.pending,
            url=url,
            chroot=self.event.chroot,
        )
        msg = f"Build on {self.event.chroot} in copr has started..."
        return HandlerResults(success=True, details={"msg": msg})
예제 #4
0
    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 the check status for this
            msg = "SRPM build in copr has started."
            logger.debug(msg)
            return TaskResults(success=True, details={"msg": msg})

        if not self.build:
            msg = f"Copr build {self.copr_event.build_id} not in CoprBuildDB."
            logger.warning(msg)
            return TaskResults(success=False, details={"msg": msg})

        start_time = (
            datetime.utcfromtimestamp(self.copr_event.timestamp)
            if self.copr_event.timestamp
            else None
        )
        self.build.set_start_time(start_time)
        url = get_copr_build_info_url_from_flask(self.build.id)
        self.build.set_status("pending")
        copr_build_logs = self.copr_event.get_copr_build_logs_url()
        self.build.set_build_logs_url(copr_build_logs)

        build_job_helper.report_status_to_all_for_chroot(
            description="RPM build is in progress...",
            state=CommitStatus.pending,
            url=url,
            chroot=self.copr_event.chroot,
        )
        msg = f"Build on {self.copr_event.chroot} in copr has started..."
        return TaskResults(success=True, details={"msg": msg})
예제 #5
0
    def run(self):
        build_job_helper = CoprBuildJobHelper(
            config=self.config,
            package_config=self.event.package_config,
            project=self.event.project,
            event=self.event,
        )

        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 = CoprBuildModel.get_by_build_id(
            str(self.event.build_id), self.event.chroot
        )
        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.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.status})."
            )
            logger.info(msg)
            return HandlerResults(success=True, details={"msg": msg})

        end_time = (
            datetime.utcfromtimestamp(self.event.timestamp)
            if self.event.timestamp
            else None
        )
        build.set_end_time(end_time)
        url = get_copr_build_log_url_from_flask(build.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."
            build_job_helper.report_status_to_all_for_chroot(
                state=CommitStatus.failure,
                description=failed_msg,
                url=url,
                chroot=self.event.chroot,
            )
            build.set_status(PG_COPR_BUILD_STATUS_FAILURE)
            return HandlerResults(success=False, details={"msg": failed_msg})

        if (
            build_job_helper.job_build
            and build_job_helper.job_build.trigger == JobConfigTriggerType.pull_request
            and self.event.pr_id
            and isinstance(self.event.project, GithubProject)
            and not self.was_last_packit_comment_with_congratulation()
            and self.event.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.event.project.pr_comment(pr_id=self.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.event.chroot,
        )
        build_job_helper.report_status_to_test_for_chroot(
            state=CommitStatus.pending,
            description="RPMs were built successfully.",
            url=url,
            chroot=self.event.chroot,
        )
        build.set_status(PG_COPR_BUILD_STATUS_SUCCESS)

        if (
            build_job_helper.job_tests
            and self.event.chroot in build_job_helper.tests_targets
        ):
            testing_farm_handler = GithubTestingFarmHandler(
                config=self.config,
                job_config=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={})
예제 #6
0
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})
        # 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=CommitStatus.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 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,
        )
        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_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={})
예제 #7
0
    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, GitlabProject))
                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"
                ":warning: Please note that our current plans include removal of these "
                "comments in the near future (at least 2 weeks after including this "
                "disclaimer), if you have serious concerns regarding their removal "
                "or would like to continue receiving them please reach out to us. "
                ":warning:\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={})