def run_copr_build(self) -> HandlerResults:

        if not (self.job_build or self.job_tests):
            msg = "No copr_build or tests job defined."
            # we can't report it to end-user at this stage
            return HandlerResults(success=False, details={"msg": msg})

        self.report_status_to_all(description="Building SRPM ...",
                                  state=CommitStatus.pending)

        build_metadata = self._run_copr_build_and_save_output()

        srpm_build_model = SRPMBuild.create(build_metadata.srpm_logs)

        if build_metadata.srpm_failed:
            msg = "SRPM build failed, check the logs for details."
            self.report_status_to_all(
                state=CommitStatus.failure,
                description=msg,
                url=get_srpm_log_url(srpm_build_model.id),
            )
            return HandlerResults(success=False, details={"msg": msg})

        for chroot in self.build_chroots:
            copr_build = CoprBuild.get_or_create(
                pr_id=self.pr_id,
                build_id=str(build_metadata.copr_build_id),
                commit_sha=self.event.commit_sha,
                repo_name=self.project.repo,
                namespace=self.project.namespace,
                project_name=self.job_project,
                owner=self.job_owner,
                web_url=build_metadata.copr_web_url,
                target=chroot,
                status="pending",
                srpm_build=srpm_build_model,
            )
            url = get_log_url(id_=copr_build.id)
            self.report_status_to_all_for_chroot(
                state=CommitStatus.pending,
                description="Building RPM ...",
                url=url,
                chroot=chroot,
            )

        self.copr_build_model.build_id = build_metadata.copr_build_id
        self.copr_build_model.save()

        # release the hounds!
        celery_app.send_task(
            "task.babysit_copr_build",
            args=(build_metadata.copr_build_id, ),
            countdown=120,  # do the first check in 120s
        )

        return HandlerResults(success=True, details={})
def multiple_copr_builds():
    with get_sa_session() as session:
        session.query(CoprBuild).delete()
        srpm_build = SRPMBuild.create("asd\nqwe\n")
        yield [
            CoprBuild.get_or_create(
                pr_id=1,
                build_id="123456",
                commit_sha="687abc76d67d",
                repo_name="lithium",
                namespace="nirvana",
                project_name="SomeUser-hello-world-9",
                owner="packit",
                web_url="https://copr.something.somewhere/123456",
                target="fedora-42-x86_64",
                status="pending",
                srpm_build=srpm_build,
            ),
            # Same build_id but different chroot
            CoprBuild.get_or_create(
                pr_id=1,
                build_id="123456",
                commit_sha="687abc76d67d",
                repo_name="lithium",
                namespace="nirvana",
                project_name="SomeUser-hello-world-9",
                owner="packit",
                web_url="https://copr.something.somewhere/123456",
                target="fedora-43-x86_64",
                status="pending",
                srpm_build=srpm_build,
            ),
            # Completely different build
            CoprBuild.get_or_create(
                pr_id=4,
                build_id="987654",
                commit_sha="987def76d67e",
                repo_name="cockpit-project",
                namespace="cockpit",
                project_name="SomeUser-random-text-7",
                owner="cockpit-project",
                web_url="https://copr.something.somewhere/987654",
                target="fedora-43-x86_64",
                status="pending",
                srpm_build=srpm_build,
            ),
        ]

    clean_db()
Beispiel #3
0
def a_copr_build():
    with get_sa_session() as session:
        session.query(CoprBuild).delete()
        srpm_build = SRPMBuild.create("asd\nqwe\n")
        yield CoprBuild.get_or_create(
            pr_id=1,
            build_id="123456",
            commit_sha="687abc76d67d",
            repo_name="lithium",
            namespace="nirvana",
            web_url="https://copr.something.somewhere/123456",
            target=TARGET,
            status="pending",
            srpm_build=srpm_build,
        )
    clean_db()
def packit_build_752():
    with get_sa_session() as session:
        session.query(CoprBuild).delete()
        srpm_build = SRPMBuild.create("asd\nqwe\n")
        yield CoprBuild.get_or_create(
            pr_id=752,
            build_id=str(BUILD_ID),
            commit_sha="687abc76d67d",
            repo_name="packit",
            namespace="packit-service",
            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",
            srpm_build=srpm_build,
        )
    clean_db()
Beispiel #5
0
    def run_copr_build(self) -> HandlerResults:

        if not (self.job_copr_build or self.job_tests):
            msg = "No copr_build or tests job defined."
            # we can't report it to end-user at this stage
            return HandlerResults(success=False, details={"msg": msg})

        try:
            self.report_status_to_all(description="Building SRPM ...",
                                      state="pending")

            # 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(None, "%H:%M:%S")
            handler.setFormatter(formatter)

            build_id, _ = self.api.run_copr_build(
                project=self.job_project,
                chroots=self.build_chroots,
                owner=self.job_owner,
            )

            packit_logger.removeHandler(handler)
            stream.seek(0)
            logs = stream.read()
            web_url = get_copr_build_url_for_values(self.job_owner,
                                                    self.job_project, build_id)

            srpm_build = SRPMBuild.create(logs)

            status = "pending"
            description = "Building RPM ..."
            for chroot in self.build_chroots:
                copr_build = CoprBuild.get_or_create(
                    pr_id=self.event.pr_id,
                    build_id=str(build_id),
                    commit_sha=self.event.commit_sha,
                    repo_name=self.event.base_repo_name,
                    namespace=self.event.base_repo_namespace,
                    web_url=web_url,
                    target=chroot,
                    status=status,
                    srpm_build=srpm_build,
                )
                url = get_log_url(id_=copr_build.id)
                self.status_reporter.report(
                    state=status,
                    description=description,
                    url=url,
                    check_names=PRCheckName.get_build_check(chroot),
                )
                if chroot in self.tests_chroots:
                    self.status_reporter.report(
                        state=status,
                        description=description,
                        url=url,
                        check_names=PRCheckName.get_testing_farm_check(chroot),
                    )

        except SandcastleTimeoutReached:
            return self._process_timeout()

        except SandcastleCommandFailed as ex:
            return self._process_failed_command(ex)

        except ApiException as ex:
            return self._process_openshift_error(ex)

        except PackitSRPMException as ex:
            return self._process_failed_srpm_build(ex)

        except PackitCoprProjectException as ex:
            return self._process_copr_submit_exception(ex)

        except PackitCoprException as ex:
            return self._process_general_exception(ex)

        except Exception as ex:
            return self._process_general_exception(ex)

        self.copr_build_model.build_id = build_id
        self.copr_build_model.save()

        return HandlerResults(success=True, details={})
    def run_copr_build(self) -> HandlerResults:

        if not (self.job_build or self.job_tests):
            msg = "No copr_build or tests job defined."
            # we can't report it to end-user at this stage
            return HandlerResults(success=False, details={"msg": msg})

        try:
            self.report_status_to_all(description="Building SRPM ...", state="pending")

            build_id, logs = self._run_copr_build_and_save_output()
            web_url = get_copr_build_url_for_values(
                self.job_owner, self.job_project, build_id
            )

            srpm_build_model = SRPMBuild.create(logs)

            for chroot in self.build_chroots:
                copr_build = CoprBuild.get_or_create(
                    pr_id=self.event.pr_id,
                    build_id=str(build_id),
                    commit_sha=self.event.commit_sha,
                    repo_name=self.event.base_repo_name,
                    namespace=self.event.base_repo_namespace,
                    web_url=web_url,
                    target=chroot,
                    status="pending",
                    srpm_build=srpm_build_model,
                )
                url = get_log_url(id_=copr_build.id)
                self.report_status_to_all_for_chroot(
                    state="pending",
                    description="Building RPM ...",
                    url=url,
                    chroot=chroot,
                )

        except SandcastleTimeoutReached:
            return self._process_timeout()

        except SandcastleCommandFailed as ex:
            return self._process_failed_command(ex)

        except ApiException as ex:
            return self._process_openshift_error(ex)

        except PackitSRPMException as ex:
            return self._process_failed_srpm_build(ex)

        except PackitCoprProjectException as ex:
            return self._process_copr_submit_exception(ex)

        except PackitCoprException as ex:
            return self._process_general_exception(ex)

        except Exception as ex:
            return self._process_general_exception(ex)

        self.copr_build_model.build_id = build_id
        self.copr_build_model.save()

        return HandlerResults(success=True, details={})