Fix handling of Gitlab payloads with multiple commits
Gitlab sends multiple commits in the order reversed from Github. As this only broke recently, I suspect that they may have changed the ordering. This change makes the code order-agnostic to hopefully remove the problem going forward. Fixes #1900
This commit is contained in:
parent
c43173576a
commit
26e8e241da
3 changed files with 143 additions and 4 deletions
|
@ -104,13 +104,24 @@ def get_transformed_webhook_payload(gl_payload, default_branch=None, lookup_user
|
||||||
config['default_branch'] = default_branch
|
config['default_branch'] = default_branch
|
||||||
config['git_url'] = payload['repository.git_ssh_url']
|
config['git_url'] = payload['repository.git_ssh_url']
|
||||||
|
|
||||||
config['commit_info.url'] = payload['commits[0].url']
|
# Find the commit associated with the checkout_sha. Gitlab doesn't (necessary) send this in
|
||||||
config['commit_info.message'] = payload['commits[0].message']
|
# any order, so we cannot simply index into the commits list.
|
||||||
config['commit_info.date'] = payload['commits[0].timestamp']
|
found_commit = None
|
||||||
|
for commit in commits:
|
||||||
|
if commit['id'] == payload['checkout_sha']:
|
||||||
|
found_commit = JSONPathDict(commit)
|
||||||
|
break
|
||||||
|
|
||||||
|
if found_commit is None:
|
||||||
|
raise SkipRequestException
|
||||||
|
|
||||||
|
config['commit_info.url'] = found_commit['url']
|
||||||
|
config['commit_info.message'] = found_commit['message']
|
||||||
|
config['commit_info.date'] = found_commit['timestamp']
|
||||||
|
|
||||||
# Note: Gitlab does not send full user information with the payload, so we have to
|
# Note: Gitlab does not send full user information with the payload, so we have to
|
||||||
# (optionally) look it up.
|
# (optionally) look it up.
|
||||||
author_email = payload['commits[0].author.email']
|
author_email = found_commit['author.email']
|
||||||
if lookup_user and author_email:
|
if lookup_user and author_email:
|
||||||
author_info = lookup_user(author_email)
|
author_info = lookup_user(author_email)
|
||||||
if author_info:
|
if author_info:
|
||||||
|
|
|
@ -364,6 +364,34 @@ class TestPrepareTrigger(unittest.TestCase):
|
||||||
def test_gitlab_webhook_nocommit_payload(self):
|
def test_gitlab_webhook_nocommit_payload(self):
|
||||||
self.assertSkipped('gitlab_webhook_nocommit', gl_webhook)
|
self.assertSkipped('gitlab_webhook_nocommit', gl_webhook)
|
||||||
|
|
||||||
|
|
||||||
|
def test_gitlab_webhook_multiple_commits(self):
|
||||||
|
expected = {
|
||||||
|
'commit': u'9a052a0b2fbe01d4a1a88638dd9fe31c1c56ef53',
|
||||||
|
'ref': u'refs/heads/master',
|
||||||
|
'git_url': u'git@gitlab.com:joseph.schorr/some-test-project.git',
|
||||||
|
'commit_info': {
|
||||||
|
'url': u'https://gitlab.com/joseph.schorr/some-test-project/commit/9a052a0b2fbe01d4a1a88638dd9fe31c1c56ef53',
|
||||||
|
'date': u'2016-09-29T15:02:41+00:00',
|
||||||
|
'message': u"Merge branch 'foobar' into 'master'\r\n\r\nAdd changelog\r\n\r\nSome merge thing\r\n\r\nSee merge request !1",
|
||||||
|
'author': {
|
||||||
|
'username': 'josephschorr',
|
||||||
|
'url': 'http://gitlab.com/josephschorr',
|
||||||
|
'avatar_url': 'http://some/avatar/url'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
def lookup_user(_):
|
||||||
|
return {
|
||||||
|
'username': 'josephschorr',
|
||||||
|
'html_url': 'http://gitlab.com/josephschorr',
|
||||||
|
'avatar_url': 'http://some/avatar/url',
|
||||||
|
}
|
||||||
|
|
||||||
|
self.assertSchema('gitlab_webhook_multicommit', expected, gl_webhook, lookup_user=lookup_user)
|
||||||
|
|
||||||
|
|
||||||
def test_gitlab_webhook_payload_with_lookup(self):
|
def test_gitlab_webhook_payload_with_lookup(self):
|
||||||
expected = {
|
expected = {
|
||||||
'commit': u'fb88379ee45de28a0a4590fddcbd8eff8b36026e',
|
'commit': u'fb88379ee45de28a0a4590fddcbd8eff8b36026e',
|
||||||
|
|
100
test/triggerjson/gitlab_webhook_multicommit.json
Normal file
100
test/triggerjson/gitlab_webhook_multicommit.json
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
{
|
||||||
|
"object_kind": "push",
|
||||||
|
"event_name": "push",
|
||||||
|
"before": "0da5b5ebb397f0a8569c97f28e266c718607e8da",
|
||||||
|
"after": "9a052a0b2fbe01d4a1a88638dd9fe31c1c56ef53",
|
||||||
|
"ref": "refs\/heads\/master",
|
||||||
|
"checkout_sha": "9a052a0b2fbe01d4a1a88638dd9fe31c1c56ef53",
|
||||||
|
"message": null,
|
||||||
|
"user_id": 750047,
|
||||||
|
"user_name": "Joseph Schorr",
|
||||||
|
"user_email": "joseph.schorr@coreos.com",
|
||||||
|
"user_avatar": "https:\/\/secure.gravatar.com\/avatar\/63e4521c07d2312d8e20c3a6cad36f57?s=80&d=identicon",
|
||||||
|
"project_id": 1756744,
|
||||||
|
"project": {
|
||||||
|
"name": "some-test-project",
|
||||||
|
"description": "",
|
||||||
|
"web_url": "https:\/\/gitlab.com\/joseph.schorr\/some-test-project",
|
||||||
|
"avatar_url": null,
|
||||||
|
"git_ssh_url": "git@gitlab.com:joseph.schorr\/some-test-project.git",
|
||||||
|
"git_http_url": "https:\/\/gitlab.com\/joseph.schorr\/some-test-project.git",
|
||||||
|
"namespace": "joseph.schorr",
|
||||||
|
"visibility_level": 0,
|
||||||
|
"path_with_namespace": "joseph.schorr\/some-test-project",
|
||||||
|
"default_branch": "master",
|
||||||
|
"homepage": "https:\/\/gitlab.com\/joseph.schorr\/some-test-project",
|
||||||
|
"url": "git@gitlab.com:joseph.schorr\/some-test-project.git",
|
||||||
|
"ssh_url": "git@gitlab.com:joseph.schorr\/some-test-project.git",
|
||||||
|
"http_url": "https:\/\/gitlab.com\/joseph.schorr\/some-test-project.git"
|
||||||
|
},
|
||||||
|
"commits": [
|
||||||
|
{
|
||||||
|
"id": "f00a0a6a71118721ac1f586bf79650170042609f",
|
||||||
|
"message": "Add changelog",
|
||||||
|
"timestamp": "2016-09-29T14:59:23+00:00",
|
||||||
|
"url": "https:\/\/gitlab.com\/joseph.schorr\/some-test-project\/commit\/f00a0a6a71118721ac1f586bf79650170042609f",
|
||||||
|
"author": {
|
||||||
|
"name": "Joseph Schorr",
|
||||||
|
"email": "joseph.schorr@coreos.com"
|
||||||
|
},
|
||||||
|
"added": [
|
||||||
|
"CHANGELOG"
|
||||||
|
],
|
||||||
|
"modified": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"removed": [
|
||||||
|
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cc66287314cb154c986665a6c29377ef42edee60",
|
||||||
|
"message": "Add new file",
|
||||||
|
"timestamp": "2016-09-29T15:02:01+00:00",
|
||||||
|
"url": "https:\/\/gitlab.com\/joseph.schorr\/some-test-project\/commit\/cc66287314cb154c986665a6c29377ef42edee60",
|
||||||
|
"author": {
|
||||||
|
"name": "Joseph Schorr",
|
||||||
|
"email": "joseph.schorr@coreos.com"
|
||||||
|
},
|
||||||
|
"added": [
|
||||||
|
"YetAnotherFIle"
|
||||||
|
],
|
||||||
|
"modified": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"removed": [
|
||||||
|
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "9a052a0b2fbe01d4a1a88638dd9fe31c1c56ef53",
|
||||||
|
"message": "Merge branch 'foobar' into 'master'\r\n\r\nAdd changelog\r\n\r\nSome merge thing\r\n\r\nSee merge request !1",
|
||||||
|
"timestamp": "2016-09-29T15:02:41+00:00",
|
||||||
|
"url": "https:\/\/gitlab.com\/joseph.schorr\/some-test-project\/commit\/9a052a0b2fbe01d4a1a88638dd9fe31c1c56ef53",
|
||||||
|
"author": {
|
||||||
|
"name": "Joseph Schorr",
|
||||||
|
"email": "joseph.schorr@coreos.com"
|
||||||
|
},
|
||||||
|
"added": [
|
||||||
|
"CHANGELOG",
|
||||||
|
"YetAnotherFIle"
|
||||||
|
],
|
||||||
|
"modified": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"removed": [
|
||||||
|
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"total_commits_count": 3,
|
||||||
|
"repository": {
|
||||||
|
"name": "some-test-project",
|
||||||
|
"url": "git@gitlab.com:joseph.schorr\/some-test-project.git",
|
||||||
|
"description": "",
|
||||||
|
"homepage": "https:\/\/gitlab.com\/joseph.schorr\/some-test-project",
|
||||||
|
"git_http_url": "https:\/\/gitlab.com\/joseph.schorr\/some-test-project.git",
|
||||||
|
"git_ssh_url": "git@gitlab.com:joseph.schorr\/some-test-project.git",
|
||||||
|
"visibility_level": 0
|
||||||
|
}
|
||||||
|
}
|
Reference in a new issue