def _set_pr_labels(self, pr_event, resources) -> bool: ''' @ return True if the required label was set ''' required_labels = { resource.source.get('label') for resource in resources if resource.source.get('label') is not None } if not required_labels: return False repo = pr_event.repository() repository_path = repo.repository_path() pr_number = pr_event.number() github_cfg = self.cfg_set.github() owner, name = repository_path.split('/') github_helper = GitHubRepositoryHelper( owner, name, github_cfg=github_cfg, ) sender_login = pr_event.sender()['login'] if pr_event.action() is PullRequestAction.OPENED: if github_helper.is_pr_created_by_org_member(pr_number): logger.info( f"New pull request by member of '{owner}' in '{repository_path}' found. " f"Setting required labels '{required_labels}'.") github_helper.add_labels_to_pull_request( pr_number, *required_labels) return True else: logger.debug( f"New pull request by member in '{repository_path}' found, but creator is not " f"member of '{owner}' - will not set required labels.") github_helper.add_comment_to_pr( pull_request_number=pr_number, comment= (f"Thank you @{sender_login} for your contribution. Before I can start " "building your PR, a member of the organization must set the required " f"label(s) {required_labels}. Once started, you can check the build " "status in the PR checks section below.")) return False elif pr_event.action() is PullRequestAction.SYNCHRONIZE: if github_helper.is_org_member(organization_name=owner, user_login=sender_login): logger.info( f"Update to pull request #{pr_event.number()} by org member '{sender_login}' " f" in '{repository_path}' found. Setting required labels '{required_labels}'." ) github_helper.add_labels_to_pull_request( pr_number, *required_labels) return True else: logger.debug( f"Update to pull request #{pr_event.number()} by '{sender_login}' " f" in '{repository_path}' found. Ignoring, since they are not an org member'." ) return False return False
def validate_pipeline_definitions( cfg_factory, cfg_set: model.ConfigurationSet, whd_cfg: model.webhook_dispatcher.WebhookDispatcherConfig, pr_event: PullRequestEvent, github_helper: GitHubRepositoryHelper, tagging_label: str, ): repo_url = pr_event.repository().repository_url() job_mapping_set = cfg_set.job_mapping() job_mapping = job_mapping_set.job_mapping_for_repo_url(repo_url, cfg_set) pr_number = pr_event.number() try: validate_repository_pipelines( repo_url=pr_event.head_repository().repository_url(), cfg_set=cfg_factory.cfg_set(job_mapping.replication_ctx_cfg_set()), whd_cfg=whd_cfg, branch=pr_event.head_ref(), job_mapping=job_mapping, ) # validation succeeded. Remove the label again, if it is currently set. if tagging_label in pr_event.label_names(): logger.info( f'Pipeline-definition in PR #{pr_number} of repository {repo_url} passed ' 'validation again. Commenting on PR.' ) github_helper.remove_label_from_pull_request(pr_number, tagging_label) github_helper.add_comment_to_pr( pull_request_number=pr_number, comment='The pipeline-definition has been fixed.', ) except concourse.replicator.PipelineValidationError as e: # If validation fails add a comment on the PR iff we haven't already commented, as # tracked by label if tagging_label not in pr_event.label_names(): logger.warning( f'Pipeline-definition in PR #{pr_number} of repository {repo_url} failed ' 'validation. Commenting on PR.' ) github_helper.add_comment_to_pr( pull_request_number=pr_number, comment=( 'This PR proposes changes that would break the pipeline definition:\n' f'```\n{e}\n```\n' ), ) github_helper.add_labels_to_pull_request(pr_number, tagging_label)