<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def github_api(self, url, *args):
 """ Connect to the given GitHub API URL template by replacing all placeholders with the given parameters and return the decoded JSON result on success. On error, return `None`. :param url: The path to request from the GitHub API. Contains format string placeholders that will be replaced with all additional positional arguments. """

        import requests
        import urllib

        github_api_url = os.environ.get("TRAC_GITHUB_API_URL", "https://api.github.com/")
        formatted_url = github_api_url + url.format(*(urllib.quote(str(x)) for x in args))
        access_token = _config_secret(self.access_token)
        self.log.debug("Hitting GitHub API endpoint %s with user %s", formatted_url, self.username) # pylint: disable=no-member
        results = []
        try:
            has_next = True
            while has_next:
                req = requests.get(formatted_url, auth=(self.username, access_token))
                if req.status_code != 200:
                    try:
                        message = req.json()['message']
                    except Exception: # pylint: disable=broad-except
                        message = req.text
                    self.log.error("Error communicating with GitHub API at {}: {}".format( # pylint: disable=no-member
                        formatted_url, message))
                    return None
                results.extend(req.json())
                has_next = 'next' in req.links
                if has_next:
                    formatted_url = req.links['next']['url']
        except requests.exceptions.ConnectionError as rce:
            self.log.error("Exception while communicating with GitHub API at {}: {}".format( # pylint: disable=no-member
                formatted_url, rce))
            return None
        return results