.. bb:reporter:: GitHubCommentPush GitHubCommentPush +++++++++++++++++ .. py:currentmodule:: buildbot.plugins.reporters .. code-block:: python from buildbot.plugins import reporters, util context = Interpolate("bb/%(prop:buildername)s") c['services'].append(reporters.GitHubCommentPush(token='githubAPIToken', context=context)) :class:`GitHubCommentPush` publishes a comment on a GitHub PR using `GitHub Review Comments API `_. It requires `txrequests`_ package to allow interaction with GitHub REST API. It requires a GitHub API token in order to operate. By default, the reporter will only comment at the end of a build unless a custom build report generator is supplied. You can create a token from your own `GitHub - Profile - Applications - Register new application `_ or use an external tool to generate one. .. py:class:: GitHubCommentPush(token, context=None, generators=None, baseURL=None, verbose=False) :param string token: Token used for authentication. (can be a :ref:`Secret`) :type context: renderable string :param context: Passed to GitHub to differentiate between statuses. A static string can be passed or :class:`Interpolate` for dynamic substitution. The default context is ``buildbot/%(prop:buildername)s``. :type generators: list of IReportGenerator instances :param generators: A list of report generators that will be used to generate reports to be sent by this reporter. Currently the reporter will consider only the report generated by the first generator. :param string baseURL: Specify the github API endpoint if you work with GitHub Enterprise :param boolean verbose: If True, logs a message for each successful status push Here's a complete example of posting build results as a github comment: .. code-block:: python @util.renderer @defer.inlineCallbacks def getresults(props): all_logs=[] master = props.master steps = yield props.master.data.get( ('builders', props.getProperty('buildername'), 'builds', props.getProperty('buildnumber'), 'steps')) for step in steps: if step['results'] == util.Results.index('failure'): logs = yield master.data.get(("steps", step['stepid'], 'logs')) for l in logs: all_logs.append('Step : {0} Result : {1}'.format( step['name'], util.Results[step['results']])) all_logs.append('```') l['stepname'] = step['name'] l['content'] = yield master.data.get(("logs", l['logid'], 'contents')) step_logs = l['content']['content'].split('\n') include = False for i, sl in enumerate(step_logs): all_logs.append(sl[1:]) all_logs.append('```') return '\n'.join(all_logs) generator = BuildStatusGenerator(message_formatter=MessageFormatterRenderable(getresults)) c['services'].append(GitHubCommentPush(token='githubAPIToken', generators=[generator])) .. _txrequests: https://pypi.python.org/pypi/txrequests