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})
def test_copr_build_start(copr_build_start, pc_build_pr, copr_build_pr):
    steve = SteveJobs()
    flexmock(SteveJobs, _is_private=False)
    flexmock(CoprHelper).should_receive("get_copr_client").and_return(
        Client(
            config={
                "copr_url": "https://copr.fedorainfracloud.org",
                "username": "******",
            }))
    flexmock(CoprBuildEvent).should_receive("get_package_config").and_return(
        pc_build_pr)
    flexmock(CoprBuildJobHelper).should_receive("get_build_check").and_return(
        EXPECTED_BUILD_CHECK_NAME)

    flexmock(CoprBuildModel).should_receive("get_by_build_id").and_return(
        copr_build_pr)
    url = get_log_url(1)
    flexmock(requests).should_receive("get").and_return(requests.Response())
    flexmock(
        requests.Response).should_receive("raise_for_status").and_return(None)

    copr_build_pr.should_receive("set_status").with_args("pending").once()
    copr_build_pr.should_receive("set_build_logs_url")

    # check if packit-service set correct PR status
    flexmock(StatusReporter).should_receive("report").with_args(
        state=CommitStatus.pending,
        description="RPM build has started...",
        url=url,
        check_names=EXPECTED_BUILD_CHECK_NAME,
    ).once()

    steve.process_message(copr_build_start)
Example #3
0
def test_copr_build_just_tests_defined(copr_build_start, pc_tests, copr_build):
    steve = SteveJobs()
    flexmock(SteveJobs, _is_private=False)
    flexmock(CoprHelper).should_receive("get_copr_client").and_return(
        Client(
            config={
                "copr_url": "https://copr.fedorainfracloud.org",
                "username": "******",
            }))
    flexmock(CoprBuildJobHelper).should_receive("copr_build_model").and_return(
        flexmock())
    flexmock(CoprBuildEvent).should_receive("get_package_config").and_return(
        pc_tests)
    flexmock(TestingFarmJobHelper).should_receive(
        "get_build_check").and_return(EXPECTED_BUILD_CHECK_NAME)
    flexmock(TestingFarmJobHelper).should_receive("get_test_check").and_return(
        EXPECTED_TESTING_FARM_CHECK_NAME)

    flexmock(CoprBuild).should_receive("get_by_build_id").and_return(
        copr_build)
    flexmock(CoprBuildDB).should_receive("get_build").and_return({
        "commit_sha":
        "XXXXX",
        "pr_id":
        24,
        "repo_name":
        "hello-world",
        "repo_namespace":
        "packit-service",
        "ref":
        "XXXX",
        "https_url":
        "https://github.com/packit-service/hello-world",
    })

    url = get_log_url(1)
    flexmock(requests).should_receive("get").and_return(requests.Response())
    flexmock(
        requests.Response).should_receive("raise_for_status").and_return(None)

    flexmock(CoprBuild).should_receive("set_status").with_args("pending")
    flexmock(CoprBuild).should_receive("set_build_logs_url")
    # check if packit-service sets the correct PR status
    flexmock(StatusReporter).should_receive("report").with_args(
        state=CommitStatus.pending,
        description="RPM build has started...",
        url=url,
        check_names=EXPECTED_BUILD_CHECK_NAME,
    ).never()

    flexmock(StatusReporter).should_receive("report").with_args(
        state=CommitStatus.pending,
        description="RPM build has started...",
        url=url,
        check_names=TestingFarmJobHelper.get_test_check(
            copr_build_start["chroot"]),
    ).once()

    steve.process_message(copr_build_start)
Example #4
0
def test_copr_build_not_comment_on_success(copr_build_end, pc_build_pr,
                                           copr_build):
    steve = SteveJobs()
    flexmock(SteveJobs, _is_private=False)
    flexmock(CoprHelper).should_receive("get_copr_client").and_return(
        Client(
            config={
                "copr_url": "https://copr.fedorainfracloud.org",
                "username": "******",
            }))
    flexmock(CoprBuildJobHelper).should_receive("copr_build_model").and_return(
        flexmock())
    flexmock(CoprBuildEvent).should_receive("get_package_config").and_return(
        pc_build_pr)
    flexmock(CoprBuildJobHelper).should_receive("get_build_check").and_return(
        EXPECTED_BUILD_CHECK_NAME)

    flexmock(CoprBuildEndHandler).should_receive(
        "was_last_build_successful").and_return(True)
    flexmock(GithubProject).should_receive("pr_comment").never()

    flexmock(CoprBuild).should_receive("get_by_build_id").and_return(
        copr_build)
    flexmock(CoprBuild).should_receive("set_status").with_args("success")
    flexmock(CoprBuildDB).should_receive("get_build").and_return({
        "commit_sha":
        "XXXXX",
        "pr_id":
        24,
        "repo_name":
        "hello-world",
        "repo_namespace":
        "packit-service",
        "ref":
        "XXXX",
        "https_url":
        "https://github.com/packit-service/hello-world",
    })

    url = get_log_url(1)
    flexmock(requests).should_receive("get").and_return(requests.Response())
    flexmock(
        requests.Response).should_receive("raise_for_status").and_return(None)

    # check if packit-service set correct PR status
    flexmock(StatusReporter).should_receive("report").with_args(
        state=CommitStatus.success,
        description="RPMs were built successfully.",
        url=url,
        check_names=CoprBuildJobHelper.get_build_check(
            copr_build_end["chroot"]),
    ).once()

    # skip testing farm
    flexmock(CoprBuildJobHelper).should_receive("job_tests").and_return(None)

    steve.process_message(copr_build_end)
    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={})
Example #6
0
def test_copr_build_start(copr_build_start, pc_build, copr_build):
    steve = SteveJobs()
    flexmock(SteveJobs, _is_private=False)
    flexmock(CoprHelper).should_receive("get_copr_client").and_return(
        Client(
            config={
                "copr_url": "https://copr.fedorainfracloud.org",
                "username": "******",
            }))
    flexmock(CoprBuildJobHelper).should_receive("copr_build_model").and_return(
        flexmock())
    flexmock(CoprBuildEvent).should_receive("get_package_config").and_return(
        pc_build)
    flexmock(PRCheckName).should_receive("get_build_check").and_return(
        PACKIT_STG_CHECK)

    flexmock(CoprBuild).should_receive("get_by_build_id").and_return(
        copr_build)
    flexmock(CoprBuildDB).should_receive("get_build").and_return({
        "commit_sha":
        "XXXXX",
        "pr_id":
        24,
        "repo_name":
        "hello-world",
        "repo_namespace":
        "packit-service",
        "ref":
        "XXXX",
        "https_url":
        "https://github.com/packit-service/hello-world",
    })

    url = get_log_url(1)
    flexmock(requests).should_receive("get").and_return(requests.Response())
    flexmock(
        requests.Response).should_receive("raise_for_status").and_return(None)

    flexmock(CoprBuild).should_receive("set_status").with_args(
        "pending").once()
    flexmock(CoprBuild).should_receive("set_build_logs_url")
    # check if packit-service set correct PR status
    flexmock(BuildStatusReporter).should_receive("report").with_args(
        state="pending",
        description="RPM build has started...",
        url=url,
        check_names=PACKIT_STG_CHECK,
    ).once()

    steve.process_message(copr_build_start)
Example #7
0
def test_get_logs(client):
    chroot = "foo-1-x86_64"
    state = "pending"
    build_id = 2

    project = GitProjectModel()
    project.namespace = "john-foo"
    project.repo_name = "bar"

    pr = PullRequestModel()
    pr.pr_id = 234
    pr.project = project

    srpm_build = SRPMBuildModel()
    srpm_build.logs = "asd<br>qwe"

    c = CoprBuildModel()
    c.target = chroot
    c.build_id = str(build_id)
    c.srpm_build = srpm_build
    c.status = state
    c.web_url = (
        "https://copr.fedorainfracloud.org/coprs/john-foo-bar/john-foo-bar/build/2/"
    )
    c.build_logs_url = "https://localhost:5000/build/2/foo-1-x86_64/logs"

    flexmock(CoprBuildModel).should_receive("get_by_id").and_return(c)
    flexmock(CoprBuildModel).should_receive("get_project").and_return(project)
    flexmock(CoprBuildModel).should_receive("job_trigger").and_return(
        flexmock(get_trigger_object=lambda: pr))

    url = f"/copr-build/1/logs"
    logs_url = get_log_url(1)
    assert logs_url.endswith(url)

    resp = client.get(url)
    expected = (
        "<html><head>"
        f"<title>Build {project.namespace}/{project.repo_name}:"
        f" PR #{pr.pr_id}</title></head><body>"
        f"COPR Build ID: {c.build_id}<br>"
        f"State: {c.status}<br><br>"
        f'Build web interface URL: <a href="{c.web_url}">{c.web_url}</a><br>'
        f'Build logs: <a href="{c.build_logs_url}">{c.build_logs_url}</a><br>'
        "SRPM creation logs:<br><br>"
        f"<pre>{c.srpm_build.logs}</pre>"
        "<br></body></html>")
    assert resp.data == expected.encode()
Example #8
0
def test_get_logs(client):
    chroot = "foo-1-x86_64"
    state = "pending"
    build_id = 2

    project = GitProject()
    project.namespace = "john-foo"
    project.repo_name = "bar"

    pr = PullRequest()
    pr.pr_id = 234
    pr.project = project

    srpm_build = SRPMBuild()
    srpm_build.logs = "asd<br>qwe"

    web_url = get_copr_build_url_for_values(project.namespace,
                                            project.repo_name, build_id)
    c = CoprBuild()
    c.target = chroot
    c.build_id = str(build_id)
    c.srpm_build = srpm_build
    c.status = state
    c.web_url = web_url
    c.build_logs_url = "https://localhost:5000/build/2/foo-1-x86_64/logs"
    c.pr = pr

    flexmock(CoprBuild).should_receive("get_by_id").and_return(c)

    url = f"/copr-build/1/logs"
    logs_url = get_log_url(1)
    assert logs_url.endswith(url)

    resp = client.get(url)
    expected = (
        "<html><head>"
        f"<title>Build {c.pr.project.namespace}/{c.pr.project.repo_name}"
        f" #{c.pr.pr_id}</title></head><body>"
        f"COPR Build ID: {c.build_id}<br>"
        f"State: {c.status}<br><br>"
        f'Build web interface URL: <a href="{c.web_url}">{c.web_url}</a><br>'
        f'Build logs: <a href="{c.build_logs_url}">{c.build_logs_url}</a><br>'
        "SRPM creation logs:<br><br>"
        f"<pre>{c.srpm_build.logs}</pre>"
        "<br></body></html>")
    assert resp.data == expected.encode()
    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})

        if build_pg:
            url = get_log_url(build_pg.id)
            build_pg.set_status("pending")
            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=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})
def test_copr_build_end(copr_build_end, pc_build_pr, copr_build_pr,
                        pc_comment_pr_succ, pr_comment_called):
    steve = SteveJobs()
    flexmock(SteveJobs, _is_private=False)
    flexmock(CoprHelper).should_receive("get_copr_client").and_return(
        Client(
            config={
                "copr_url": "https://copr.fedorainfracloud.org",
                "username": "******",
            }))
    pc_build_pr.notifications.pull_request.successful_build = pc_comment_pr_succ
    flexmock(CoprBuildEvent).should_receive("get_package_config").and_return(
        pc_build_pr)
    flexmock(CoprBuildEndHandler).should_receive(
        "was_last_build_successful").and_return(False)
    if pr_comment_called:
        flexmock(GithubProject).should_receive("pr_comment")
    else:
        flexmock(GithubProject).should_receive("pr_comment").never()

    flexmock(CoprBuildModel).should_receive("get_by_build_id").and_return(
        copr_build_pr)
    copr_build_pr.should_receive("set_status").with_args("success")
    url = get_log_url(1)
    flexmock(requests).should_receive("get").and_return(requests.Response())
    flexmock(
        requests.Response).should_receive("raise_for_status").and_return(None)
    # check if packit-service set correct PR status
    flexmock(StatusReporter).should_receive("report").with_args(
        state=CommitStatus.success,
        description="RPMs were built successfully.",
        url=url,
        check_names=CoprBuildJobHelper.get_build_check(
            copr_build_end["chroot"]),
    ).once()

    # skip testing farm
    flexmock(CoprBuildJobHelper).should_receive("job_tests").and_return(None)

    steve.process_message(copr_build_end)
    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={})
Example #12
0
def test_copr_build_end_failed_testing_farm_no_json(copr_build_end,
                                                    copr_build):
    steve = SteveJobs()
    flexmock(SteveJobs, _is_private=False)
    flexmock(CoprHelper).should_receive("get_copr_client").and_return(
        Client(
            config={
                "copr_url": "https://copr.fedorainfracloud.org",
                "username": "******",
            }))
    flexmock(CoprBuildJobHelper).should_receive("job_owner").and_return(
        "some-owner")
    flexmock(CoprBuildJobHelper).should_receive("copr_build_model").and_return(
        flexmock())
    config = PackageConfig(jobs=[
        JobConfig(
            type=JobType.copr_build,
            trigger=JobConfigTriggerType.pull_request,
            metadata={"targets": ["fedora-rawhide"]},
        ),
        JobConfig(
            type=JobType.tests,
            trigger=JobConfigTriggerType.pull_request,
            metadata={"targets": ["fedora-rawhide"]},
        ),
    ])

    flexmock(CoprBuildEvent).should_receive("get_package_config").and_return(
        config)
    flexmock(GithubTestingFarmHandler).should_receive(
        "get_package_config_from_repo").and_return(config)
    flexmock(CoprBuildEndHandler).should_receive(
        "was_last_build_successful").and_return(False)
    flexmock(GithubProject).should_receive("pr_comment")

    flexmock(LocalProject).should_receive("refresh_the_arguments").and_return(
        None)

    flexmock(CoprBuild).should_receive("get_by_build_id").and_return(
        copr_build)
    flexmock(CoprBuild).should_receive("set_status").with_args("success")
    flexmock(CoprBuildDB).should_receive("get_build").and_return({
        "commit_sha":
        "XXXXX",
        "pr_id":
        24,
        "repo_name":
        "hello-world",
        "repo_namespace":
        "packit-service",
        "ref":
        "XXXX",
        "https_url":
        "https://github.com/packit-service/hello-world",
    })

    url = get_log_url(1)
    flexmock(requests).should_receive("get").and_return(requests.Response())
    flexmock(
        requests.Response).should_receive("raise_for_status").and_return(None)
    # check if packit-service set correct PR status
    flexmock(StatusReporter).should_receive("report").with_args(
        state=CommitStatus.success,
        description="RPMs were built successfully.",
        url=url,
        check_names=EXPECTED_BUILD_CHECK_NAME,
    ).once()

    flexmock(StatusReporter).should_receive("report").with_args(
        state=CommitStatus.pending,
        description="RPMs were built successfully.",
        url=url,
        check_names=EXPECTED_TESTING_FARM_CHECK_NAME,
    ).once()

    flexmock(TestingFarmJobHelper).should_receive(
        "send_testing_farm_request").and_return(
            RequestResponse(
                status_code=400,
                ok=False,
                content="some text error".encode(),
                reason="some text error",
                json=None,
            ))

    flexmock(CoprBuild).should_receive("set_status").with_args("failure")
    flexmock(StatusReporter).should_receive("report").with_args(
        state=CommitStatus.pending,
        description="Build succeeded. Submitting the tests ...",
        check_names=EXPECTED_TESTING_FARM_CHECK_NAME,
        url="",
    ).once()
    flexmock(StatusReporter).should_receive("report").with_args(
        state=CommitStatus.failure,
        description="Failed to submit tests: some text error",
        check_names=EXPECTED_TESTING_FARM_CHECK_NAME,
        url="",
    ).once()

    steve.process_message(copr_build_end)
    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 = 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})

        url = get_log_url(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."
            self.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 (self.build_job_helper.job_build
                and self.build_job_helper.job_build.trigger
                == JobConfigTriggerType.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.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={})
Example #14
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={})
def test_copr_build_end_failed_testing_farm_no_json(copr_build_end,
                                                    copr_build_pr):
    steve = SteveJobs()
    flexmock(SteveJobs, _is_private=False)
    flexmock(CoprHelper).should_receive("get_copr_client").and_return(
        Client(
            config={
                "copr_url": "https://copr.fedorainfracloud.org",
                "username": "******",
            }))
    flexmock(TestingFarmJobHelper).should_receive("job_owner").and_return(
        "some-owner")
    flexmock(TestingFarmJobHelper).should_receive("job_project").and_return(
        "foo-bar-123-stg")
    config = PackageConfig(jobs=[
        JobConfig(
            type=JobType.copr_build,
            trigger=JobConfigTriggerType.pull_request,
            metadata=JobMetadataConfig(targets=["fedora-rawhide"]),
        ),
        JobConfig(
            type=JobType.tests,
            trigger=JobConfigTriggerType.pull_request,
            metadata=JobMetadataConfig(targets=["fedora-rawhide"]),
        ),
    ])

    flexmock(CoprBuildEvent).should_receive("get_package_config").and_return(
        config)
    flexmock(GithubTestingFarmHandler).should_receive(
        "get_package_config_from_repo").and_return(config)
    flexmock(CoprBuildEndHandler).should_receive(
        "was_last_build_successful").and_return(False)
    flexmock(GithubProject).should_receive("pr_comment")

    flexmock(LocalProject).should_receive("refresh_the_arguments").and_return(
        None)

    flexmock(CoprBuildModel).should_receive("get_by_build_id").and_return(
        copr_build_pr)
    copr_build_pr.should_receive("set_status").with_args("success")
    url = get_log_url(1)
    flexmock(requests).should_receive("get").and_return(requests.Response())
    flexmock(
        requests.Response).should_receive("raise_for_status").and_return(None)
    # check if packit-service set correct PR status
    flexmock(StatusReporter).should_receive("report").with_args(
        state=CommitStatus.success,
        description="RPMs were built successfully.",
        url=url,
        check_names=EXPECTED_BUILD_CHECK_NAME,
    ).once()

    flexmock(StatusReporter).should_receive("report").with_args(
        state=CommitStatus.pending,
        description="RPMs were built successfully.",
        url=url,
        check_names=EXPECTED_TESTING_FARM_CHECK_NAME,
    ).once()

    flexmock(TestingFarmJobHelper).should_receive(
        "send_testing_farm_request").and_return(
            RequestResponse(
                status_code=400,
                ok=False,
                content="some text error".encode(),
                reason="some text error",
                json=None,
            ))

    flexmock(CoprBuildModel).should_receive("set_status").with_args("failure")
    flexmock(StatusReporter).should_receive("report").with_args(
        state=CommitStatus.pending,
        description="Build succeeded. Submitting the tests ...",
        check_names=EXPECTED_TESTING_FARM_CHECK_NAME,
        url="",
    ).once()
    flexmock(StatusReporter).should_receive("report").with_args(
        state=CommitStatus.failure,
        description="Failed to submit tests: some text error",
        check_names=EXPECTED_TESTING_FARM_CHECK_NAME,
        url="",
    ).once()

    trigger = flexmock(
        job_config_trigger_type=JobConfigTriggerType.pull_request,
        job_trigger_model_type=JobTriggerModelType.pull_request,
    )
    flexmock(CoprBuildEvent).should_receive("db_trigger").and_return(trigger)

    tft_test_run_model = flexmock()
    tft_test_run_model.should_receive("set_status").with_args(
        TestingFarmResult.error).and_return().once()
    pipeline_id = "5e8079d8-f181-41cf-af96-28e99774eb68"
    flexmock(uuid).should_receive("uuid4").and_return(uuid.UUID(pipeline_id))
    flexmock(TFTTestRunModel).should_receive("create").with_args(
        pipeline_id=pipeline_id,
        commit_sha="0011223344",
        status=TestingFarmResult.new,
        target="fedora-rawhide-x86_64",
        trigger_model=trigger,
        web_url=None,
    ).and_return(tft_test_run_model)

    steve.process_message(copr_build_end)