Exemplo n.º 1
0
    def handle_pull_request(self):
        if not self.job.metadata.get("targets"):
            logger.error(
                "'targets' value is required in packit config for copr_build job"
            )
        pr_id_int = nested_get(self.event, "number")
        pr_id = str(pr_id_int)

        local_project = LocalProject(git_project=self.project,
                                     pr_id=pr_id,
                                     git_service=self.project.service)
        api = PackitAPI(self.config, self.package_config, local_project)

        default_project_name = f"{self.project.namespace}-{self.project.repo}-{pr_id}"
        owner = self.job.metadata.get("owner") or "packit"
        project = self.job.metadata.get("project") or default_project_name
        commit_sha = nested_get(self.event, "pull_request", "head", "sha")
        r = BuildStatusReporter(self.project, commit_sha)

        try:
            build_id, repo_url = api.run_copr_build(
                owner=owner,
                project=project,
                chroots=self.job.metadata.get("targets"))
        except FailedCreateSRPM:
            r.report("failure", "Failed to create SRPM.")
            return
        timeout = 60 * 60 * 2
        # TODO: document this and enforce int in config
        timeout_config = self.job.metadata.get("timeout")
        if timeout_config:
            timeout = int(timeout_config)
        build_state = api.watch_copr_build(build_id,
                                           timeout,
                                           report_func=r.report)
        if build_state == "succeeded":
            msg = (
                f"Congratulations! The build [has finished]({repo_url})"
                " successfully. :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 {owner}/{project}`\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_int, msg)
Exemplo n.º 2
0
class GithubCoprBuildHandler(JobHandler):
    name = JobType.copr_build
    triggers = [JobTriggerType.pull_request, JobTriggerType.release]

    # We do not support this workflow officially
    # def handle_release(self):
    #     if not self.job.metadata.get("targets"):
    #         logger.error(
    #             "'targets' value is required in packit config for copr_build job"
    #         )
    #     tag_name = self.event["release"]["tag_name"]

    #     local_project = LocalProject(git_project=self.project, ref=tag_name)
    #     api = PackitAPI(self.config, self.package_config, local_project)

    #     build_id, repo_url = api.run_copr_build(
    #         owner=self.job.metadata.get("owner") or "packit",
    #         project=self.job.metadata.get("project")
    #         or f"{self.project.namespace}-{self.project.repo}",
    #         chroots=self.job.metadata.get("targets"),
    #     )

    #     # report
    #     commit_sha = self.project.get_sha_from_tag(tag_name)
    #     r = self.BuildStatusReporter(self.project, commit_sha, build_id, repo_url)
    #     timeout = 60 * 60 * 2
    #     timeout_config = self.job.metadata.get("timeout")
    #     if timeout_config:
    #         timeout = int(timeout_config)
    #     api.watch_copr_build(build_id, timeout, report_func=r.report)

    def handle_pull_request(self):
        if not self.job.metadata.get("targets"):
            logger.error(
                "'targets' value is required in packit config for copr_build job"
            )
        pr_id_int = nested_get(self.event, "number")
        pr_id = str(pr_id_int)

        self.local_project = LocalProject(
            git_project=self.project,
            pr_id=pr_id,
            git_service=self.project.service,
            working_dir=self.config.command_handler_work_dir,
        )
        self.api = PackitAPI(self.config, self.package_config, self.local_project)

        default_project_name = f"{self.project.namespace}-{self.project.repo}-{pr_id}"
        owner = self.job.metadata.get("owner") or "packit"
        project = self.job.metadata.get("project") or default_project_name
        commit_sha = nested_get(self.event, "pull_request", "head", "sha")
        r = BuildStatusReporter(self.project, commit_sha)

        try:
            build_id, repo_url = self.api.run_copr_build(
                owner=owner, project=project, chroots=self.job.metadata.get("targets")
            )
        except SandcastleTimeoutReached:
            msg = "You have reached 10-minute timeout while creating the SRPM."
            self.project.pr_comment(pr_id_int, msg)
            msg = "Timeout reached while creating a SRPM."
            r.report("failure", msg)
            return HandlerResults(success=False, details={"msg": msg})
        except SandcastleCommandFailed as ex:
            max_log_size = 1024 * 16  # is 16KB enough?
            if len(ex.output) > max_log_size:
                output = "Earlier output was truncated\n\n" + ex.output[-max_log_size:]
            else:
                output = ex.output
            msg = (
                "There was an error while creating a SRPM.\n"
                "\nOutput:"
                "\n```\n"
                f"{output}"
                "\n```"
                f"\nReturn code: {ex.rc}"
            )
            self.project.pr_comment(pr_id_int, msg)
            msg = "Failed to create a SRPM."
            r.report("failure", msg)
            return HandlerResults(success=False, details={"msg": msg})
        except FailedCreateSRPM:
            msg = "Failed to create a SRPM."
            r.report("failure", msg)
            return HandlerResults(success=False, details={"msg": msg})
        timeout = 60 * 60 * 2
        # TODO: document this and enforce int in config
        timeout_config = self.job.metadata.get("timeout")
        if timeout_config:
            timeout = int(timeout_config)
        build_state = self.api.watch_copr_build(build_id, timeout, report_func=r.report)
        if build_state == "succeeded":
            msg = (
                f"Congratulations! The build [has finished]({repo_url})"
                " successfully. :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 {owner}/{project}`\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_int, msg)
            return HandlerResults(success=True, details={})

    def run(self) -> HandlerResults:
        if self.triggered_by == JobTriggerType.pull_request:
            return self.handle_pull_request()
        # We do not support this workflow officially
        # elif self.triggered_by == JobTriggerType.release:
        #     self.handle_release()
        else:
            return HandlerResults(
                success=False, details={"msg": f"No handler for {self.triggered_by}"}
            )