{"action":"created","comment":{"url":"https://api.github.com/repos/getcarina/getcarina.com/pulls/comments/60427086","id":60427086,"diff_hunk":"@@ -0,0 +1,239 @@\n+---\n+title: Set up push-based continuous deployment on Docker Swarm\n+author: Jamie Hannaford <jamie.hannaford@rackspace.com>\n+date: 2016-04-18\n+permalink: docs/tutorials/push-based-cd/\n+description: Learn how to set up push-based continuous deployment for your containers on Docker Swarm, using Docker Hub webhooks to automatically re-provision applications using new images.\n+docker-versions:\n+  - 1.10.2\n+  - 1.11.0\n+topics:\n+  - docker\n+  - deployment\n+---\n+![Teufelsberg]({% asset_path push-cd/teufelsberg.jpg %})\n+\n+Continuous Deployment is the process of releasing new versions of software in a\n+reliable and automatic way. Through automation the risk of human error is\n+minimised because manual tasks are replaced by a formalised release\n+process that is predictable and safer. While there exists numerous solutions\n+for continuous deployment on traditional servers and virtual machines, there\n+are not many established solutions in the container landscape yet.\n+\n+In this tutorial you will set up an environment for handling continuous\n+deployment on Docker Swarm. In the process you will:\n+\n+1. set up Automated Builds on Docker Hub for your application\n+2. set up webhooks that are triggered after every build\n+3. deploy a container that monitors those webhooks\n+4. deploy application changes and watch them be deployed across your Swarm cluster\n+\n+### Set up custom Docker image\n+\n+The first step is to ensure you have a git repository hosted either on GitHub or\n+Bitbucket. This is where your application codebase will be stored, as well as\n+the Dockerfile which specifies how your application is packaged in its\n+environment.\n+\n+If you already have a codebase and Dockerfile in Github or Bitbucket, please\n+go straight to [Set up Automated builds](#set-up-automated-builds).\n+\n+If not, you will now create a test application and push it to GitHub. In order\n+to keep this tutorial simple, we will use a minimal Dockerfile that extends\n+the base Python 3 Docker image and runs a Flask app. Later we will add more\n+logic to simulate codebase/feature changes and then release it.\n+\n+Go to the [Carina examples repository](https://github.com/getcarina/examples)\n+and fork it. If you are unsure how to do this, consult [GitHub's documentation](https://help.github.com/articles/fork-a-repo/).\n+\n+### Set up Automated Builds\n+\n+An Automated Build allows you to build your Docker images automatically from a\n+build context stored in a repository. A build context is a Dockerfile and any\n+files at a specific location. Automated Builds are supported for both public and\n+private Docker Hub repositories on both GitHub and Bitbucket.\n+\n+To set up an Automated Build, follow these steps:\n+\n+1. Sign into Docker Hub\n+2. Click on the \"Create\" dropdown link in the top right corner. It will be to\n+   the left of your username.\n+3. Click on \"Create Automated Build\"\n+4. Click on the \"Create Auto-build GitHub\" button\n+5. Select your GitHub username from the left column and the name of your\n+   repository from the right column (such as ``examples``)\n+6. Specify ``hello-world-app`` as the Image name, add a short description,\n+   and click the \"Create\" button\n+7. Go to Build Settings\n+8. In the master branch row, specify ``/hello-world-app`` for the Dockerfile\n+   location. Click \"Save Changes\"\n+9. Click \"Trigger\" to initiate the first build\n+\n+### Deploy applications\n+\n+You now need to deploy your application of choice. If you have an existing\n+codebase which you want to deploy, you will need to handle this step by\n+yourself, since you are already aware of how to run and deploy it.\n+\n+If you forked the Carina Examples repository in the first step, you can\n+deploy the Flask app by using the following commands:\n+\n+```\n+$ export DOCKER_HUB_USERNAME=<dockerHubUsername>\n+$ docker run --detach --name app1 --publish 8001:5000 $DOCKER_HUB_USERNAME/hello-world-app\n+$ docker run --detach --name app2 --publish 8002:5000 $DOCKER_HUB_USERNAME/hello-world-app\n+```\n+\n+Be sure to replace `<dockerHubUsername>` with your Docker Hub username.\n+\n+### Run wiretap\n+\n+The next step is to deploy wiretap, a web server that listens out for Docker Hub\n+notifications and re-deploys containers once their underlying image is updated.\n+\n+First, generate a secret by running something like:\n+\n+```\n+$ export SECRET=$(date | shasum | head -c 40)\n+```\n+\n+or\n+\n+```\n+$ export SECRET=$(openssl rand -hex 20)\n+```\n+\n+Your secret **needs to be URL-friendly**, so please avoid including characters\n+that require encoding and decoding. This value will be required for wiretap to\n+accept the incoming request. This prevents abuse and provides a basic level of\n+authorization. Now deploy the container itself:\n+\n+```\n+$ docker run --detach \\\n+  --name wiretap \\\n+  --publish 8000:8000 \\\n+  --volumes-from swarm-data \\\n+  --env TOKEN=$SECRET \\\n+  --env DOCKER_CERT_PATH=/etc/docker/cert.pem \\\n+  --env DOCKER_CA_CERT_PATH=/etc/docker/ca.pem \\\n+  --env DOCKER_KEY_PATH=/etc/docker/key.pem \\\n+  carina/wiretap\n+```\n+\n+Finally, save the webhook URL for your wiretap container:\n+\n+```\n+$ export WEBHOOK_URL=http://$(docker port wiretap 8000)/listen?token=$SECRET\n+$ echo $WEBHOOK_URL\n+http://1.2.3.4:8000/listen?token=Y4eNUiPzO4NRX5d35R6tkUokd6FFY1EbWVW1Ad39\n+```\n+\n+### Set up the Docker Hub webhook\n+\n+Webhooks are user-defined HTTP callbacks and are usually triggered by some event,\n+such as pushing code to a repository. When that event occurs, the source site\n+makes an HTTP request to the URI configured for the webhook. Users can\n+configure them to cause events on one site to invoke behaviour on another.\n+\n+Docker Hub allows you to configure webhooks that will be triggered every time\n+code is pushed to your GitHub or Bitbucket repository. To do so:\n+\n+1. Go to the Webhooks page for your image on Docker Hub\n+2. Click on the button underneath \"Create a Webhook\"\n+3. Specify ``wiretap`` for the Webhook name, and paste the value of\n+   ``$WEBHOOK_URL`` from the previous step as the Webhook URL\n+4. Click \"Save\"\n+\n+### Push code changes to Github\n+\n+If you are running your own custom application, now is the time to commit\n+new functionality and push to your upstream VCS repository's master branch.\n+\n+Otherwise, in order to simulate a new feature being released, you will add a\n+new API operation to your Flask app. The new operation will allow users to\n+perform a GET request to query the latest API version.\n+\n+To check that it's not currently implemented, run cURL to ensure you get back\n+a 404:\n+\n+```\n+$ curl $(docker port app1 5000)/version\n+<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n+<title>404 Not Found</title>\n+<h1>Not Found</h1>\n+<p>The requested URL was not found on the server.  If you entered the URL manually please check your spelling and try again.</p>\n+```\n+\n+Check out your Flask application, if you haven't already:\n+\n+```\n+$ git clone https://github.com/getcarina/examples\n+$ cd hello-world-app\n+```\n+\n+Next you will add the following to the ``app.py`` file, below the current\n+``hello`` method (around line 11):\n+\n+```python\n+@app.route('/version')\n+def version():\n+    return '1.1'\n+```\n+\n+Finally, commit the change and push to your master branch:\n+\n+```\n+$ git commit -m \"Adds versioning\" app.py\n+$ git push -u origin master\n+```\n+\n+### Test changes\n+\n+Docker Hub will be notified of your push to GitHub and will build a new\n+Docker Image for your application automatically. Once this build is finished,\n+it will notify wiretap of the changes, allowing it to redeploy any\n+containers running the specified image. You can see that a new image is being\n+built by going to the Build Details page on Docker Hub.\n+\n+You can see this process at work by viewing wiretap's logs:\n+\n+```\n+$ docker logs -f wiretap\n+time=\"2016-04-19T10:55:50Z\" level=info msg=\"Pulling newer image\" Image=\"jamiehannaford/hello-world-app\"\n+time=\"2016-04-19T10:56:23Z\" level=info msg=\"Killing container\" ID=80e3bd1d15fb3512980e52343b8a581f79c074ef77f3b1289b2c1f8917dbc00b Name=app1 Signal=SIGTERM\n+time=\"2016-04-19T10:56:24Z\" level=info msg=\"Removing container\" ID=80e3bd1d15fb3512980e52343b8a581f79c074ef77f3b1289b2c1f8917dbc00b\n+time=\"2016-04-19T10:56:25Z\" level=info msg=\"New container created\" ID=7d044a8c7459a54a634e5c47785dbf4fb15a3b9726530c5f26c766a73047ce4d Name=app1\n+time=\"2016-04-19T10:56:25Z\" level=info msg=\"Pulling newer image\" Image=\"jamiehannaford/hello-world-app\"\n+time=\"2016-04-19T10:56:26Z\" level=info msg=\"Killing container\" ID=9cb725e79bd0e164c6f99d481c80684c910610f504cf165a0291bd141485c259 Name=app2 Signal=SIGTERM\n+time=\"2016-04-19T10:56:27Z\" level=info msg=\"Removing container\" ID=9cb725e79bd0e164c6f99d481c80684c910610f504cf165a0291bd141485c259\n+time=\"2016-04-19T10:56:27Z\" level=info msg=\"New container created\" ID=cef70e8101b3303f35af885532ffac7a83805389dc2b55452fb9c26f0c091333 Name=app2\n+```\n+\n+We can see that wiretap has been notified and has successfully shut down our two applications\n+and redeployed them using a new image. To test that our new feature is live, we can run\n+cURL again:\n+\n+```\n+$ curl \"$(docker port app1 5000)/version\"\n+1.1\n+```","path":"_tutorials/2016-04-18-push-cd.md","position":219,"original_position":219,"commit_id":"080b99a0bf1d7203bfd778f9e7f6fb6869f7b183","original_commit_id":"080b99a0bf1d7203bfd778f9e7f6fb6869f7b183","user":{"login":"everett-toews","id":634901,"avatar_url":"https://avatars.githubusercontent.com/u/634901?v=3","gravatar_id":"","url":"https://api.github.com/users/everett-toews","html_url":"https://github.com/everett-toews","followers_url":"https://api.github.com/users/everett-toews/followers","following_url":"https://api.github.com/users/everett-toews/following{/other_user}","gists_url":"https://api.github.com/users/everett-toews/gists{/gist_id}","starred_url":"https://api.github.com/users/everett-toews/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/everett-toews/subscriptions","organizations_url":"https://api.github.com/users/everett-toews/orgs","repos_url":"https://api.github.com/users/everett-toews/repos","events_url":"https://api.github.com/users/everett-toews/events{/privacy}","received_events_url":"https://api.github.com/users/everett-toews/received_events","type":"User","site_admin":false},"body":"Should do `curl $(docker port app2 5000)/version` here too. To prove both got updated.","created_at":"2016-04-20T15:14:57Z","updated_at":"2016-04-20T15:14:57Z","html_url":"https://github.com/getcarina/getcarina.com/pull/821#discussion_r60427086","pull_request_url":"https://api.github.com/repos/getcarina/getcarina.com/pulls/821","_links":{"self":{"href":"https://api.github.com/repos/getcarina/getcarina.com/pulls/comments/60427086"},"html":{"href":"https://github.com/getcarina/getcarina.com/pull/821#discussion_r60427086"},"pull_request":{"href":"https://api.github.com/repos/getcarina/getcarina.com/pulls/821"}}},"pull_request":{"url":"https://api.github.com/repos/getcarina/getcarina.com/pulls/821","id":67013430,"html_url":"https://github.com/getcarina/getcarina.com/pull/821","diff_url":"https://github.com/getcarina/getcarina.com/pull/821.diff","patch_url":"https://github.com/getcarina/getcarina.com/pull/821.patch","issue_url":"https://api.github.com/repos/getcarina/getcarina.com/issues/821","number":821,"state":"open","locked":false,"title":"Adds tutorial for push-based CD","user":{"login":"jamiehannaford","id":1867202,"avatar_url":"https://avatars.githubusercontent.com/u/1867202?v=3","gravatar_id":"","url":"https://api.github.com/users/jamiehannaford","html_url":"https://github.com/jamiehannaford","followers_url":"https://api.github.com/users/jamiehannaford/followers","following_url":"https://api.github.com/users/jamiehannaford/following{/other_user}","gists_url":"https://api.github.com/users/jamiehannaford/gists{/gist_id}","starred_url":"https://api.github.com/users/jamiehannaford/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jamiehannaford/subscriptions","organizations_url":"https://api.github.com/users/jamiehannaford/orgs","repos_url":"https://api.github.com/users/jamiehannaford/repos","events_url":"https://api.github.com/users/jamiehannaford/events{/privacy}","received_events_url":"https://api.github.com/users/jamiehannaford/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-04-19T12:57:08Z","updated_at":"2016-04-20T15:14:57Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f3e3bcbb486e102847d315471e8782870dba8c3b","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/getcarina/getcarina.com/pulls/821/commits","review_comments_url":"https://api.github.com/repos/getcarina/getcarina.com/pulls/821/comments","review_comment_url":"https://api.github.com/repos/getcarina/getcarina.com/pulls/comments{/number}","comments_url":"https://api.github.com/repos/getcarina/getcarina.com/issues/821/comments","statuses_url":"https://api.github.com/repos/getcarina/getcarina.com/statuses/080b99a0bf1d7203bfd778f9e7f6fb6869f7b183","head":{"label":"jamiehannaford:push-cd","ref":"push-cd","sha":"080b99a0bf1d7203bfd778f9e7f6fb6869f7b183","user":{"login":"jamiehannaford","id":1867202,"avatar_url":"https://avatars.githubusercontent.com/u/1867202?v=3","gravatar_id":"","url":"https://api.github.com/users/jamiehannaford","html_url":"https://github.com/jamiehannaford","followers_url":"https://api.github.com/users/jamiehannaford/followers","following_url":"https://api.github.com/users/jamiehannaford/following{/other_user}","gists_url":"https://api.github.com/users/jamiehannaford/gists{/gist_id}","starred_url":"https://api.github.com/users/jamiehannaford/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jamiehannaford/subscriptions","organizations_url":"https://api.github.com/users/jamiehannaford/orgs","repos_url":"https://api.github.com/users/jamiehannaford/repos","events_url":"https://api.github.com/users/jamiehannaford/events{/privacy}","received_events_url":"https://api.github.com/users/jamiehannaford/received_events","type":"User","site_admin":false},"repo":{"id":54192932,"name":"getcarina.com","full_name":"jamiehannaford/getcarina.com","owner":{"login":"jamiehannaford","id":1867202,"avatar_url":"https://avatars.githubusercontent.com/u/1867202?v=3","gravatar_id":"","url":"https://api.github.com/users/jamiehannaford","html_url":"https://github.com/jamiehannaford","followers_url":"https://api.github.com/users/jamiehannaford/followers","following_url":"https://api.github.com/users/jamiehannaford/following{/other_user}","gists_url":"https://api.github.com/users/jamiehannaford/gists{/gist_id}","starred_url":"https://api.github.com/users/jamiehannaford/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jamiehannaford/subscriptions","organizations_url":"https://api.github.com/users/jamiehannaford/orgs","repos_url":"https://api.github.com/users/jamiehannaford/repos","events_url":"https://api.github.com/users/jamiehannaford/events{/privacy}","received_events_url":"https://api.github.com/users/jamiehannaford/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/jamiehannaford/getcarina.com","description":"The Carina website","fork":true,"url":"https://api.github.com/repos/jamiehannaford/getcarina.com","forks_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/forks","keys_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/teams","hooks_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/hooks","issue_events_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/issues/events{/number}","events_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/events","assignees_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/assignees{/user}","branches_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/branches{/branch}","tags_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/tags","blobs_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/git/refs{/sha}","trees_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/statuses/{sha}","languages_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/languages","stargazers_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/stargazers","contributors_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/contributors","subscribers_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/subscribers","subscription_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/subscription","commits_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/commits{/sha}","git_commits_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/git/commits{/sha}","comments_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/comments{/number}","issue_comment_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/issues/comments{/number}","contents_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/contents/{+path}","compare_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/merges","archive_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/downloads","issues_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/issues{/number}","pulls_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/pulls{/number}","milestones_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/milestones{/number}","notifications_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/labels{/name}","releases_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/releases{/id}","deployments_url":"https://api.github.com/repos/jamiehannaford/getcarina.com/deployments","created_at":"2016-03-18T10:22:31Z","updated_at":"2016-03-18T10:22:33Z","pushed_at":"2016-04-20T14:33:10Z","git_url":"git://github.com/jamiehannaford/getcarina.com.git","ssh_url":"git@github.com:jamiehannaford/getcarina.com.git","clone_url":"https://github.com/jamiehannaford/getcarina.com.git","svn_url":"https://github.com/jamiehannaford/getcarina.com","homepage":"https://getcarina.com/","size":47651,"stargazers_count":0,"watchers_count":0,"language":"HTML","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"getcarina:master","ref":"master","sha":"245d2f94e83170d83ae9e116a7b6a34fb2f11793","user":{"login":"getcarina","id":15111063,"avatar_url":"https://avatars.githubusercontent.com/u/15111063?v=3","gravatar_id":"","url":"https://api.github.com/users/getcarina","html_url":"https://github.com/getcarina","followers_url":"https://api.github.com/users/getcarina/followers","following_url":"https://api.github.com/users/getcarina/following{/other_user}","gists_url":"https://api.github.com/users/getcarina/gists{/gist_id}","starred_url":"https://api.github.com/users/getcarina/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/getcarina/subscriptions","organizations_url":"https://api.github.com/users/getcarina/orgs","repos_url":"https://api.github.com/users/getcarina/repos","events_url":"https://api.github.com/users/getcarina/events{/privacy}","received_events_url":"https://api.github.com/users/getcarina/received_events","type":"Organization","site_admin":false},"repo":{"id":41817203,"name":"getcarina.com","full_name":"getcarina/getcarina.com","owner":{"login":"getcarina","id":15111063,"avatar_url":"https://avatars.githubusercontent.com/u/15111063?v=3","gravatar_id":"","url":"https://api.github.com/users/getcarina","html_url":"https://github.com/getcarina","followers_url":"https://api.github.com/users/getcarina/followers","following_url":"https://api.github.com/users/getcarina/following{/other_user}","gists_url":"https://api.github.com/users/getcarina/gists{/gist_id}","starred_url":"https://api.github.com/users/getcarina/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/getcarina/subscriptions","organizations_url":"https://api.github.com/users/getcarina/orgs","repos_url":"https://api.github.com/users/getcarina/repos","events_url":"https://api.github.com/users/getcarina/events{/privacy}","received_events_url":"https://api.github.com/users/getcarina/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/getcarina/getcarina.com","description":"The Carina website","fork":false,"url":"https://api.github.com/repos/getcarina/getcarina.com","forks_url":"https://api.github.com/repos/getcarina/getcarina.com/forks","keys_url":"https://api.github.com/repos/getcarina/getcarina.com/keys{/key_id}","collaborators_url":"https://api.github.com/repos/getcarina/getcarina.com/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/getcarina/getcarina.com/teams","hooks_url":"https://api.github.com/repos/getcarina/getcarina.com/hooks","issue_events_url":"https://api.github.com/repos/getcarina/getcarina.com/issues/events{/number}","events_url":"https://api.github.com/repos/getcarina/getcarina.com/events","assignees_url":"https://api.github.com/repos/getcarina/getcarina.com/assignees{/user}","branches_url":"https://api.github.com/repos/getcarina/getcarina.com/branches{/branch}","tags_url":"https://api.github.com/repos/getcarina/getcarina.com/tags","blobs_url":"https://api.github.com/repos/getcarina/getcarina.com/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/getcarina/getcarina.com/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/getcarina/getcarina.com/git/refs{/sha}","trees_url":"https://api.github.com/repos/getcarina/getcarina.com/git/trees{/sha}","statuses_url":"https://api.github.com/repos/getcarina/getcarina.com/statuses/{sha}","languages_url":"https://api.github.com/repos/getcarina/getcarina.com/languages","stargazers_url":"https://api.github.com/repos/getcarina/getcarina.com/stargazers","contributors_url":"https://api.github.com/repos/getcarina/getcarina.com/contributors","subscribers_url":"https://api.github.com/repos/getcarina/getcarina.com/subscribers","subscription_url":"https://api.github.com/repos/getcarina/getcarina.com/subscription","commits_url":"https://api.github.com/repos/getcarina/getcarina.com/commits{/sha}","git_commits_url":"https://api.github.com/repos/getcarina/getcarina.com/git/commits{/sha}","comments_url":"https://api.github.com/repos/getcarina/getcarina.com/comments{/number}","issue_comment_url":"https://api.github.com/repos/getcarina/getcarina.com/issues/comments{/number}","contents_url":"https://api.github.com/repos/getcarina/getcarina.com/contents/{+path}","compare_url":"https://api.github.com/repos/getcarina/getcarina.com/compare/{base}...{head}","merges_url":"https://api.github.com/repos/getcarina/getcarina.com/merges","archive_url":"https://api.github.com/repos/getcarina/getcarina.com/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/getcarina/getcarina.com/downloads","issues_url":"https://api.github.com/repos/getcarina/getcarina.com/issues{/number}","pulls_url":"https://api.github.com/repos/getcarina/getcarina.com/pulls{/number}","milestones_url":"https://api.github.com/repos/getcarina/getcarina.com/milestones{/number}","notifications_url":"https://api.github.com/repos/getcarina/getcarina.com/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/getcarina/getcarina.com/labels{/name}","releases_url":"https://api.github.com/repos/getcarina/getcarina.com/releases{/id}","deployments_url":"https://api.github.com/repos/getcarina/getcarina.com/deployments","created_at":"2015-09-02T17:53:02Z","updated_at":"2016-04-15T16:50:28Z","pushed_at":"2016-04-20T14:33:10Z","git_url":"git://github.com/getcarina/getcarina.com.git","ssh_url":"git@github.com:getcarina/getcarina.com.git","clone_url":"https://github.com/getcarina/getcarina.com.git","svn_url":"https://github.com/getcarina/getcarina.com","homepage":"https://getcarina.com/","size":47635,"stargazers_count":16,"watchers_count":16,"language":"HTML","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":42,"mirror_url":null,"open_issues_count":68,"forks":42,"open_issues":68,"watchers":16,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/getcarina/getcarina.com/pulls/821"},"html":{"href":"https://github.com/getcarina/getcarina.com/pull/821"},"issue":{"href":"https://api.github.com/repos/getcarina/getcarina.com/issues/821"},"comments":{"href":"https://api.github.com/repos/getcarina/getcarina.com/issues/821/comments"},"review_comments":{"href":"https://api.github.com/repos/getcarina/getcarina.com/pulls/821/comments"},"review_comment":{"href":"https://api.github.com/repos/getcarina/getcarina.com/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/getcarina/getcarina.com/pulls/821/commits"},"statuses":{"href":"https://api.github.com/repos/getcarina/getcarina.com/statuses/080b99a0bf1d7203bfd778f9e7f6fb6869f7b183"}}}}