Пример #1
0
    def _set_pr_labels(self, pr_event, resources):
        required_labels = {
            resource.source.get('label')
            for resource in resources if resource.source.get('label') is not None
        }
        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,
        )
        if github_helper.is_pr_created_by_org_member(pr_number):
            app.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)
        else:
            app.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."
            )
Пример #2
0
    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
Пример #3
0
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)
Пример #4
0
    def _set_pr_labels(self, pr_event, resources):
        required_labels = {
            resource.source.get('label')
            for resource in resources
            if resource.source.get('label') is not None
        }
        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,
        )
        if pr_event.action() is PullRequestAction.OPENED:
            if github_helper.is_pr_created_by_org_member(pr_number):
                app.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)
            else:
                app.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.")
        elif pr_event.action() is PullRequestAction.SYNCHRONIZE:
            sender_login = pr_event.sender()['login']
            if github_helper.is_org_member(organization_name=owner,
                                           user_login=sender_login):
                app.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)
            else:
                app.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'."
                )