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"
    )
    pr1_trigger = JobTriggerModel.get_or_create(
        type=JobTriggerModelType.pull_request, trigger_id=pr1.id
    )
    srpm_build = SRPMBuildModel.create("asd\nqwe\n")
    copr_build = CoprBuildModel.get_or_create(
        build_id="123456",
        commit_sha="687abc76d67d",
        project_name="SomeUser-hello-world-9",
        owner="packit",
        web_url="https://copr.something.somewhere/123456",
        target=TARGET,
        status="pending",
        srpm_build=srpm_build,
        trigger_model=pr1,
    )
    koji_build = KojiBuildModel.get_or_create(
        build_id="987654",
        commit_sha="687abc76d67d",
        web_url="https://copr.something.somewhere/123456",
        target=TARGET,
        status="pending",
        srpm_build=srpm_build,
        trigger_model=pr1,
    )

    assert copr_build in pr1_trigger.copr_builds
    assert koji_build in pr1_trigger.koji_builds

    assert copr_build.job_trigger.get_trigger_object() == pr1
    assert koji_build.job_trigger.get_trigger_object() == pr1
Example #2
0
def multiple_koji_builds(pr_trigger_model, different_pr_trigger_model):
    srpm_build = SRPMBuildModel.create("asd\nqwe\n")
    yield [
        KojiBuildModel.get_or_create(
            build_id="123456",
            commit_sha="687abc76d67d",
            web_url="https://copr.something.somewhere/123456",
            target="fedora-42-x86_64",
            status="pending",
            srpm_build=srpm_build,
            trigger_model=pr_trigger_model,
        ),
        # Same build_id but different chroot
        KojiBuildModel.get_or_create(
            build_id="123456",
            commit_sha="687abc76d67d",
            web_url="https://copr.something.somewhere/123456",
            target="fedora-43-x86_64",
            status="pending",
            srpm_build=srpm_build,
            trigger_model=pr_trigger_model,
        ),
        # Completely different build
        KojiBuildModel.get_or_create(
            build_id="987654",
            commit_sha="987def76d67e",
            web_url="https://copr.something.somewhere/987654",
            target="fedora-43-x86_64",
            status="pending",
            srpm_build=srpm_build,
            trigger_model=different_pr_trigger_model,
        ),
    ]
Example #3
0
    def _create_srpm(self):
        # 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)

        srpm_success = True
        exception: Optional[Exception] = None
        extra_logs: str = ""

        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 = f"\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 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?
            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 the freenode IRC channel #packit for the latest info.\n"
            )

        self._srpm_model = SRPMBuildModel.create(logs=srpm_logs, success=srpm_success)
Example #4
0
def a_koji_build(pr_model):
    srpm_build = SRPMBuildModel.create("asd\nqwe\n")
    yield KojiBuildModel.get_or_create(
        build_id="123456",
        commit_sha="687abc76d67d",
        web_url="https://copr.something.somewhere/123456",
        target=TARGET,
        status="pending",
        srpm_build=srpm_build,
        trigger_model=pr_model,
    )
Example #5
0
def a_copr_build_for_release(release_model):
    srpm_build = SRPMBuildModel.create("asd\nqwe\n")
    yield CoprBuildModel.get_or_create(
        build_id="123456",
        commit_sha="687abc76d67d",
        project_name="SomeUser-hello-world-9",
        owner="packit",
        web_url="https://copr.something.somewhere/123456",
        target=TARGET,
        status="pending",
        srpm_build=srpm_build,
        trigger_model=release_model,
    )
Example #6
0
    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 = SRPMBuildModel.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 = CoprBuildModel.get_or_create(
                build_id=str(build_metadata.copr_build_id),
                commit_sha=self.event.commit_sha,
                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,
                trigger_model=self.event.db_trigger,
            )
            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,
            )

        # 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={})
Example #7
0
def packit_build_752():
    pr_model = PullRequestModel.get_or_create(pr_id=752,
                                              namespace="packit-service",
                                              repo_name="packit")

    srpm_build = SRPMBuildModel.create("asd\nqwe\n")
    yield CoprBuildModel.get_or_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",
        srpm_build=srpm_build,
        trigger_model=pr_model,
    )
Example #8
0
def copr_builds_with_different_triggers(pr_model, branch_model, release_model):
    srpm_build = SRPMBuildModel.create("asd\nqwe\n")
    yield [
        # pull request trigger
        CoprBuildModel.get_or_create(
            build_id="123456",
            commit_sha="687abc76d67d",
            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,
            trigger_model=pr_model,
        ),
        # branch push trigger
        CoprBuildModel.get_or_create(
            build_id="123456",
            commit_sha="687abc76d67d",
            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,
            trigger_model=branch_model,
        ),
        # release trigger
        CoprBuildModel.get_or_create(
            build_id="987654",
            commit_sha="987def76d67e",
            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,
            trigger_model=release_model,
        ),
    ]
Example #9
0
def multiple_copr_builds(pr_model, different_pr_model):
    srpm_build = SRPMBuildModel.create("asd\nqwe\n")
    yield [
        CoprBuildModel.get_or_create(
            build_id="123456",
            commit_sha="687abc76d67d",
            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,
            trigger_model=pr_model,
        ),
        # Same build_id but different chroot
        CoprBuildModel.get_or_create(
            build_id="123456",
            commit_sha="687abc76d67d",
            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,
            trigger_model=pr_model,
        ),
        # Completely different build
        CoprBuildModel.get_or_create(
            build_id="987654",
            commit_sha="987def76d67e",
            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,
            trigger_model=different_pr_model,
        ),
    ]
Example #10
0
def srpm_build_model():
    yield SRPMBuildModel.create(SampleValues.srpm_logs, success=True)