diff --git a/buildtrigger/gitlabhandler.py b/buildtrigger/gitlabhandler.py index 945e88257..83499d033 100644 --- a/buildtrigger/gitlabhandler.py +++ b/buildtrigger/gitlabhandler.py @@ -28,7 +28,7 @@ GITLAB_WEBHOOK_PAYLOAD_SCHEMA = { 'type': 'string', }, 'checkout_sha': { - 'type': 'string', + 'type': ['string', 'null'], }, 'repository': { 'type': 'object', @@ -65,8 +65,7 @@ GITLAB_WEBHOOK_PAYLOAD_SCHEMA = { }, 'required': ['url', 'message', 'timestamp'], }, - 'minItems': 1, - } + }, }, '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) + # 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['commit'] = payload['checkout_sha'] config['ref'] = payload['ref'] diff --git a/test/test_prepare_trigger.py b/test/test_prepare_trigger.py index 79cbe98f1..700ff3717 100644 --- a/test/test_prepare_trigger.py +++ b/test/test_prepare_trigger.py @@ -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.githubhandler import get_transformed_webhook_payload as gh_webhook from buildtrigger.gitlabhandler import get_transformed_webhook_payload as gl_webhook +from buildtrigger.triggerutil import SkipRequestException 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): with open('test/triggerjson/%s.json' % filename) as f: payload = json.loads(f.read()) @@ -349,6 +361,9 @@ class TestPrepareTrigger(unittest.TestCase): 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): expected = { 'commit': u'fb88379ee45de28a0a4590fddcbd8eff8b36026e', diff --git a/test/triggerjson/gitlab_webhook_nocommit.json b/test/triggerjson/gitlab_webhook_nocommit.json new file mode 100644 index 000000000..7d345840b --- /dev/null +++ b/test/triggerjson/gitlab_webhook_nocommit.json @@ -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 + } +} +