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)
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}"} )