This repository was used to test if there are timing issues between PRs and the "contents" GH API.
To prove that GH is firing webhooks before the app (or at least the contents API) is ready to deal with merges. IMO the behavior should be that it holds off on the webhook until it can actually give an example of what a merge would look like.
- Run the sinatra app (
bundle exec ruby app.rb
) - In another terminal session, use ngrok to expose a local service (
ngrok http 4567
) - Add the ngrok endpoint as your target for a webhook with pull requests enabled (ex:
http://5d731f3a.ngrok.io/ghevent
as your webhook target) - Modify test-contents for your own repo, and pass in a personal auth token as the first argument. (
./test-contents <personal auth here>
)
- test-contents will create a file, push it to a new branch, and open a PR in a very short period.
- A webhook will fire back to your local ruby service
- It'll post back to the contents API, looking for a Jenkinsfile with the ref of... refs/pull/PRID/merge
- That ref won't exist.
If you add a sleep between when sinatra gets the webhook and when it calls back to GH, then the whole thing will succeed.
Logging from test-contents:
Switched to a new branch 'kHawXd0J8j'
[kHawXd0J8j 51bb421] Adding test file kHawXd0J8j
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 kHawXd0J8j
Counting objects: 2, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 249 bytes | 0 bytes/s, done.
Total 2 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/SpencerMalone/test-repo.git
* [new branch] kHawXd0J8j -> kHawXd0J8j
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 17265 100 17185 100 80 24433 113 --:--:-- --:--:-- --:--:-- 24410
{ "url": "https://api.github.com/repos/SpencerMalone/test-repo/pulls/7", "id": 133828887, "html_url": "https://github.com/SpencerMalone/test-repo/pull/7", "diff_url": "https://github.com/SpencerMalone/test-repo/pull/7.diff", "patch_url": "https://github.com/SpencerMalone/test-repo/pull/7.patch", "issue_url": "https://api.github.com/repos/SpencerMalone/test-repo/issues/7", "number": 7, "state": "open", "locked": false, "title": "Amazing new feature", "user": { "login": "SpencerMalone", "id": 8786752, "avatar_url": "https://avatars1.githubusercontent.com/u/8786752?v=4", "gravatar_id": "", "url": "https://api.github.com/users/SpencerMalone", "html_url": "https://github.com/SpencerMalone", "followers_url": "https://api.github.com/users/SpencerMalone/followers", "following_url": "https://api.github.com/users/SpencerMalone/following{/other_user}", "gists_url": "https://api.github.com/users/SpencerMalone/gists{/gist_id}", "starred_url": "https://api.github.com/users/SpencerMalone/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/SpencerMalone/subscriptions", "organizations_url": "https://api.github.com/users/SpencerMalone/orgs", "repos_url": "https://api.github.com/users/SpencerMalone/repos", "events_url": "https://api.github.com/users/SpencerMalone/events{/privacy}", "received_events_url": "https://api.github.com/users/SpencerMalone/received_events", "type": "User", "site_admin": false }, "body": null, "created_at": "2017-08-02T23:12:10Z", "updated_at": "2017-08-02T23:12:10Z", "closed_at": null, "merged_at": null, "merge_commit_sha": null, "assignee": null, "assignees": [ ], "requested_reviewers": [ ], "milestone": null, "commits_url": "https://api.github.com/repos/SpencerMalone/test-repo/pulls/7/commits", "review_comments_url": "https://api.github.com/repos/SpencerMalone/test-repo/pulls/7/comments", "review_comment_url": "https://api.github.com/repos/SpencerMalone/test-repo/pulls/comments{/number}", "comments_url": "https://api.github.com/repos/SpencerMalone/test-repo/issues/7/comments", "statuses_url": "https://api.github.com/repos/SpencerMalone/test-repo/statuses/51bb42169152fa75cb3829776cdee853b95e472e", "head": { "label": "SpencerMalone:kHawXd0J8j", "ref": "kHawXd0J8j", "sha": "51bb42169152fa75cb3829776cdee853b95e472e", "user": { "login": "SpencerMalone", "id": 8786752, "avatar_url": "https://avatars1.githubusercontent.com/u/8786752?v=4", "gravatar_id": "", "url": "https://api.github.com/users/SpencerMalone", "html_url": "https://github.com/SpencerMalone", "followers_url": "https://api.github.com/users/SpencerMalone/followers", "following_url": "https://api.github.com/users/SpencerMalone/following{/other_user}", "gists_url": "https://api.github.com/users/SpencerMalone/gists{/gist_id}", "starred_url": "https://api.github.com/users/SpencerMalone/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/SpencerMalone/subscriptions", "organizations_url": "https://api.github.com/users/SpencerMalone/orgs", "repos_url": "https://api.github.com/users/SpencerMalone/repos", "events_url": "https://api.github.com/users/SpencerMalone/events{/privacy}", "received_events_url": "https://api.github.com/users/SpencerMalone/received_events", "type": "User", "site_admin": false }, "repo": { "id": 99167653, "name": "test-repo", "full_name": "SpencerMalone/test-repo", "owner": { "login": "SpencerMalone", "id": 8786752, "avatar_url": "https://avatars1.githubusercontent.com/u/8786752?v=4", "gravatar_id": "", "url": "https://api.github.com/users/SpencerMalone", "html_url": "https://github.com/SpencerMalone", "followers_url": "https://api.github.com/users/SpencerMalone/followers", "following_url": "https://api.github.com/users/SpencerMalone/following{/other_user}", "gists_url": "https://api.github.com/users/SpencerMalone/gists{/gist_id}", "starred_url": "https://api.github.com/users/SpencerMalone/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/SpencerMalone/subscriptions", "organizations_url": "https://api.github.com/users/SpencerMalone/orgs", "repos_url": "https://api.github.com/users/SpencerMalone/repos", "events_url": "https://api.github.com/users/SpencerMalone/events{/privacy}", "received_events_url": "https://api.github.com/users/SpencerMalone/received_events", "type": "User", "site_admin": false }, "private": false, "html_url": "https://github.com/SpencerMalone/test-repo", "description": null, "fork": false, "url": "https://api.github.com/repos/SpencerMalone/test-repo", "forks_url": "https://api.github.com/repos/SpencerMalone/test-repo/forks", "keys_url": "https://api.github.com/repos/SpencerMalone/test-repo/keys{/key_id}", "collaborators_url": "https://api.github.com/repos/SpencerMalone/test-repo/collaborators{/collaborator}", "teams_url": "https://api.github.com/repos/SpencerMalone/test-repo/teams", "hooks_url": "https://api.github.com/repos/SpencerMalone/test-repo/hooks", "issue_events_url": "https://api.github.com/repos/SpencerMalone/test-repo/issues/events{/number}", "events_url": "https://api.github.com/repos/SpencerMalone/test-repo/events", "assignees_url": "https://api.github.com/repos/SpencerMalone/test-repo/assignees{/user}", "branches_url": "https://api.github.com/repos/SpencerMalone/test-repo/branches{/branch}", "tags_url": "https://api.github.com/repos/SpencerMalone/test-repo/tags", "blobs_url": "https://api.github.com/repos/SpencerMalone/test-repo/git/blobs{/sha}", "git_tags_url": "https://api.github.com/repos/SpencerMalone/test-repo/git/tags{/sha}", "git_refs_url": "https://api.github.com/repos/SpencerMalone/test-repo/git/refs{/sha}", "trees_url": "https://api.github.com/repos/SpencerMalone/test-repo/git/trees{/sha}", "statuses_url": "https://api.github.com/repos/SpencerMalone/test-repo/statuses/{sha}", "languages_url": "https://api.github.com/repos/SpencerMalone/test-repo/languages", "stargazers_url": "https://api.github.com/repos/SpencerMalone/test-repo/stargazers", "contributors_url": "https://api.github.com/repos/SpencerMalone/test-repo/contributors", "subscribers_url": "https://api.github.com/repos/SpencerMalone/test-repo/subscribers", "subscription_url": "https://api.github.com/repos/SpencerMalone/test-repo/subscription", "commits_url": "https://api.github.com/repos/SpencerMalone/test-repo/commits{/sha}", "git_commits_url": "https://api.github.com/repos/SpencerMalone/test-repo/git/commits{/sha}", "comments_url": "https://api.github.com/repos/SpencerMalone/test-repo/comments{/number}", "issue_comment_url": "https://api.github.com/repos/SpencerMalone/test-repo/issues/comments{/number}", "contents_url": "https://api.github.com/repos/SpencerMalone/test-repo/contents/{+path}", "compare_url": "https://api.github.com/repos/SpencerMalone/test-repo/compare/{base}...{head}", "merges_url": "https://api.github.com/repos/SpencerMalone/test-repo/merges", "archive_url": "https://api.github.com/repos/SpencerMalone/test-repo/{archive_format}{/ref}", "downloads_url": "https://api.github.com/repos/SpencerMalone/test-repo/downloads", "issues_url": "https://api.github.com/repos/SpencerMalone/test-repo/issues{/number}", "pulls_url": "https://api.github.com/repos/SpencerMalone/test-repo/pulls{/number}", "milestones_url": "https://api.github.com/repos/SpencerMalone/test-repo/milestones{/number}", "notifications_url": "https://api.github.com/repos/SpencerMalone/test-repo/notifications{?since,all,participating}", "labels_url": "https://api.github.com/repos/SpencerMalone/test-repo/labels{/name}", "releases_url": "https://api.github.com/repos/SpencerMalone/test-repo/releases{/id}", "deployments_url": "https://api.github.com/repos/SpencerMalone/test-repo/deployments", "created_at": "2017-08-02T22:53:24Z", "updated_at": "2017-08-02T22:53:24Z", "pushed_at": "2017-08-02T23:12:10Z", "git_url": "git://github.com/SpencerMalone/test-repo.git", "ssh_url": "git@github.com:SpencerMalone/test-repo.git", "clone_url": "https://github.com/SpencerMalone/test-repo.git", "svn_url": "https://github.com/SpencerMalone/test-repo", "homepage": null, "size": 0, "stargazers_count": 0, "watchers_count": 0, "language": null, "has_issues": true, "has_projects": true, "has_downloads": true, "has_wiki": true, "has_pages": false, "forks_count": 0, "mirror_url": null, "open_issues_count": 6, "forks": 0, "open_issues": 6, "watchers": 0, "default_branch": "master" } }, "base": { "label": "SpencerMalone:master", "ref": "master", "sha": "b145ec757997ed0eb5ce13287f3c05d52310ce04", "user": { "login": "SpencerMalone", "id": 8786752, "avatar_url": "https://avatars1.githubusercontent.com/u/8786752?v=4", "gravatar_id": "", "url": "https://api.github.com/users/SpencerMalone", "html_url": "https://github.com/SpencerMalone", "followers_url": "https://api.github.com/users/SpencerMalone/followers", "following_url": "https://api.github.com/users/SpencerMalone/following{/other_user}", "gists_url": "https://api.github.com/users/SpencerMalone/gists{/gist_id}", "starred_url": "https://api.github.com/users/SpencerMalone/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/SpencerMalone/subscriptions", "organizations_url": "https://api.github.com/users/SpencerMalone/orgs", "repos_url": "https://api.github.com/users/SpencerMalone/repos", "events_url": "https://api.github.com/users/SpencerMalone/events{/privacy}", "received_events_url": "https://api.github.com/users/SpencerMalone/received_events", "type": "User", "site_admin": false }, "repo": { "id": 99167653, "name": "test-repo", "full_name": "SpencerMalone/test-repo", "owner": { "login": "SpencerMalone", "id": 8786752, "avatar_url": "https://avatars1.githubusercontent.com/u/8786752?v=4", "gravatar_id": "", "url": "https://api.github.com/users/SpencerMalone", "html_url": "https://github.com/SpencerMalone", "followers_url": "https://api.github.com/users/SpencerMalone/followers", "following_url": "https://api.github.com/users/SpencerMalone/following{/other_user}", "gists_url": "https://api.github.com/users/SpencerMalone/gists{/gist_id}", "starred_url": "https://api.github.com/users/SpencerMalone/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/SpencerMalone/subscriptions", "organizations_url": "https://api.github.com/users/SpencerMalone/orgs", "repos_url": "https://api.github.com/users/SpencerMalone/repos", "events_url": "https://api.github.com/users/SpencerMalone/events{/privacy}", "received_events_url": "https://api.github.com/users/SpencerMalone/received_events", "type": "User", "site_admin": false }, "private": false, "html_url": "https://github.com/SpencerMalone/test-repo", "description": null, "fork": false, "url": "https://api.github.com/repos/SpencerMalone/test-repo", "forks_url": "https://api.github.com/repos/SpencerMalone/test-repo/forks", "keys_url": "https://api.github.com/repos/SpencerMalone/test-repo/keys{/key_id}", "collaborators_url": "https://api.github.com/repos/SpencerMalone/test-repo/collaborators{/collaborator}", "teams_url": "https://api.github.com/repos/SpencerMalone/test-repo/teams", "hooks_url": "https://api.github.com/repos/SpencerMalone/test-repo/hooks", "issue_events_url": "https://api.github.com/repos/SpencerMalone/test-repo/issues/events{/number}", "events_url": "https://api.github.com/repos/SpencerMalone/test-repo/events", "assignees_url": "https://api.github.com/repos/SpencerMalone/test-repo/assignees{/user}", "branches_url": "https://api.github.com/repos/SpencerMalone/test-repo/branches{/branch}", "tags_url": "https://api.github.com/repos/SpencerMalone/test-repo/tags", "blobs_url": "https://api.github.com/repos/SpencerMalone/test-repo/git/blobs{/sha}", "git_tags_url": "https://api.github.com/repos/SpencerMalone/test-repo/git/tags{/sha}", "git_refs_url": "https://api.github.com/repos/SpencerMalone/test-repo/git/refs{/sha}", "trees_url": "https://api.github.com/repos/SpencerMalone/test-repo/git/trees{/sha}", "statuses_url": "https://api.github.com/repos/SpencerMalone/test-repo/statuses/{sha}", "languages_url": "https://api.github.com/repos/SpencerMalone/test-repo/languages", "stargazers_url": "https://api.github.com/repos/SpencerMalone/test-repo/stargazers", "contributors_url": "https://api.github.com/repos/SpencerMalone/test-repo/contributors", "subscribers_url": "https://api.github.com/repos/SpencerMalone/test-repo/subscribers", "subscription_url": "https://api.github.com/repos/SpencerMalone/test-repo/subscription", "commits_url": "https://api.github.com/repos/SpencerMalone/test-repo/commits{/sha}", "git_commits_url": "https://api.github.com/repos/SpencerMalone/test-repo/git/commits{/sha}", "comments_url": "https://api.github.com/repos/SpencerMalone/test-repo/comments{/number}", "issue_comment_url": "https://api.github.com/repos/SpencerMalone/test-repo/issues/comments{/number}", "contents_url": "https://api.github.com/repos/SpencerMalone/test-repo/contents/{+path}", "compare_url": "https://api.github.com/repos/SpencerMalone/test-repo/compare/{base}...{head}", "merges_url": "https://api.github.com/repos/SpencerMalone/test-repo/merges", "archive_url": "https://api.github.com/repos/SpencerMalone/test-repo/{archive_format}{/ref}", "downloads_url": "https://api.github.com/repos/SpencerMalone/test-repo/downloads", "issues_url": "https://api.github.com/repos/SpencerMalone/test-repo/issues{/number}", "pulls_url": "https://api.github.com/repos/SpencerMalone/test-repo/pulls{/number}", "milestones_url": "https://api.github.com/repos/SpencerMalone/test-repo/milestones{/number}", "notifications_url": "https://api.github.com/repos/SpencerMalone/test-repo/notifications{?since,all,participating}", "labels_url": "https://api.github.com/repos/SpencerMalone/test-repo/labels{/name}", "releases_url": "https://api.github.com/repos/SpencerMalone/test-repo/releases{/id}", "deployments_url": "https://api.github.com/repos/SpencerMalone/test-repo/deployments", "created_at": "2017-08-02T22:53:24Z", "updated_at": "2017-08-02T22:53:24Z", "pushed_at": "2017-08-02T23:12:10Z", "git_url": "git://github.com/SpencerMalone/test-repo.git", "ssh_url": "git@github.com:SpencerMalone/test-repo.git", "clone_url": "https://github.com/SpencerMalone/test-repo.git", "svn_url": "https://github.com/SpencerMalone/test-repo", "homepage": null, "size": 0, "stargazers_count": 0, "watchers_count": 0, "language": null, "has_issues": true, "has_projects": true, "has_downloads": true, "has_wiki": true, "has_pages": false, "forks_count": 0, "mirror_url": null, "open_issues_count": 6, "forks": 0, "open_issues": 6, "watchers": 0, "default_branch": "master" } }, "_links": { "self": { "href": "https://api.github.com/repos/SpencerMalone/test-repo/pulls/7" }, "html": { "href": "https://github.com/SpencerMalone/test-repo/pull/7" }, "issue": { "href": "https://api.github.com/repos/SpencerMalone/test-repo/issues/7" }, "comments": { "href": "https://api.github.com/repos/SpencerMalone/test-repo/issues/7/comments" }, "review_comments": { "href": "https://api.github.com/repos/SpencerMalone/test-repo/pulls/7/comments" }, "review_comment": { "href": "https://api.github.com/repos/SpencerMalone/test-repo/pulls/comments{/number}" }, "commits": { "href": "https://api.github.com/repos/SpencerMalone/test-repo/pulls/7/commits" }, "statuses": { "href": "https://api.github.com/repos/SpencerMalone/test-repo/statuses/51bb42169152fa75cb3829776cdee853b95e472e" } }, "merged": false, "mergeable": null, "rebaseable": null, "mergeable_state": "unknown", "merged_by": null, "comments": 0, "review_comments": 0, "maintainer_can_modify": false, "commits": 9, "additions": 0, "deletions": 0, "changed_files": 9 }
Logging from app.rb after receiving webhook for PR #7:
- -> /ghevent
{"message":"No commit found for the ref refs/pull/7/merge","documentation_url":"https://developer.github.com/v3/repos/contents/"}
192.30.252.42 - - [02/Aug/2017:19:12:11 -0400] "POST /ghevent HTTP/1.1" 204 - 0.1417
localhost - - [02/Aug/2017:19:12:11 EDT] "POST /ghevent HTTP/1.1" 204 0