Fix Gitlab trigger payload bug when commits is empty
Gitlab will occasionally send trigger payloads with an empty commit list (and a null checkout_ha) for branches that have been deleted. Properly handle that case.
This commit is contained in:
parent
b4dd5ea4dd
commit
c43173576a
3 changed files with 66 additions and 3 deletions
|
@ -28,7 +28,7 @@ GITLAB_WEBHOOK_PAYLOAD_SCHEMA = {
|
||||||
'type': 'string',
|
'type': 'string',
|
||||||
},
|
},
|
||||||
'checkout_sha': {
|
'checkout_sha': {
|
||||||
'type': 'string',
|
'type': ['string', 'null'],
|
||||||
},
|
},
|
||||||
'repository': {
|
'repository': {
|
||||||
'type': 'object',
|
'type': 'object',
|
||||||
|
@ -65,8 +65,7 @@ GITLAB_WEBHOOK_PAYLOAD_SCHEMA = {
|
||||||
},
|
},
|
||||||
'required': ['url', 'message', 'timestamp'],
|
'required': ['url', 'message', 'timestamp'],
|
||||||
},
|
},
|
||||||
'minItems': 1,
|
},
|
||||||
}
|
|
||||||
},
|
},
|
||||||
'required': ['ref', 'checkout_sha', 'repository'],
|
'required': ['ref', 'checkout_sha', 'repository'],
|
||||||
}
|
}
|
||||||
|
@ -94,6 +93,11 @@ def get_transformed_webhook_payload(gl_payload, default_branch=None, lookup_user
|
||||||
|
|
||||||
payload = JSONPathDict(gl_payload)
|
payload = JSONPathDict(gl_payload)
|
||||||
|
|
||||||
|
# Check for empty commits. The commits list will be empty if the branch is deleted.
|
||||||
|
commits = payload['commits']
|
||||||
|
if not commits:
|
||||||
|
raise SkipRequestException
|
||||||
|
|
||||||
config = SafeDictSetter()
|
config = SafeDictSetter()
|
||||||
config['commit'] = payload['checkout_sha']
|
config['commit'] = payload['checkout_sha']
|
||||||
config['ref'] = payload['ref']
|
config['ref'] = payload['ref']
|
||||||
|
|
|
@ -8,8 +8,20 @@ from buildtrigger.bitbuckethandler import get_transformed_webhook_payload as bb_
|
||||||
from buildtrigger.bitbuckethandler import get_transformed_commit_info as bb_commit
|
from buildtrigger.bitbuckethandler import get_transformed_commit_info as bb_commit
|
||||||
from buildtrigger.githubhandler import get_transformed_webhook_payload as gh_webhook
|
from buildtrigger.githubhandler import get_transformed_webhook_payload as gh_webhook
|
||||||
from buildtrigger.gitlabhandler import get_transformed_webhook_payload as gl_webhook
|
from buildtrigger.gitlabhandler import get_transformed_webhook_payload as gl_webhook
|
||||||
|
from buildtrigger.triggerutil import SkipRequestException
|
||||||
|
|
||||||
class TestPrepareTrigger(unittest.TestCase):
|
class TestPrepareTrigger(unittest.TestCase):
|
||||||
|
def assertSkipped(self, filename, processor, *args, **kwargs):
|
||||||
|
with open('test/triggerjson/%s.json' % filename) as f:
|
||||||
|
payload = json.loads(f.read())
|
||||||
|
|
||||||
|
nargs = [payload]
|
||||||
|
nargs.extend(args)
|
||||||
|
|
||||||
|
with self.assertRaises(SkipRequestException):
|
||||||
|
processor(*nargs, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
def assertSchema(self, filename, expected, processor, *args, **kwargs):
|
def assertSchema(self, filename, expected, processor, *args, **kwargs):
|
||||||
with open('test/triggerjson/%s.json' % filename) as f:
|
with open('test/triggerjson/%s.json' % filename) as f:
|
||||||
payload = json.loads(f.read())
|
payload = json.loads(f.read())
|
||||||
|
@ -349,6 +361,9 @@ class TestPrepareTrigger(unittest.TestCase):
|
||||||
self.assertSchema('github_webhook_missing', expected, gh_webhook)
|
self.assertSchema('github_webhook_missing', expected, gh_webhook)
|
||||||
|
|
||||||
|
|
||||||
|
def test_gitlab_webhook_nocommit_payload(self):
|
||||||
|
self.assertSkipped('gitlab_webhook_nocommit', gl_webhook)
|
||||||
|
|
||||||
def test_gitlab_webhook_payload_with_lookup(self):
|
def test_gitlab_webhook_payload_with_lookup(self):
|
||||||
expected = {
|
expected = {
|
||||||
'commit': u'fb88379ee45de28a0a4590fddcbd8eff8b36026e',
|
'commit': u'fb88379ee45de28a0a4590fddcbd8eff8b36026e',
|
||||||
|
|
44
test/triggerjson/gitlab_webhook_nocommit.json
Normal file
44
test/triggerjson/gitlab_webhook_nocommit.json
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
{
|
||||||
|
"object_kind": "push",
|
||||||
|
"event_name": "push",
|
||||||
|
"before": "cc66287314cb154c986665a6c29377ef42edee60",
|
||||||
|
"after": "0000000000000000000000000000000000000000",
|
||||||
|
"ref": "refs\/heads\/foobar",
|
||||||
|
"checkout_sha": null,
|
||||||
|
"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": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"total_commits_count": 0,
|
||||||
|
"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