{"action":"created","comment":{"url":"https://api.github.com/repos/conan-io/conan-io.github.io/pulls/comments/182814815","pull_request_review_id":113690869,"id":182814815,"diff_hunk":"@@ -0,0 +1,253 @@\n+---\n+layout: post\n+comments: false\n+title: Continuous integration for C/C++ embedded devices with Jenkins, Docker and Conan\n+---\n+\n+We all know the importance of Continuous Integration while developing software: running unit or integration tests, supporting different\n+platforms/devices, supporting different versions of a compiler or library and having the latest version of the software always ready for a\n+new release are some of the reasons.\n+\n+Developing a final application in the same platform where it will be finally deployed is fine and makes things easier, as you have the setup\n+done, all the tooling needed is installed and you could at some point even test in your machine simulating the final deploy target for the\n+application.\n+\n+Programming for embedded devices comes into place that is a horse of a different color. Normally you would have to setup a kind of fixed\n+environment with the variables needed to  cross-compile, the cross-compiler and toolchain ready to be used. This does not sound very painful\n+and Conan has already some features to help with such setup:\n+[installer packages](http://docs.conan.io/en/latest/devtools/create_installer_packages.html),\n+[python packages to share scripts](http://docs.conan.io/en/latest/howtos/python_code_reuse.html), the\n+[virtualenv generator](http://docs.conan.io/en/latest/reference/generators/virtualenv.html) and\n+[conan config install](http://docs.conan.io/en/latest/reference/commands/consumer/config.html#conan-config-install).\n+\n+However, when you start to support different devices it is quite easy to mess up you environment configuration and you can waste a lot of\n+time checking everything is setup correctly. To help with this we recently published a\n+[how-to in our documentation](http://docs.conan.io/en/latest/howtos/run_conan_in_docker.html) showing a good range of Docker images \n+ready to cross build.\n+\n+<p class=\"centered\">\n+    <img src=\"{{ site.url }}/assets/post_images/2018-04-23/title.png\" align=\"center\"\n+    width=\"600\" alt=\"Continuous integration for C/C++ embedded devices with Jenkins, Docker and Conan\"/>\n+</p>\n+\n+In this post we will show you how to use this images to setup a continuous integration job in Jenkins to cross build for ARM devices and\n+create a final application.\n+\n+## The application as a Conan package\n+\n+The application we will be building is a simple blink using the WiringPi library to interface the GPIO pins of a Raspberry Pi.\n+\n+    #include <iostream>\n+\n+    #ifdef WIRINGPI\n+        #include <wiringPi.h>\n+    #endif\n+\n+    int main (void)\n+    {\n+        #ifdef WIRINGPI\n+            wiringPiSetup();\n+            pinMode(0, OUTPUT);\n+        #endif\n+\n+        while(1)\n+        {\n+            std::cout << \"HIGH\" << std::endl;\n+            #ifdef WIRINGPI\n+                digitalWrite(0, HIGH);\n+                delay(500);\n+            #endif\n+\n+            std::cout << \"LOW\" << std::endl;\n+            #ifdef WIRINGPI\n+                digitalWrite(0, LOW);\n+                delay(500);\n+            #endif\n+        }\n+        return 0;\n+    }\n+\n+As you can see it is a quite simple application with some extra defines to avoid the WirignPi library in case it is not needed. We recently\n+included (wiringpi/2.46@conan/stable)[https://bintray.com/conan-community/conan/wiringpi%3Aconan] in conan-center so we will use it as an\n+optional dependency.\n+\n+Here you can see the full project: https://github.com/danimtb/conan-blink-app\n+\n+The recipe has some settings when using the armv7 configuration:\n+\n+    from conans import ConanFile, CMake\n+\n+\n+    class BlinkAppConan(ConanFile):\n+        name = \"BlinkApp\"\n+        version = \"0.1\"\n+        license = \"MIT\"\n+        description = \"Blink application\"\n+        settings = \"os\", \"compiler\", \"build_type\", \"arch\"\n+        url = \"https://github.com/conan-community/conan-blink-app.git\"\n+        exports_sources = \"CMakeLists.txt\", \"main.cpp\", \"LICENSE\"\n+        generators = \"cmake\"\n+\n+        def build(self):\n+            cmake = CMake(self)\n+            if self.settings.arch == \"armv7\":\n+                cmake.definitions[\"WIRINGPI\"] = True\n+            cmake.configure()\n+            cmake.build()\n+\n+        def package(self):\n+            self.copy(\"blinkapp\", src=\"bin\", dst=\"bin\")\n+\n+        def requirements(self):\n+            if self.settings.arch == \"armv7\":\n+                self.requires(\"wiringpi/2.46@conan/stable\")\n+\n+        def deploy(self):\n+            self.copy(\"blinkapp\", src=\"bin\", dst=\"bin\")\n+\n+The recipe is quite simple and there are just few points to remark:\n+\n+- There is a conditional in ``build()`` and ``requirements()``: This is to manage the optional dependency of WiringPi as said before.\n+- ``package()`` gets the application in order to make a package of it.\n+- The ``deploy()`` is there to [make the app deployable](https://docs.conan.io/en/latest/devtools/running_packages.html#deployable-packages)\n+  from the command line: ``conan install BlinkApp/0.1@danimtb/stable``\n+\n+## Setting up Jenkins and Artifactory in the CI machine\n+\n+For this post I am using a Linux machine where Jenkins together with Docker and Artifactory will be running. These are the things you will\n+need:\n+\n+- **Jenkins**: We will use Jenkins for the automation of Continuous Integration jobs.\n+\n+  I used these steps to install it:\n+\n+      $ wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -\n+      $ sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'\n+      $ sudo apt-get update\n+      $ sudo apt-get install jenkins\n+\n+    Check the (installation steps)[https://jenkins.io/doc/book/installing/] for other platforms.\n+\n+- **Artifactory**: We will use it as our binary repository to retieve and upload the Conan packages.\n+\n+  I chose the [latest release of Artifactory Community Edition for C/C++](http://blog.conan.io/2018/03/27/Announcing-JFrog-Artifactory-Community-Edition-C-C++.html) and went for the zip installation:\n+\n+    - Download zip: https://www.conan.io/downloads.html\n+    - Set ``JAVA_HOME=/usr/lib/jvm/default-java``\n+    - Launch Artifactory: ``bin/artifactory.sh``\n+\n+  The Artifactory instance should be accessible at: ``localhost:8081/artifactory``. Just after the configuration steps create a Conan\n+  repository called **conan-local**.\n+\n+- **Jenkins Artifactory Plug-in**:\n+\n+  Of course, if you are using Jenkins and Artifactory you should take advantage of this\n+  [plug-in](https://www.jfrog.com/confluence/display/RTF/Jenkins+Artifactory+Plug-in). Makes the integration much easier in the case of\n+  Conan to configure the remotes and credentials and to upload the metadata of the build.\n+\n+  Follow the installation steps and configure the plugin with your artifactory credentials:\n+\n+  <p class=\"centered\">\n+    <img src=\"{{ site.url }}/assets/post_images/2018-04-23/jenkins-artifactory-plugin.png\" align=\"center\"\n+    width=\"600\" alt=\"Configuration of the Jenkins Artifactory Plug-in\"/>\n+  </p>\n+\n+- **Docker**: Of course, we will be using Docker so we need to have it installed in the CI machine too.\n+\n+      $ apt-get install docker-ee\n+      $ Docker -v\n+      > Docker version 1.13.1, build 092cba3\n+\n+    Check the [isntallation steps](https://docs.docker.com/install/) for other platforms.\n+\n+## Creating the Jenkins pipeline\n+\n+There is related information on the web about how to run Jenkins inside a docker container or how to use the Docker plugin to launch builds.\n+However there is not much about how to run a local build inside a Docker container with Jenkins.\n+\n+This should not be too much complicated if you use a command line script for the build but it is so much better to use the pipeline syntax\n+to control the stages.\n+\n+Here you can see the *Jenkinsfile* to create this application:\n+\n+    def artifactory_name = \"artifactory_local\"\n+    def artifactory_repo = \"conan-local\"\n+    String docker_image = 'lasote/conangcc6-armv7'\n+\n+    node {\n+        docker.image(docker_image).inside('-v /tmp/:/tmp/ -v /home/danimtb/:/home/conan/danimtb/ --net=host') { \n+            def server = Artifactory.server artifactory_name\n+            def client = Artifactory.newConanClient() \n+            def serverName = client.remote.add server: server, repo: artifactory_repo\n+\n+            stage(\"Get project\") {\n+                checkout scm\n+            }\n+\n+            stage(\"Get dependencies and create app\") {\n+                String strCommand = \"create . danimtb/stable -pr /home/conan/.conan/profiles/default\"\n+                client.run(command: strCommand )\n+            }\n+\n+            stage(\"Upload packages\") {\n+                String command = \"upload BlinkApp* --all -r ${serverName} --confirm\"\n+                def b = client.run(command: command)\n+                b.env.collect()\n+                server.publishBuildInfo b\n+            }\n+        }\n+    }\n+\n+So this is where the magic starts.\n+\n+As you can see in the *Jenkinsfile* we are setting up the name or our artifactory instance already set up in the Jenkins Artifactory Plug-in\n+and the Conan repository name. We dont need to configure any cenrentials or use environment variable ``CONAN_PASSWORD``.\n+\n+The Docker image we are using in this case is ``lasote/conangcc6-armv7`` and it will run the build with some directory and network mappings:\n+\n+    docker.image(docker_image).inside('-v /tmp/:/tmp/ -v /home/danimtb/:/home/conan/danimtb/ --net=host')\n+\n+- ``/tmp/:/tmp/``: We will map the temp directory here as it is the directory Jenkins use to store the files and metadata of the build.\n+  This is useful to keep that information so that it does not get destroyed after the Docker image is stopped.\n+- ``/home/danimtb/:/home/conan/danimtb/``: This is just a dumb mapping of a local directory to allow the clone of the SCM just because I was using a local     git repository in this case.\n+- ``--net=host``: This maps the network of the container to the network of the host. This is needed to upload the packages to Artifactory.\n+\n+Those images are prepared with a profile inside ready to target the architecture:\n+\n+    String strCommand = \"create . danimtb/stable -pr /home/conan/.conan/profiles/default\"\n+    client.run(command: strCommand )\n+\n+## Triggering a build\n+\n+The trigger of the build can be done with normal Jenkins configuration. I used a self-contained one with a local git repository and a\n+multibranch job. This way Jenkins can check the repository for changes and trigger the job.\n+\n+<p class=\"centered\">\n+    <img src=\"{{ site.url }}/assets/post_images/2018-04-23/artifactory.png\" align=\"center\"\n+    width=\"600\" alt=\"BlinkApp package for armv7 uploaded to Artifactory\"/>\n+</p>\n+\n+The multibranch approach has also other benefits, as you can customize your *Jenkinsfile* in case you have a branch for testing and another\n+one stable, as you can change the ``user/channel`` provided in the ``conan create`` step.\n+\n+Any other approach is also valid, for example, you could trigger the build with a [GitHub hook](https://support.cloudbees.com/hc/en-us/articles/224543927-GitHub-Integration-Webhooks) and have the same behavior as if it was a CI build\n+running in Travis CI or AppVeyor.\n+\n+## Conclusions and improvements\n+\n+As you can see, the most complicated part of this is configuring Jenkins and Artifactory to run the complete example. However, if you\n+already have an instance of each one up and running this should be very straight forward.\n+\n+This is just an example of what kind of things you can do taking advantage of Docker and Jenkins and one way it can be used to automate the\n+package creation. This could be extended to the creation of libraries, bumping of package versions of a of downstream dependencies whenever\n+there is a new release upstream, running package tests...\n+\n+You can also create your own Docker image with the tools you want. Check our\n+[conan-docker-tools repository](https://github.com/conan-io/conan-docker-tools) to take some inspiration from the *Dockerfiles*.\n+\n+We are also aware of some improvements of this kind of set up, for example:\n+- The Docker image is pulled only the first time the job runs. It would much more convenient to pull it every time the way\n+  [conan-package-tools](https://github.com/conan-io/conan-package-tools#using-docker) does.\n+- There are some issues with the Jenkin Artifactory plug-in and ``CONAN_USER_HOME`` not fully working in all cases.","path":"_posts/2018-04-23-Continuous-integration-for-C-C++embedded-devices-with-jenkins-docker-and-conan.markdown","position":251,"original_position":251,"commit_id":"3aed58e11b7b3ba4dce0f752f9e81c528e1e36e9","original_commit_id":"3aed58e11b7b3ba4dce0f752f9e81c528e1e36e9","user":{"login":"danimtb","id":10808592,"avatar_url":"https://avatars1.githubusercontent.com/u/10808592?v=4","gravatar_id":"","url":"https://api.github.com/users/danimtb","html_url":"https://github.com/danimtb","followers_url":"https://api.github.com/users/danimtb/followers","following_url":"https://api.github.com/users/danimtb/following{/other_user}","gists_url":"https://api.github.com/users/danimtb/gists{/gist_id}","starred_url":"https://api.github.com/users/danimtb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/danimtb/subscriptions","organizations_url":"https://api.github.com/users/danimtb/orgs","repos_url":"https://api.github.com/users/danimtb/repos","events_url":"https://api.github.com/users/danimtb/events{/privacy}","received_events_url":"https://api.github.com/users/danimtb/received_events","type":"User","site_admin":false},"body":"Mention here the conan issue(s) related?","created_at":"2018-04-19T16:52:42Z","updated_at":"2018-04-19T16:58:11Z","html_url":"https://github.com/conan-io/conan-io.github.io/pull/40#discussion_r182814815","pull_request_url":"https://api.github.com/repos/conan-io/conan-io.github.io/pulls/40","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/conan-io/conan-io.github.io/pulls/comments/182814815"},"html":{"href":"https://github.com/conan-io/conan-io.github.io/pull/40#discussion_r182814815"},"pull_request":{"href":"https://api.github.com/repos/conan-io/conan-io.github.io/pulls/40"}}},"pull_request":{"url":"https://api.github.com/repos/conan-io/conan-io.github.io/pulls/40","id":182837721,"html_url":"https://github.com/conan-io/conan-io.github.io/pull/40","diff_url":"https://github.com/conan-io/conan-io.github.io/pull/40.diff","patch_url":"https://github.com/conan-io/conan-io.github.io/pull/40.patch","issue_url":"https://api.github.com/repos/conan-io/conan-io.github.io/issues/40","number":40,"state":"open","locked":false,"title":"Conan with Jenkins & docker","user":{"login":"danimtb","id":10808592,"avatar_url":"https://avatars1.githubusercontent.com/u/10808592?v=4","gravatar_id":"","url":"https://api.github.com/users/danimtb","html_url":"https://github.com/danimtb","followers_url":"https://api.github.com/users/danimtb/followers","following_url":"https://api.github.com/users/danimtb/following{/other_user}","gists_url":"https://api.github.com/users/danimtb/gists{/gist_id}","starred_url":"https://api.github.com/users/danimtb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/danimtb/subscriptions","organizations_url":"https://api.github.com/users/danimtb/orgs","repos_url":"https://api.github.com/users/danimtb/repos","events_url":"https://api.github.com/users/danimtb/events{/privacy}","received_events_url":"https://api.github.com/users/danimtb/received_events","type":"User","site_admin":false},"body":"","created_at":"2018-04-19T16:52:16Z","updated_at":"2018-04-19T16:58:11Z","closed_at":null,"merged_at":null,"merge_commit_sha":"61e726e6d9e211a9b2964f6f3a836a8e8660f4a9","assignee":{"login":"lasote","id":3807515,"avatar_url":"https://avatars1.githubusercontent.com/u/3807515?v=4","gravatar_id":"","url":"https://api.github.com/users/lasote","html_url":"https://github.com/lasote","followers_url":"https://api.github.com/users/lasote/followers","following_url":"https://api.github.com/users/lasote/following{/other_user}","gists_url":"https://api.github.com/users/lasote/gists{/gist_id}","starred_url":"https://api.github.com/users/lasote/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lasote/subscriptions","organizations_url":"https://api.github.com/users/lasote/orgs","repos_url":"https://api.github.com/users/lasote/repos","events_url":"https://api.github.com/users/lasote/events{/privacy}","received_events_url":"https://api.github.com/users/lasote/received_events","type":"User","site_admin":false},"assignees":[{"login":"lasote","id":3807515,"avatar_url":"https://avatars1.githubusercontent.com/u/3807515?v=4","gravatar_id":"","url":"https://api.github.com/users/lasote","html_url":"https://github.com/lasote","followers_url":"https://api.github.com/users/lasote/followers","following_url":"https://api.github.com/users/lasote/following{/other_user}","gists_url":"https://api.github.com/users/lasote/gists{/gist_id}","starred_url":"https://api.github.com/users/lasote/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lasote/subscriptions","organizations_url":"https://api.github.com/users/lasote/orgs","repos_url":"https://api.github.com/users/lasote/repos","events_url":"https://api.github.com/users/lasote/events{/privacy}","received_events_url":"https://api.github.com/users/lasote/received_events","type":"User","site_admin":false},{"login":"memsharded","id":15367152,"avatar_url":"https://avatars2.githubusercontent.com/u/15367152?v=4","gravatar_id":"","url":"https://api.github.com/users/memsharded","html_url":"https://github.com/memsharded","followers_url":"https://api.github.com/users/memsharded/followers","following_url":"https://api.github.com/users/memsharded/following{/other_user}","gists_url":"https://api.github.com/users/memsharded/gists{/gist_id}","starred_url":"https://api.github.com/users/memsharded/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/memsharded/subscriptions","organizations_url":"https://api.github.com/users/memsharded/orgs","repos_url":"https://api.github.com/users/memsharded/repos","events_url":"https://api.github.com/users/memsharded/events{/privacy}","received_events_url":"https://api.github.com/users/memsharded/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/conan-io/conan-io.github.io/pulls/40/commits","review_comments_url":"https://api.github.com/repos/conan-io/conan-io.github.io/pulls/40/comments","review_comment_url":"https://api.github.com/repos/conan-io/conan-io.github.io/pulls/comments{/number}","comments_url":"https://api.github.com/repos/conan-io/conan-io.github.io/issues/40/comments","statuses_url":"https://api.github.com/repos/conan-io/conan-io.github.io/statuses/3aed58e11b7b3ba4dce0f752f9e81c528e1e36e9","head":{"label":"danimtb:jenkins_docker","ref":"jenkins_docker","sha":"3aed58e11b7b3ba4dce0f752f9e81c528e1e36e9","user":{"login":"danimtb","id":10808592,"avatar_url":"https://avatars1.githubusercontent.com/u/10808592?v=4","gravatar_id":"","url":"https://api.github.com/users/danimtb","html_url":"https://github.com/danimtb","followers_url":"https://api.github.com/users/danimtb/followers","following_url":"https://api.github.com/users/danimtb/following{/other_user}","gists_url":"https://api.github.com/users/danimtb/gists{/gist_id}","starred_url":"https://api.github.com/users/danimtb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/danimtb/subscriptions","organizations_url":"https://api.github.com/users/danimtb/orgs","repos_url":"https://api.github.com/users/danimtb/repos","events_url":"https://api.github.com/users/danimtb/events{/privacy}","received_events_url":"https://api.github.com/users/danimtb/received_events","type":"User","site_admin":false},"repo":{"id":130242980,"name":"conan-io.github.io","full_name":"danimtb/conan-io.github.io","owner":{"login":"danimtb","id":10808592,"avatar_url":"https://avatars1.githubusercontent.com/u/10808592?v=4","gravatar_id":"","url":"https://api.github.com/users/danimtb","html_url":"https://github.com/danimtb","followers_url":"https://api.github.com/users/danimtb/followers","following_url":"https://api.github.com/users/danimtb/following{/other_user}","gists_url":"https://api.github.com/users/danimtb/gists{/gist_id}","starred_url":"https://api.github.com/users/danimtb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/danimtb/subscriptions","organizations_url":"https://api.github.com/users/danimtb/orgs","repos_url":"https://api.github.com/users/danimtb/repos","events_url":"https://api.github.com/users/danimtb/events{/privacy}","received_events_url":"https://api.github.com/users/danimtb/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/danimtb/conan-io.github.io","description":"Conan's Blog ","fork":true,"url":"https://api.github.com/repos/danimtb/conan-io.github.io","forks_url":"https://api.github.com/repos/danimtb/conan-io.github.io/forks","keys_url":"https://api.github.com/repos/danimtb/conan-io.github.io/keys{/key_id}","collaborators_url":"https://api.github.com/repos/danimtb/conan-io.github.io/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/danimtb/conan-io.github.io/teams","hooks_url":"https://api.github.com/repos/danimtb/conan-io.github.io/hooks","issue_events_url":"https://api.github.com/repos/danimtb/conan-io.github.io/issues/events{/number}","events_url":"https://api.github.com/repos/danimtb/conan-io.github.io/events","assignees_url":"https://api.github.com/repos/danimtb/conan-io.github.io/assignees{/user}","branches_url":"https://api.github.com/repos/danimtb/conan-io.github.io/branches{/branch}","tags_url":"https://api.github.com/repos/danimtb/conan-io.github.io/tags","blobs_url":"https://api.github.com/repos/danimtb/conan-io.github.io/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/danimtb/conan-io.github.io/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/danimtb/conan-io.github.io/git/refs{/sha}","trees_url":"https://api.github.com/repos/danimtb/conan-io.github.io/git/trees{/sha}","statuses_url":"https://api.github.com/repos/danimtb/conan-io.github.io/statuses/{sha}","languages_url":"https://api.github.com/repos/danimtb/conan-io.github.io/languages","stargazers_url":"https://api.github.com/repos/danimtb/conan-io.github.io/stargazers","contributors_url":"https://api.github.com/repos/danimtb/conan-io.github.io/contributors","subscribers_url":"https://api.github.com/repos/danimtb/conan-io.github.io/subscribers","subscription_url":"https://api.github.com/repos/danimtb/conan-io.github.io/subscription","commits_url":"https://api.github.com/repos/danimtb/conan-io.github.io/commits{/sha}","git_commits_url":"https://api.github.com/repos/danimtb/conan-io.github.io/git/commits{/sha}","comments_url":"https://api.github.com/repos/danimtb/conan-io.github.io/comments{/number}","issue_comment_url":"https://api.github.com/repos/danimtb/conan-io.github.io/issues/comments{/number}","contents_url":"https://api.github.com/repos/danimtb/conan-io.github.io/contents/{+path}","compare_url":"https://api.github.com/repos/danimtb/conan-io.github.io/compare/{base}...{head}","merges_url":"https://api.github.com/repos/danimtb/conan-io.github.io/merges","archive_url":"https://api.github.com/repos/danimtb/conan-io.github.io/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/danimtb/conan-io.github.io/downloads","issues_url":"https://api.github.com/repos/danimtb/conan-io.github.io/issues{/number}","pulls_url":"https://api.github.com/repos/danimtb/conan-io.github.io/pulls{/number}","milestones_url":"https://api.github.com/repos/danimtb/conan-io.github.io/milestones{/number}","notifications_url":"https://api.github.com/repos/danimtb/conan-io.github.io/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/danimtb/conan-io.github.io/labels{/name}","releases_url":"https://api.github.com/repos/danimtb/conan-io.github.io/releases{/id}","deployments_url":"https://api.github.com/repos/danimtb/conan-io.github.io/deployments","created_at":"2018-04-19T16:23:30Z","updated_at":"2018-04-19T16:23:33Z","pushed_at":"2018-04-19T16:50:56Z","git_url":"git://github.com/danimtb/conan-io.github.io.git","ssh_url":"git@github.com:danimtb/conan-io.github.io.git","clone_url":"https://github.com/danimtb/conan-io.github.io.git","svn_url":"https://github.com/danimtb/conan-io.github.io","homepage":"http://blog.conan.io","size":4835,"stargazers_count":0,"watchers_count":0,"language":"CSS","has_issues":false,"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":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"develop"}},"base":{"label":"conan-io:master","ref":"master","sha":"13a6a7e71e3aa5ad3736b505ec2e227c48e1f295","user":{"login":"conan-io","id":15212165,"avatar_url":"https://avatars3.githubusercontent.com/u/15212165?v=4","gravatar_id":"","url":"https://api.github.com/users/conan-io","html_url":"https://github.com/conan-io","followers_url":"https://api.github.com/users/conan-io/followers","following_url":"https://api.github.com/users/conan-io/following{/other_user}","gists_url":"https://api.github.com/users/conan-io/gists{/gist_id}","starred_url":"https://api.github.com/users/conan-io/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/conan-io/subscriptions","organizations_url":"https://api.github.com/users/conan-io/orgs","repos_url":"https://api.github.com/users/conan-io/repos","events_url":"https://api.github.com/users/conan-io/events{/privacy}","received_events_url":"https://api.github.com/users/conan-io/received_events","type":"Organization","site_admin":false},"repo":{"id":48793736,"name":"conan-io.github.io","full_name":"conan-io/conan-io.github.io","owner":{"login":"conan-io","id":15212165,"avatar_url":"https://avatars3.githubusercontent.com/u/15212165?v=4","gravatar_id":"","url":"https://api.github.com/users/conan-io","html_url":"https://github.com/conan-io","followers_url":"https://api.github.com/users/conan-io/followers","following_url":"https://api.github.com/users/conan-io/following{/other_user}","gists_url":"https://api.github.com/users/conan-io/gists{/gist_id}","starred_url":"https://api.github.com/users/conan-io/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/conan-io/subscriptions","organizations_url":"https://api.github.com/users/conan-io/orgs","repos_url":"https://api.github.com/users/conan-io/repos","events_url":"https://api.github.com/users/conan-io/events{/privacy}","received_events_url":"https://api.github.com/users/conan-io/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/conan-io/conan-io.github.io","description":"Conan's Blog ","fork":false,"url":"https://api.github.com/repos/conan-io/conan-io.github.io","forks_url":"https://api.github.com/repos/conan-io/conan-io.github.io/forks","keys_url":"https://api.github.com/repos/conan-io/conan-io.github.io/keys{/key_id}","collaborators_url":"https://api.github.com/repos/conan-io/conan-io.github.io/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/conan-io/conan-io.github.io/teams","hooks_url":"https://api.github.com/repos/conan-io/conan-io.github.io/hooks","issue_events_url":"https://api.github.com/repos/conan-io/conan-io.github.io/issues/events{/number}","events_url":"https://api.github.com/repos/conan-io/conan-io.github.io/events","assignees_url":"https://api.github.com/repos/conan-io/conan-io.github.io/assignees{/user}","branches_url":"https://api.github.com/repos/conan-io/conan-io.github.io/branches{/branch}","tags_url":"https://api.github.com/repos/conan-io/conan-io.github.io/tags","blobs_url":"https://api.github.com/repos/conan-io/conan-io.github.io/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/conan-io/conan-io.github.io/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/conan-io/conan-io.github.io/git/refs{/sha}","trees_url":"https://api.github.com/repos/conan-io/conan-io.github.io/git/trees{/sha}","statuses_url":"https://api.github.com/repos/conan-io/conan-io.github.io/statuses/{sha}","languages_url":"https://api.github.com/repos/conan-io/conan-io.github.io/languages","stargazers_url":"https://api.github.com/repos/conan-io/conan-io.github.io/stargazers","contributors_url":"https://api.github.com/repos/conan-io/conan-io.github.io/contributors","subscribers_url":"https://api.github.com/repos/conan-io/conan-io.github.io/subscribers","subscription_url":"https://api.github.com/repos/conan-io/conan-io.github.io/subscription","commits_url":"https://api.github.com/repos/conan-io/conan-io.github.io/commits{/sha}","git_commits_url":"https://api.github.com/repos/conan-io/conan-io.github.io/git/commits{/sha}","comments_url":"https://api.github.com/repos/conan-io/conan-io.github.io/comments{/number}","issue_comment_url":"https://api.github.com/repos/conan-io/conan-io.github.io/issues/comments{/number}","contents_url":"https://api.github.com/repos/conan-io/conan-io.github.io/contents/{+path}","compare_url":"https://api.github.com/repos/conan-io/conan-io.github.io/compare/{base}...{head}","merges_url":"https://api.github.com/repos/conan-io/conan-io.github.io/merges","archive_url":"https://api.github.com/repos/conan-io/conan-io.github.io/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/conan-io/conan-io.github.io/downloads","issues_url":"https://api.github.com/repos/conan-io/conan-io.github.io/issues{/number}","pulls_url":"https://api.github.com/repos/conan-io/conan-io.github.io/pulls{/number}","milestones_url":"https://api.github.com/repos/conan-io/conan-io.github.io/milestones{/number}","notifications_url":"https://api.github.com/repos/conan-io/conan-io.github.io/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/conan-io/conan-io.github.io/labels{/name}","releases_url":"https://api.github.com/repos/conan-io/conan-io.github.io/releases{/id}","deployments_url":"https://api.github.com/repos/conan-io/conan-io.github.io/deployments","created_at":"2015-12-30T09:39:22Z","updated_at":"2018-04-13T00:09:49Z","pushed_at":"2018-04-19T16:52:16Z","git_url":"git://github.com/conan-io/conan-io.github.io.git","ssh_url":"git@github.com:conan-io/conan-io.github.io.git","clone_url":"https://github.com/conan-io/conan-io.github.io.git","svn_url":"https://github.com/conan-io/conan-io.github.io","homepage":"http://blog.conan.io","size":4835,"stargazers_count":1,"watchers_count":1,"language":"CSS","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":5,"mirror_url":null,"archived":false,"open_issues_count":3,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":5,"open_issues":3,"watchers":1,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/conan-io/conan-io.github.io/pulls/40"},"html":{"href":"https://github.com/conan-io/conan-io.github.io/pull/40"},"issue":{"href":"https://api.github.com/repos/conan-io/conan-io.github.io/issues/40"},"comments":{"href":"https://api.github.com/repos/conan-io/conan-io.github.io/issues/40/comments"},"review_comments":{"href":"https://api.github.com/repos/conan-io/conan-io.github.io/pulls/40/comments"},"review_comment":{"href":"https://api.github.com/repos/conan-io/conan-io.github.io/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/conan-io/conan-io.github.io/pulls/40/commits"},"statuses":{"href":"https://api.github.com/repos/conan-io/conan-io.github.io/statuses/3aed58e11b7b3ba4dce0f752f9e81c528e1e36e9"}},"author_association":"NONE"}}
{"actor":{"display_login":"danimtb"}}