Add 'push' and 'tag' github webhook events.

Change-Id: Ie7ea0f4e264beac530d8eeda13919342a9c9eb58
Co-Authored-By: Jan Hruban <jan.hruban@gooddata.com>
This commit is contained in:
Wayne 2015-06-11 17:14:13 -07:00 committed by Jesse Keating
parent 40f4004425
commit 1a78c61a48
7 changed files with 131 additions and 6 deletions

View File

@ -120,6 +120,9 @@ following options.
*reopened* - pull request reopened
Additionally a ``push`` event can be configured, with an
associated ``ref`` represented as a regex to match branches or tags.
GitHub Configuration
~~~~~~~~~~~~~~~~~~~~

View File

@ -672,6 +672,22 @@ class FakeGithubConnection(githubconnection.GithubConnection):
self.pull_requests.append(pull_request)
return pull_request
def getPushEvent(self, project, ref, old_rev=None, new_rev=None):
if not old_rev:
old_rev = '00000000000000000000000000000000'
if not new_rev:
new_rev = random_sha1()
name = 'push'
data = {
'ref': ref,
'before': old_rev,
'after': new_rev,
'repository': {
'full_name': project
}
}
return (name, data)
def emitEvent(self, event):
"""Emulates sending the GitHub webhook event to the connection."""
port = self.webapp.server.socket.getsockname()[1]

View File

@ -0,0 +1,29 @@
- pipeline:
name: post
manager: independent
trigger:
github:
- event: push
ref: ^refs/heads/.*$
- pipeline:
name: tag
manager: independent
trigger:
github:
- event: push
ref: ^refs/tags/.*$
- job:
name: project-post
- job:
name: project-tag
- project:
name: org/project
post:
jobs:
- project-post
tag:
jobs:
- project-tag

View File

@ -14,7 +14,7 @@
import logging
from tests.base import ZuulTestCase, simple_layout
from tests.base import ZuulTestCase, simple_layout, random_sha1
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(name)-32s '
@ -51,3 +51,49 @@ class TestGithubDriver(ZuulTestCase):
self.assertEqual(pr.number, zuulvars['change'])
self.assertEqual(pr.head_sha, zuulvars['patchset'])
self.assertEqual(1, len(pr.comments))
@simple_layout('layouts/push-tag-github.yaml', driver='github')
def test_tag_event(self):
self.executor_server.hold_jobs_in_build = True
sha = random_sha1()
self.fake_github.emitEvent(
self.fake_github.getPushEvent('org/project', 'refs/tags/newtag',
new_rev=sha))
self.waitUntilSettled()
build_params = self.builds[0].parameters
self.assertEqual('refs/tags/newtag', build_params['ZUUL_REF'])
self.assertEqual('00000000000000000000000000000000',
build_params['ZUUL_OLDREV'])
self.assertEqual(sha, build_params['ZUUL_NEWREV'])
self.executor_server.hold_jobs_in_build = False
self.executor_server.release()
self.waitUntilSettled()
self.assertEqual('SUCCESS',
self.getJobFromHistory('project-tag').result)
@simple_layout('layouts/push-tag-github.yaml', driver='github')
def test_push_event(self):
self.executor_server.hold_jobs_in_build = True
old_sha = random_sha1()
new_sha = random_sha1()
self.fake_github.emitEvent(
self.fake_github.getPushEvent('org/project', 'refs/heads/master',
old_sha, new_sha))
self.waitUntilSettled()
build_params = self.builds[0].parameters
self.assertEqual('refs/heads/master', build_params['ZUUL_REF'])
self.assertEqual(old_sha, build_params['ZUUL_OLDREV'])
self.assertEqual(new_sha, build_params['ZUUL_NEWREV'])
self.executor_server.hold_jobs_in_build = False
self.executor_server.release()
self.waitUntilSettled()
self.assertEqual('SUCCESS',
self.getJobFromHistory('project-post').result)

View File

@ -71,6 +71,27 @@ class GithubWebhookListener():
self.log.debug('Scheduling github event: {0}'.format(event.type))
self.connection.sched.addEvent(event)
def _event_push(self, request):
body = request.json_body
base_repo = body.get('repository')
event = TriggerEvent()
event.trigger_name = 'github'
event.project_name = base_repo.get('full_name')
event.type = 'push'
event.ref = body.get('ref')
event.oldrev = body.get('before')
event.newrev = body.get('after')
ref_parts = event.ref.split('/') # ie, ['refs', 'heads', 'master']
if ref_parts[1] == "heads":
# necessary for the scheduler to match against particular branches
event.branch = ref_parts[2]
return event
def _event_pull_request(self, request):
body = request.json_body
action = body.get('action')
@ -180,17 +201,23 @@ class GithubConnection(BaseConnection):
def getChange(self, event):
"""Get the change representing an event."""
project = self.source.getProject(event.project_name)
if event.change_number:
change = PullRequest(event.project_name)
change.project = self.source.getProject(event.project_name)
change.project = project
change.number = event.change_number
change.refspec = event.refspec
change.branch = event.branch
change.url = event.change_url
change.updated_at = self._ghTimestampToDate(event.updated_at)
change.patchset = event.patch_number
elif event.ref:
change = Ref(project)
change.ref = event.ref
change.oldrev = event.oldrev
change.newrev = event.newrev
change.url = self.getGitwebUrl(project, sha=event.newrev)
else:
project = self.source.getProject(event.project_name)
change = Ref(project)
return change

View File

@ -75,7 +75,7 @@ class GithubSource(BaseSource):
def getGitwebUrl(self, project, sha=None):
"""Get the git-web url for a project."""
raise NotImplementedError()
return self.connection.getGitwebUrl(project, sha)
def _ghTimestampToDate(self, timestamp):
return time.strptime(timestamp, '%Y-%m-%dT%H:%M:%SZ')

View File

@ -34,9 +34,11 @@ class GithubTrigger(BaseTrigger):
for trigger in self._toList(trigger_config):
types = trigger.get('event', None)
actions = trigger.get('action')
refs = trigger.get('refs')
f = EventFilter(trigger=self,
types=self._toList(types),
actions=self._toList(actions))
actions=self._toList(actions),
refs=self._toList(refs))
efilters.append(f)
return efilters
@ -51,8 +53,10 @@ def getSchema():
github_trigger = {
v.Required('event'):
toList(v.Any('pull_request')),
toList(v.Any('pull_request',
'push')),
'action': toList(str),
'ref': toList(str),
}
return github_trigger