Add 'push' and 'tag' github webhook events.
Change-Id: Ie7ea0f4e264beac530d8eeda13919342a9c9eb58 Co-Authored-By: Jan Hruban <jan.hruban@gooddata.com>
This commit is contained in:
parent
40f4004425
commit
1a78c61a48
|
@ -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
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue