Configurable SSH access to GitHub

Change-Id: I2ad5b17991d25ec7492d931c069cbcf314dba804
diff --git a/doc/source/connections.rst b/doc/source/connections.rst
index 521e4ed..7b302e9 100644
--- a/doc/source/connections.rst
+++ b/doc/source/connections.rst
@@ -83,6 +83,10 @@
   See `Securing your webhooks
   <https://developer.github.com/webhooks/securing/>`_.
 
+**sshkey**
+  Path to SSH key to use when cloning github repositories.
+  ``sshkey=/home/zuul/.ssh/id_rsa``
+
 SMTP
 ----
 
diff --git a/tests/base.py b/tests/base.py
index 1092c6e..56b1269 100755
--- a/tests/base.py
+++ b/tests/base.py
@@ -736,6 +736,9 @@
     def getGitUrl(self, project):
         return os.path.join(self.upstream_root, str(project))
 
+    def real_getGitUrl(self, project):
+        return super(FakeGithubConnection, self).getGitUrl(project)
+
     def getProjectBranches(self, project):
         """Masks getProjectBranches since we don't have a real github"""
 
diff --git a/tests/fixtures/zuul-github-driver.conf b/tests/fixtures/zuul-github-driver.conf
index b979a3f..b4a85f7 100644
--- a/tests/fixtures/zuul-github-driver.conf
+++ b/tests/fixtures/zuul-github-driver.conf
@@ -15,3 +15,7 @@
 
 [connection github]
 driver=github
+
+[connection github_ssh]
+driver=github
+sshkey=/home/zuul/.ssh/id_rsa
diff --git a/tests/unit/test_github_driver.py b/tests/unit/test_github_driver.py
index c9847b2..1e5f6a6 100644
--- a/tests/unit/test_github_driver.py
+++ b/tests/unit/test_github_driver.py
@@ -110,3 +110,15 @@
 
         self.assertEqual('SUCCESS',
                          self.getJobFromHistory('project-post').result)
+
+    @simple_layout('layouts/basic-github.yaml', driver='github')
+    def test_git_https_url(self):
+        """Test that git_ssh option gives git url with ssh"""
+        url = self.fake_github.real_getGitUrl('org/project')
+        self.assertEqual('https://github.com/org/project', url)
+
+    @simple_layout('layouts/basic-github.yaml', driver='github')
+    def test_git_ssh_url(self):
+        """Test that git_ssh option gives git url with ssh"""
+        url = self.fake_github_ssh.real_getGitUrl('org/project')
+        self.assertEqual('ssh://git@github.com/org/project.git', url)
diff --git a/zuul/driver/github/githubconnection.py b/zuul/driver/github/githubconnection.py
index 18903af..7085bf6 100644
--- a/zuul/driver/github/githubconnection.py
+++ b/zuul/driver/github/githubconnection.py
@@ -182,6 +182,8 @@
     driver_name = 'github'
     log = logging.getLogger("connection.github")
     payload_path = 'payload'
+    git_user = 'git'
+    git_host = 'github.com'
 
     def __init__(self, driver, connection_name, connection_config):
         super(GithubConnection, self).__init__(
@@ -192,6 +194,7 @@
         self._change_cache = {}
         self.projects = {}
         self.source = driver.getSource(self)
+        self._git_ssh = bool(self.connection_config.get('sshkey', None))
 
     def onLoad(self):
         webhook_listener = GithubWebhookListener(self)
@@ -242,11 +245,15 @@
         return change
 
     def getGitUrl(self, project):
-        url = 'https://%s/%s' % ("github.com", project)
+        if self._git_ssh:
+            url = 'ssh://%s@%s/%s.git' % \
+                (self.git_user, self.git_host, project)
+        else:
+            url = 'https://%s/%s' % (self.git_host, project)
         return url
 
     def getGitwebUrl(self, project, sha=None):
-        url = 'https://%s/%s' % ("github.com", project)
+        url = 'https://%s/%s' % (self.git_host, project)
         if sha is not None:
             url += '/commit/%s' % sha
         return url