diff --git a/lib/travis/listener/app.rb b/lib/travis/listener/app.rb index ce0b44f..2e6b3c2 100644 --- a/lib/travis/listener/app.rb +++ b/lib/travis/listener/app.rb @@ -179,6 +179,7 @@ def event_details rescue => e error("Error logging payload: #{e.message}") error("Payload causing error: #{decoded_payload}") + error("Original payload causing error: #{payload}") Raven.capture_exception(e) {} end diff --git a/lib/travis/listener/schemas.rb b/lib/travis/listener/schemas.rb index 74beb9f..728e3ef 100644 --- a/lib/travis/listener/schemas.rb +++ b/lib/travis/listener/schemas.rb @@ -18,6 +18,9 @@ module Schemas }, "private" => nil }, + "pusher" => { + "name" => nil, + }, "sender" => { "id" => nil, "login" => nil @@ -48,6 +51,9 @@ module Schemas }, "private" => nil }, + "pusher" => { + "name" => nil, + }, "sender" => { "id" => nil, "login" => nil @@ -62,6 +68,9 @@ module Schemas "login" => nil } }, + "pusher" => { + "name" => nil, + }, "sender" => { "login" => nil } @@ -78,6 +87,9 @@ module Schemas }, "private" => nil }, + "pusher" => { + "name" => nil, + }, "sender" => { "id" => nil, "login" => nil @@ -106,6 +118,9 @@ module Schemas } FALLBACK = { + "pusher" => { + "name" => nil, + }, "sender" => { "id" => nil, "login" => nil @@ -123,32 +138,44 @@ def self.event_details(event_type, payload) head: payload['pull_request']['head']['sha'][0..6], ref: payload['pull_request']['head']['ref'], user: payload['pull_request']['head']['user']['login'], - sender: payload['sender']['login'] + sender: parse_sender_from(payload) } when 'push' { repository: payload["repository"]["full_name"], ref: payload['ref'], head: payload['head_commit'] && payload['head_commit']['id'][0..6], - commits: (payload["commits"] || []).map {|c| c['id'][0..6]}.join(","), - sender: payload['sender']['login'] + commits: (payload["commits"] || []).map {|c| c['id'][0..6]}.join(","), + sender: parse_sender_from(payload) } when 'create', 'delete', 'repository', 'check_run', 'check_suite' { action: payload['action'], repository: payload["repository"]["full_name"], - sender: payload['sender']['login'] + sender: parse_sender_from(payload) } when 'installation', 'installation_repositories' { action: payload['action'], installation: payload["installation"]["account"]["login"], - sender: payload['sender']['login'] + sender: parse_sender_from(payload) } else { } end end + + # Some payloads come in that are missing a `sender` field for one reason + # or another, but they do seem to have a `pusher` field, which has a + # `name` field that is the same as the ['sender']['login'] value. + # + def self.parse_sender_from(payload) + if payload['sender'] + payload['sender']['login'] + else + payload['pusher']['name'] + end + end end end end diff --git a/spec/payloads/push_without_sender.json b/spec/payloads/push_without_sender.json new file mode 100644 index 0000000..a8f9c8e --- /dev/null +++ b/spec/payloads/push_without_sender.json @@ -0,0 +1,168 @@ +{ + "ref": "refs/heads/master", + "before": "f968cca6b2a1cc561424ad3b93d63438b0d7a9d8", + "after": "902ac3c7552760b548e8d1d0f9e4fbfd3a3ea5a5", + "created": false, + "deleted": false, + "forced": false, + "base_ref": null, + "compare": "https://github.com/joshk/sportsmaps.co.nz/compare/f968cca6b2a1...902ac3c75527", + "commits": [ + { + "id": "902ac3c7552760b548e8d1d0f9e4fbfd3a3ea5a5", + "tree_id": "2a5e394af3e29803ffae0e45da1237bc4fb76e9c", + "distinct": true, + "message": "moar ###", + "timestamp": "2018-05-03T18:49:57-07:00", + "url": "https://github.com/joshk/sportsmaps.co.nz/commit/902ac3c7552760b548e8d1d0f9e4fbfd3a3ea5a5", + "author": { + "name": "Josh Kalderimis", + "email": "josh.kalderimis@gmail.com", + "username": "joshk" + }, + "committer": { + "name": "GitHub", + "email": "noreply@github.com", + "username": "web-flow" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.textile" + ] + } + ], + "head_commit": { + "id": "902ac3c7552760b548e8d1d0f9e4fbfd3a3ea5a5", + "tree_id": "2a5e394af3e29803ffae0e45da1237bc4fb76e9c", + "distinct": true, + "message": "moar ###", + "timestamp": "2018-05-03T18:49:57-07:00", + "url": "https://github.com/joshk/sportsmaps.co.nz/commit/902ac3c7552760b548e8d1d0f9e4fbfd3a3ea5a5", + "author": { + "name": "Josh Kalderimis", + "email": "josh.kalderimis@gmail.com", + "username": "joshk" + }, + "committer": { + "name": "GitHub", + "email": "noreply@github.com", + "username": "web-flow" + }, + "added": [ + + ], + "removed": [ + + ], + "modified": [ + "README.textile" + ] + }, + "repository": { + "id": 149532, + "name": "sportsmaps.co.nz", + "full_name": "joshk/sportsmaps.co.nz", + "owner": { + "name": "joshk", + "email": "josh.kalderimis@gmail.com", + "login": "joshk", + "id": 8701, + "avatar_url": "https://avatars2.githubusercontent.com/u/8701?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/joshk", + "html_url": "https://github.com/joshk", + "followers_url": "https://api.github.com/users/joshk/followers", + "following_url": "https://api.github.com/users/joshk/following{/other_user}", + "gists_url": "https://api.github.com/users/joshk/gists{/gist_id}", + "starred_url": "https://api.github.com/users/joshk/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/joshk/subscriptions", + "organizations_url": "https://api.github.com/users/joshk/orgs", + "repos_url": "https://api.github.com/users/joshk/repos", + "events_url": "https://api.github.com/users/joshk/events{/privacy}", + "received_events_url": "https://api.github.com/users/joshk/received_events", + "type": "User", + "site_admin": false + }, + "private": true, + "html_url": "https://github.com/joshk/sportsmaps.co.nz", + "description": "SportsMaps central repo", + "fork": false, + "url": "https://github.com/joshk/sportsmaps.co.nz", + "forks_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/forks", + "keys_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/teams", + "hooks_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/hooks", + "issue_events_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/issues/events{/number}", + "events_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/events", + "assignees_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/assignees{/user}", + "branches_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/branches{/branch}", + "tags_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/tags", + "blobs_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/statuses/{sha}", + "languages_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/languages", + "stargazers_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/stargazers", + "contributors_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/contributors", + "subscribers_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/subscribers", + "subscription_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/subscription", + "commits_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/contents/{+path}", + "compare_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/merges", + "archive_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/downloads", + "issues_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/issues{/number}", + "pulls_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/pulls{/number}", + "milestones_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/milestones{/number}", + "notifications_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/labels{/name}", + "releases_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/releases{/id}", + "deployments_url": "https://api.github.com/repos/joshk/sportsmaps.co.nz/deployments", + "created_at": 1236890990, + "updated_at": "2015-05-21T23:06:01Z", + "pushed_at": 1525398598, + "git_url": "git://github.com/joshk/sportsmaps.co.nz.git", + "ssh_url": "git@github.com:joshk/sportsmaps.co.nz.git", + "clone_url": "https://github.com/joshk/sportsmaps.co.nz.git", + "svn_url": "https://github.com/joshk/sportsmaps.co.nz", + "homepage": "www.sportsmaps.co.nz", + "size": 6724, + "stargazers_count": 2, + "watchers_count": 2, + "language": "Ruby", + "has_issues": true, + "has_projects": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": false, + "forks_count": 0, + "mirror_url": null, + "archived": false, + "open_issues_count": 0, + "license": null, + "forks": 0, + "open_issues": 0, + "watchers": 2, + "default_branch": "master", + "stargazers": 2, + "master_branch": "master" + }, + "pusher": { + "name": "joshk", + "email": "josh.kalderimis@gmail.com" + }, + "installation": { + "id": 151888 + } +} diff --git a/spec/travis/events_spec.rb b/spec/travis/events_spec.rb index 35d7695..688b13f 100644 --- a/spec/travis/events_spec.rb +++ b/spec/travis/events_spec.rb @@ -36,6 +36,12 @@ def create(opts = {}) include_examples 'queues gatekeeper event' end + describe 'a push event missing the `sender` field in the payload' do + let(:type) { 'push_without_sender' } + let(:event) { 'push' } + include_examples 'queues gatekeeper event' + end + describe 'a pull_request event' do let(:type) { 'pull_request' } let(:event) { 'pull_request' }