bot/code_review_bot/report/mail_builderrors.py (51 lines of code) (raw):

# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. import structlog from code_review_bot import taskcluster from code_review_bot.report.base import Reporter logger = structlog.get_logger(__name__) EMAIL_SUBJECT = ( """Code Review bot found {build_errors} build errors on D{phabricator_id}""" ) EMAIL_HEADER = """ # [Code Review bot](https://github.com/mozilla/code-review) found {build_errors} build errors on [D{phabricator_id}]({review_url}) {content}""" class BuildErrorsReporter(Reporter): """ Send an email to the author of the revision in case there are build errors """ def __init__(self, configuration): # Load TC services self.notify = taskcluster.get_service("notify") logger.info("BuildErrorsReporter report enabled.") def publish(self, issues, revision, task_failures, links, reviewers): """ Send an email to the author of the revision """ assert ( revision.phabricator_id and revision.phabricator_phid ), "Revision must have a Phabricator ID and PHID" assert ( "attachments" in revision.diff ), f"Unable to find the commits for revision with phid {revision.phabricator_phid}." attachments = revision.diff["attachments"] if "commits" not in attachments and "commits" not in attachments["commits"]: logger.info( f"Unable to find the commits for revision with phid {revision.phabricator_phid}." ) return build_errors = [issue for issue in issues if issue.is_build_error()] if not build_errors: logger.info("No build errors encountered.") return content = EMAIL_HEADER.format( build_errors=len(build_errors), phabricator_id=revision.phabricator_id, review_url=revision.url, content="\n".join([i.as_error() for i in build_errors]), ) if len(content) > 102400: # Content is 102400 chars max content = content[:102000] + "\n\n... Content max limit reached!" # Get the last commit commit = attachments["commits"]["commits"][-1] if "author" not in commit: logger.info("Unable to find the author for commit.") return logger.info("Send build error email", to=commit["author"]["email"]) # Since we nw know that there is an "author" field we assume that we have "email" self.notify.email( { "address": commit["author"]["email"], "subject": EMAIL_SUBJECT.format( build_errors=len(build_errors), phabricator_id=revision.phabricator_id, ), "content": content, } )