{"action":"created","comment":{"url":"https://api.github.com/repos/elo7/tech-blog/pulls/comments/98428553","pull_request_review_id":19067608,"id":98428553,"diff_hunk":"@@ -0,0 +1,171 @@\n+---\n+title: Terraformando tudo - parte 1\n+date: 2016-12-26\n+category: devops\n+layout: post\n+description: Início da série de posts 'Terraformando Tudo', que conta a nossa tragetória em busca da codificação da nossa infraestrutura. Esse primeiro post mostra nossas premissas para o projeto e como escolhemos o Terraform como ferramenta para nos auxiliar nesse caminho.\n+author: lucasvasconcelos\n+tags:\n+  - devops\n+  - terraform\n+  - IaC\n+  - Infrastructure as Code\n+  - infra\n+---\n+\n+## Infrastructure as Code no Elo7\n+\n+Esse post dá início a uma série de posts intitulada **Terraformando tudo**. Nessa série iremos mostrar o caminho que trilhamos (e os percalços que tivemos) no **Elo7** e o que ainda falta para concluir nosso objetivo de ter **toda** nossa infraestrutura sendo gerenciada por código, ou seja, termos *Infrastructure as Code*.\n+\n+Mas o que seria *Infrastructure as Code* (ou *IaC* para os mais íntimos)? \n+\n+Além de ser mais uma *buzzword*, *Infrastructure as Code* é o ato de gerenciar a infraestrutura (seja ela física ou virtual) e suas configurações. Tal gerenciamento deve ser feito através de código versionado, seja utilizando ferramentas desenvolvidas *in-house* ou de mercado. Esse processo é de grande importância para a cultura *DevOps*, possibilitando que todo o time de Engenharia possa ser responsável pela infraestrutura de suas aplicações e trazendo diversos benefícios:\n+* Velocidade: execução rápida, evitando processos manuais;\n+* Padronizações: melhora a garantia de que os padrões definidos sejam seguidos;\n+* Evita erros manuais: ao não ser necessário utilizar ferramentas interativas, diminui a chance de falhas;\n+* Qualidade: Pode-se inserir no processo um *code review*, garantindo a qualidade do código/padrões;\n+* Fácil reprodutibilidade: é fácil escalar a infra ou cloná-la em outro datacenter.\n+\n+Pelos motivos supracitados e ainda outras vantagens, decidimos ter *IaC* aqui no Elo7 e, pelo título do post, é fácil ver que escolhemos o [**Terraform**](http://terraform.io) para nos ajudar nessa tarefa, certo? :-). Mas como fizemos essa escolha? Hype? Know-how prévio? Nome bonito? Ninguém sabe?!?\n+\n+Negativo! Apesar de *ágeis e early adopters*, pesamos nossas decisões em diversos aspectos, como curva de aprendizado, escopo da resolução do problema, possíveis *lock-ins* e escala a longo prazo.\n+\n+E é exatamente disso que se trata esse primeiro post, um comparativo das features - **que nos interessam** - de cada ferramenta analisada e como nos pautamos para decidir utilizar o **Terraform**. Em nenhum momento esse post se trata de decidir se uma ferramenta é melhor que outra, e sim, da ferramenta que é **melhor para nós e para nossas necessidades**. \n+\n+## Um paralelo com o desenvolvimento das nossas aplicações\n+\n+Ao buscar codificar nossa infra, tinhamos como intuito utilizar o mesmo fluxo que nós utilizamos para o desenvolvimento de nossas aplicações. Para termos o máximo de qualidade em tudo que fazemos, temos um fluxo rígido de desenvolvimento, que consiste em:\n+\n+Pair-programming (cada dev com seu monitor/teclado/mouse na mesma workstation) -> Testes -> Pull-request -> Review/Testes -> Fixes -> Review/Testes fixes -> Deploy (ESSA LINHA SERÁ UM FLUXOGRAMA)\n+\n+O processo de desenvolvimento do código responsável por nossa infra deveria se encaixar nesse fluxo, ou pelo menos em grande parte dele. Principalmente nas etapas de pair-programming e review. \n+\n+Além desse principal requisito, também temos algumas outras necessidades:\n+* Suporte à [AWS](https://aws.amazon.com/);\n+* Opensource (com comunidade ativa :P);\n+* Foco em infra: nosso ambiente roda todo com [Docker](https://www.docker.com/) + [Fleet](https://github.com/coreos/fleet) (e no futuro [Kubernetes](https://github.com/coreos/fleet), teremos novidades aqui no blog huhuhu). Portanto, não iríamos fazer uso das features de automação de aplicações/configurações, por exemplo.\n+\n+E ainda contamos com alguns requisitos não tão importantes, mas desejáveis:\n+* Curva de aprendizado curta;\n+* Que a ferramenta não seja desenvolvida em uma linguagem exótica (tipo Erlang) para que uma possível contribuição seja factível;\n+* Suporte ao [GCP (Google Cloud Platform)](https://cloud.google.com/);\n+\n+## Nossas opções\n+\n+Fizemos uma pré-seleção de algumas ferramentas para, dentre elas, escolher a que melhor cumpre os nossos requisitos. As ferramentas foram escolhidas baseando-se nas funcionalidades, know-how prévio e confiabilidade. Todas as ferramentas escolhidas possuem a capacidade de cumprir com os nossos requisitos principais. São elas:\n+* [Puppet](https://puppet.com/);\n+* [Chef](https://www.chef.io/chef/);\n+* [Ansible](https://www.ansible.com/);\n+* [Terraform](https://www.terraform.io/);\n+* [AWS CloudFormation](https://aws.amazon.com/cloudformation/);\n+\n+Vale citar que, do ponto de vista de *IaC*, todas elas seguem as mesmas práticas, que ajudam principalmente na curva de aprendizado para quem já teve experiência prévia com algumas delas, que era o caso do time responsável pela implementação desse projeto. As ferramentas são:\n+* Declarativas;\n+* Buscam um estado final para a infra que está sendo criada;\n+* Controlam *recursos* da infra/configuração;\n+* Reutilização de código/referência entre recursos.\n+\n+Os próximos sub-tópicos discutem os motivos que foram importantes **para nós** na escolha do Terraform.\n+\n+### AWS Cloud-formation\n+\n+Não poderíamos deixar de analisar a ferramenta oferecida pela própria AWS para gerenciamento de infraestrutura como código. Por ser da própria AWS, já podíamos contar com suporte a todos os recursos existentes (EC2, S3, route53, redshift, lambda, etc), além de performance e confiabilidade no que está sendo executado.\n+\n+O Cloud-formation utiliza a sintaxe JSON no seu código. Nesse exemplo criamos uma instância no EC2 (vários campos foram omitidos):\n+\n+```javascript\n+{\n+   \"Type\" : \"AWS::EC2::Instance\",\n+   \"Properties\" : {\n+      \"AvailabilityZone\" : \"us-west-1a\",\n+      \"ImageId\" : \"ami-696e652c\",\n+      \"InstanceType\" : \"t1.micro\",\n+      \"SecurityGroups\" : [ \"sample-group\" ],\n+      ...\n+   }\n+}\n+```\n+\n+Apesar de não gostarmos da sintaxe JSON do Cloud Formation, decidimos apostar na ferramenta. Mas, o feitiço pode voltar contra o feiticeiro. O que podia ser considerado uma vantagem pra nós, que é o fato da ferramenta estar dentro da AWS, também pode ser um ponto negativo. O Cloud Formation só dá suporte à AWS (obviamente :P) e não gostamos de lock-ins. Temos planos futuros de rodar em um ambiente multi-cloud e essa característica tirou o Cloud Formation da nossa lista.\n+\n+### Puppet e Chef\n+\n+Puppet e Chef são as opções mais conhecidas quando falamos de **automação** em geral, seja *IaC* ou gerenciamento de configurações. Muito poderosas, são capazes de gerenciar *data-centers* gigantescos. \n+\n+Eles já estão na estrada há um bom tempo e diversos padrões de *DevOps* e *IaC* foram inspirados em casos de uso dessas ferramentas. Ambas são escritas em *Ruby* e são *production-ready*, possuindo versões da comunidade e *Enterprise*. \n+\n+O Puppet possui uma linguagem DSL (*Domain Specific Language*) declarativa. Nesse exemplo, ele está criando uma instância EC2:\n+\n+```ruby\n+ec2_instance { 'sample-instance':\n+  ensure            => present,\n+  region            => 'us-west-1',\n+  availability_zone => 'us-west-1a',\n+  image_id          => 'ami-696e652c',\n+  instance_type     => 't1.micro',\n+  security_groups   => ['sample-group'],\n+}\n+```\n+\n+Por sua vez, o Chef possui uma linguagem própria também, bem mais parecida com *Ruby* e imperativa. Exemplo de como um ELB (*Elastic Load Balancer*) é criado com o Chef:\n+\n+```ruby\n+aws_elastic_lb 'elb' do\n+  aws_access_key aws['aws_access_key_id']\n+  aws_secret_access_key aws['aws_secret_access_key']\n+  name 'LB_tech-blog'\n+  action :register\n+end\n+```\n+\n+As duas ferramentas são de uma época 'pré-cloud' (pré popularizacão, no caso), ou seja, foram inicialmente concebidas para automação de configurações em data-centers virtualizados/*bare-metal*. Atualmente, já suportam a criação de infraestrutura na nuvem. Portanto, possuem um arcabouço extenso de recursos de automação.\n+\n+Para nós, as duas ficaram no mesmo balaio, além do escopo de atuação delas ser muito grande, o que elas nasceram para fazer, que é o gerenciamento de configurações (exemplo acima), não iríamos utilizar. A necessidade de ter um *client* nos servidores para execução das automações também não nos agrada muito.\n+\n+A quantidade de recursos nativos disponíveis também é pequena, com destaque para o Chef que nem a criação de insâncias no EC2 possui nativamente (por isso que o exemplo dele é diferente das outras ferramentas).","path":"src/posts/terraformando-tudo-1.html.md","position":125,"original_position":125,"commit_id":"3ba08e87491c9ba9ce85c609641517c565a6e35d","original_commit_id":"3ba08e87491c9ba9ce85c609641517c565a6e35d","user":{"login":"lucasvasconcelos","id":2962854,"avatar_url":"https://avatars.githubusercontent.com/u/2962854?v=3","gravatar_id":"","url":"https://api.github.com/users/lucasvasconcelos","html_url":"https://github.com/lucasvasconcelos","followers_url":"https://api.github.com/users/lucasvasconcelos/followers","following_url":"https://api.github.com/users/lucasvasconcelos/following{/other_user}","gists_url":"https://api.github.com/users/lucasvasconcelos/gists{/gist_id}","starred_url":"https://api.github.com/users/lucasvasconcelos/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lucasvasconcelos/subscriptions","organizations_url":"https://api.github.com/users/lucasvasconcelos/orgs","repos_url":"https://api.github.com/users/lucasvasconcelos/repos","events_url":"https://api.github.com/users/lucasvasconcelos/events{/privacy}","received_events_url":"https://api.github.com/users/lucasvasconcelos/received_events","type":"User","site_admin":false},"body":"Quis dizer que é diferente semanticamente. Enquanto os exemplos de todas ferramentas criam instâncias na EC2, o do Chef cria um ELB por não possuir essa funcionalidade nativa. De qualquer maneira, deixei isso explicito agora","created_at":"2017-01-30T12:11:51Z","updated_at":"2017-01-30T12:11:51Z","html_url":"https://github.com/elo7/tech-blog/pull/49#discussion_r98428553","pull_request_url":"https://api.github.com/repos/elo7/tech-blog/pulls/49","_links":{"self":{"href":"https://api.github.com/repos/elo7/tech-blog/pulls/comments/98428553"},"html":{"href":"https://github.com/elo7/tech-blog/pull/49#discussion_r98428553"},"pull_request":{"href":"https://api.github.com/repos/elo7/tech-blog/pulls/49"}}},"pull_request":{"url":"https://api.github.com/repos/elo7/tech-blog/pulls/49","id":99500058,"html_url":"https://github.com/elo7/tech-blog/pull/49","diff_url":"https://github.com/elo7/tech-blog/pull/49.diff","patch_url":"https://github.com/elo7/tech-blog/pull/49.patch","issue_url":"https://api.github.com/repos/elo7/tech-blog/issues/49","number":49,"state":"open","locked":false,"title":"[POST] Terraformando tudo - parte 1","user":{"login":"lucasvasconcelos","id":2962854,"avatar_url":"https://avatars.githubusercontent.com/u/2962854?v=3","gravatar_id":"","url":"https://api.github.com/users/lucasvasconcelos","html_url":"https://github.com/lucasvasconcelos","followers_url":"https://api.github.com/users/lucasvasconcelos/followers","following_url":"https://api.github.com/users/lucasvasconcelos/following{/other_user}","gists_url":"https://api.github.com/users/lucasvasconcelos/gists{/gist_id}","starred_url":"https://api.github.com/users/lucasvasconcelos/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lucasvasconcelos/subscriptions","organizations_url":"https://api.github.com/users/lucasvasconcelos/orgs","repos_url":"https://api.github.com/users/lucasvasconcelos/repos","events_url":"https://api.github.com/users/lucasvasconcelos/events{/privacy}","received_events_url":"https://api.github.com/users/lucasvasconcelos/received_events","type":"User","site_admin":false},"body":"Cria o primeiro post sobre a série do Terraform.","created_at":"2016-12-28T01:56:19Z","updated_at":"2017-01-30T12:11:51Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ee6024f978da34df9c175c3f9aed80993caad551","assignee":{"login":"lucasvasconcelos","id":2962854,"avatar_url":"https://avatars.githubusercontent.com/u/2962854?v=3","gravatar_id":"","url":"https://api.github.com/users/lucasvasconcelos","html_url":"https://github.com/lucasvasconcelos","followers_url":"https://api.github.com/users/lucasvasconcelos/followers","following_url":"https://api.github.com/users/lucasvasconcelos/following{/other_user}","gists_url":"https://api.github.com/users/lucasvasconcelos/gists{/gist_id}","starred_url":"https://api.github.com/users/lucasvasconcelos/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lucasvasconcelos/subscriptions","organizations_url":"https://api.github.com/users/lucasvasconcelos/orgs","repos_url":"https://api.github.com/users/lucasvasconcelos/repos","events_url":"https://api.github.com/users/lucasvasconcelos/events{/privacy}","received_events_url":"https://api.github.com/users/lucasvasconcelos/received_events","type":"User","site_admin":false},"assignees":[{"login":"lucasvasconcelos","id":2962854,"avatar_url":"https://avatars.githubusercontent.com/u/2962854?v=3","gravatar_id":"","url":"https://api.github.com/users/lucasvasconcelos","html_url":"https://github.com/lucasvasconcelos","followers_url":"https://api.github.com/users/lucasvasconcelos/followers","following_url":"https://api.github.com/users/lucasvasconcelos/following{/other_user}","gists_url":"https://api.github.com/users/lucasvasconcelos/gists{/gist_id}","starred_url":"https://api.github.com/users/lucasvasconcelos/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lucasvasconcelos/subscriptions","organizations_url":"https://api.github.com/users/lucasvasconcelos/orgs","repos_url":"https://api.github.com/users/lucasvasconcelos/repos","events_url":"https://api.github.com/users/lucasvasconcelos/events{/privacy}","received_events_url":"https://api.github.com/users/lucasvasconcelos/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/elo7/tech-blog/pulls/49/commits","review_comments_url":"https://api.github.com/repos/elo7/tech-blog/pulls/49/comments","review_comment_url":"https://api.github.com/repos/elo7/tech-blog/pulls/comments{/number}","comments_url":"https://api.github.com/repos/elo7/tech-blog/issues/49/comments","statuses_url":"https://api.github.com/repos/elo7/tech-blog/statuses/3ba08e87491c9ba9ce85c609641517c565a6e35d","head":{"label":"elo7:terraformando-tudo-01","ref":"terraformando-tudo-01","sha":"3ba08e87491c9ba9ce85c609641517c565a6e35d","user":{"login":"elo7","id":1469534,"avatar_url":"https://avatars.githubusercontent.com/u/1469534?v=3","gravatar_id":"","url":"https://api.github.com/users/elo7","html_url":"https://github.com/elo7","followers_url":"https://api.github.com/users/elo7/followers","following_url":"https://api.github.com/users/elo7/following{/other_user}","gists_url":"https://api.github.com/users/elo7/gists{/gist_id}","starred_url":"https://api.github.com/users/elo7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/elo7/subscriptions","organizations_url":"https://api.github.com/users/elo7/orgs","repos_url":"https://api.github.com/users/elo7/repos","events_url":"https://api.github.com/users/elo7/events{/privacy}","received_events_url":"https://api.github.com/users/elo7/received_events","type":"Organization","site_admin":false},"repo":{"id":61552932,"name":"tech-blog","full_name":"elo7/tech-blog","owner":{"login":"elo7","id":1469534,"avatar_url":"https://avatars.githubusercontent.com/u/1469534?v=3","gravatar_id":"","url":"https://api.github.com/users/elo7","html_url":"https://github.com/elo7","followers_url":"https://api.github.com/users/elo7/followers","following_url":"https://api.github.com/users/elo7/following{/other_user}","gists_url":"https://api.github.com/users/elo7/gists{/gist_id}","starred_url":"https://api.github.com/users/elo7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/elo7/subscriptions","organizations_url":"https://api.github.com/users/elo7/orgs","repos_url":"https://api.github.com/users/elo7/repos","events_url":"https://api.github.com/users/elo7/events{/privacy}","received_events_url":"https://api.github.com/users/elo7/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/elo7/tech-blog","description":"Blog técnico do Elo7","fork":false,"url":"https://api.github.com/repos/elo7/tech-blog","forks_url":"https://api.github.com/repos/elo7/tech-blog/forks","keys_url":"https://api.github.com/repos/elo7/tech-blog/keys{/key_id}","collaborators_url":"https://api.github.com/repos/elo7/tech-blog/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/elo7/tech-blog/teams","hooks_url":"https://api.github.com/repos/elo7/tech-blog/hooks","issue_events_url":"https://api.github.com/repos/elo7/tech-blog/issues/events{/number}","events_url":"https://api.github.com/repos/elo7/tech-blog/events","assignees_url":"https://api.github.com/repos/elo7/tech-blog/assignees{/user}","branches_url":"https://api.github.com/repos/elo7/tech-blog/branches{/branch}","tags_url":"https://api.github.com/repos/elo7/tech-blog/tags","blobs_url":"https://api.github.com/repos/elo7/tech-blog/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/elo7/tech-blog/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/elo7/tech-blog/git/refs{/sha}","trees_url":"https://api.github.com/repos/elo7/tech-blog/git/trees{/sha}","statuses_url":"https://api.github.com/repos/elo7/tech-blog/statuses/{sha}","languages_url":"https://api.github.com/repos/elo7/tech-blog/languages","stargazers_url":"https://api.github.com/repos/elo7/tech-blog/stargazers","contributors_url":"https://api.github.com/repos/elo7/tech-blog/contributors","subscribers_url":"https://api.github.com/repos/elo7/tech-blog/subscribers","subscription_url":"https://api.github.com/repos/elo7/tech-blog/subscription","commits_url":"https://api.github.com/repos/elo7/tech-blog/commits{/sha}","git_commits_url":"https://api.github.com/repos/elo7/tech-blog/git/commits{/sha}","comments_url":"https://api.github.com/repos/elo7/tech-blog/comments{/number}","issue_comment_url":"https://api.github.com/repos/elo7/tech-blog/issues/comments{/number}","contents_url":"https://api.github.com/repos/elo7/tech-blog/contents/{+path}","compare_url":"https://api.github.com/repos/elo7/tech-blog/compare/{base}...{head}","merges_url":"https://api.github.com/repos/elo7/tech-blog/merges","archive_url":"https://api.github.com/repos/elo7/tech-blog/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/elo7/tech-blog/downloads","issues_url":"https://api.github.com/repos/elo7/tech-blog/issues{/number}","pulls_url":"https://api.github.com/repos/elo7/tech-blog/pulls{/number}","milestones_url":"https://api.github.com/repos/elo7/tech-blog/milestones{/number}","notifications_url":"https://api.github.com/repos/elo7/tech-blog/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/elo7/tech-blog/labels{/name}","releases_url":"https://api.github.com/repos/elo7/tech-blog/releases{/id}","deployments_url":"https://api.github.com/repos/elo7/tech-blog/deployments","created_at":"2016-06-20T14:14:12Z","updated_at":"2016-11-17T11:44:24Z","pushed_at":"2017-01-30T11:21:11Z","git_url":"git://github.com/elo7/tech-blog.git","ssh_url":"git@github.com:elo7/tech-blog.git","clone_url":"https://github.com/elo7/tech-blog.git","svn_url":"https://github.com/elo7/tech-blog","homepage":null,"size":5829,"stargazers_count":2,"watchers_count":2,"language":"CSS","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":24,"forks":0,"open_issues":24,"watchers":2,"default_branch":"master"}},"base":{"label":"elo7:master","ref":"master","sha":"f28048bcff4282bc1156a9e2577dc22c35a3775e","user":{"login":"elo7","id":1469534,"avatar_url":"https://avatars.githubusercontent.com/u/1469534?v=3","gravatar_id":"","url":"https://api.github.com/users/elo7","html_url":"https://github.com/elo7","followers_url":"https://api.github.com/users/elo7/followers","following_url":"https://api.github.com/users/elo7/following{/other_user}","gists_url":"https://api.github.com/users/elo7/gists{/gist_id}","starred_url":"https://api.github.com/users/elo7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/elo7/subscriptions","organizations_url":"https://api.github.com/users/elo7/orgs","repos_url":"https://api.github.com/users/elo7/repos","events_url":"https://api.github.com/users/elo7/events{/privacy}","received_events_url":"https://api.github.com/users/elo7/received_events","type":"Organization","site_admin":false},"repo":{"id":61552932,"name":"tech-blog","full_name":"elo7/tech-blog","owner":{"login":"elo7","id":1469534,"avatar_url":"https://avatars.githubusercontent.com/u/1469534?v=3","gravatar_id":"","url":"https://api.github.com/users/elo7","html_url":"https://github.com/elo7","followers_url":"https://api.github.com/users/elo7/followers","following_url":"https://api.github.com/users/elo7/following{/other_user}","gists_url":"https://api.github.com/users/elo7/gists{/gist_id}","starred_url":"https://api.github.com/users/elo7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/elo7/subscriptions","organizations_url":"https://api.github.com/users/elo7/orgs","repos_url":"https://api.github.com/users/elo7/repos","events_url":"https://api.github.com/users/elo7/events{/privacy}","received_events_url":"https://api.github.com/users/elo7/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/elo7/tech-blog","description":"Blog técnico do Elo7","fork":false,"url":"https://api.github.com/repos/elo7/tech-blog","forks_url":"https://api.github.com/repos/elo7/tech-blog/forks","keys_url":"https://api.github.com/repos/elo7/tech-blog/keys{/key_id}","collaborators_url":"https://api.github.com/repos/elo7/tech-blog/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/elo7/tech-blog/teams","hooks_url":"https://api.github.com/repos/elo7/tech-blog/hooks","issue_events_url":"https://api.github.com/repos/elo7/tech-blog/issues/events{/number}","events_url":"https://api.github.com/repos/elo7/tech-blog/events","assignees_url":"https://api.github.com/repos/elo7/tech-blog/assignees{/user}","branches_url":"https://api.github.com/repos/elo7/tech-blog/branches{/branch}","tags_url":"https://api.github.com/repos/elo7/tech-blog/tags","blobs_url":"https://api.github.com/repos/elo7/tech-blog/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/elo7/tech-blog/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/elo7/tech-blog/git/refs{/sha}","trees_url":"https://api.github.com/repos/elo7/tech-blog/git/trees{/sha}","statuses_url":"https://api.github.com/repos/elo7/tech-blog/statuses/{sha}","languages_url":"https://api.github.com/repos/elo7/tech-blog/languages","stargazers_url":"https://api.github.com/repos/elo7/tech-blog/stargazers","contributors_url":"https://api.github.com/repos/elo7/tech-blog/contributors","subscribers_url":"https://api.github.com/repos/elo7/tech-blog/subscribers","subscription_url":"https://api.github.com/repos/elo7/tech-blog/subscription","commits_url":"https://api.github.com/repos/elo7/tech-blog/commits{/sha}","git_commits_url":"https://api.github.com/repos/elo7/tech-blog/git/commits{/sha}","comments_url":"https://api.github.com/repos/elo7/tech-blog/comments{/number}","issue_comment_url":"https://api.github.com/repos/elo7/tech-blog/issues/comments{/number}","contents_url":"https://api.github.com/repos/elo7/tech-blog/contents/{+path}","compare_url":"https://api.github.com/repos/elo7/tech-blog/compare/{base}...{head}","merges_url":"https://api.github.com/repos/elo7/tech-blog/merges","archive_url":"https://api.github.com/repos/elo7/tech-blog/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/elo7/tech-blog/downloads","issues_url":"https://api.github.com/repos/elo7/tech-blog/issues{/number}","pulls_url":"https://api.github.com/repos/elo7/tech-blog/pulls{/number}","milestones_url":"https://api.github.com/repos/elo7/tech-blog/milestones{/number}","notifications_url":"https://api.github.com/repos/elo7/tech-blog/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/elo7/tech-blog/labels{/name}","releases_url":"https://api.github.com/repos/elo7/tech-blog/releases{/id}","deployments_url":"https://api.github.com/repos/elo7/tech-blog/deployments","created_at":"2016-06-20T14:14:12Z","updated_at":"2016-11-17T11:44:24Z","pushed_at":"2017-01-30T11:21:11Z","git_url":"git://github.com/elo7/tech-blog.git","ssh_url":"git@github.com:elo7/tech-blog.git","clone_url":"https://github.com/elo7/tech-blog.git","svn_url":"https://github.com/elo7/tech-blog","homepage":null,"size":5829,"stargazers_count":2,"watchers_count":2,"language":"CSS","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":24,"forks":0,"open_issues":24,"watchers":2,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/elo7/tech-blog/pulls/49"},"html":{"href":"https://github.com/elo7/tech-blog/pull/49"},"issue":{"href":"https://api.github.com/repos/elo7/tech-blog/issues/49"},"comments":{"href":"https://api.github.com/repos/elo7/tech-blog/issues/49/comments"},"review_comments":{"href":"https://api.github.com/repos/elo7/tech-blog/pulls/49/comments"},"review_comment":{"href":"https://api.github.com/repos/elo7/tech-blog/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/elo7/tech-blog/pulls/49/commits"},"statuses":{"href":"https://api.github.com/repos/elo7/tech-blog/statuses/3ba08e87491c9ba9ce85c609641517c565a6e35d"}}}}
{"actor":{"display_login":"lucasvasconcelos"}}