)]}'
{
  "log": [
    {
      "commit": "4d3951c56113d0a970e7f497bb79633466b18681",
      "tree": "5db08c8fe4d7cbc05c62538dadba0646640fe01f",
      "parents": [
        "1c15df01827e560293863531abf9a8631c564473"
      ],
      "author": {
        "name": "Sergey Kulanov",
        "email": "skulanov@mirantis.com",
        "time": "Thu Nov 24 13:58:15 2016 +0200"
      },
      "committer": {
        "name": "Sergey Kulanov",
        "email": "skulanov@mirantis.com",
        "time": "Thu Nov 24 13:58:15 2016 +0200"
      },
      "message": "Add com.mirantis.targetImg property to docker image property\n\ncom.mirantis.targetImg property allows to search docker\nartifacts by image name, for example\n\n  def properties \u003d [\n    \u0027com.mirantis.gerritChangeId\u0027: \"${env.GERRIT_CHANGE_ID}\",\n    \u0027com.mirantis.gerritPatchsetNumber\u0027: \"${env.GERRIT_PATCHSET_NUMBER}\",\n    \u0027com.mirantis.gerritChangeNumber\u0027 : \"${env.GERRIT_CHANGE_NUMBER}\",\n    \u0027com.mirantis.targetImg\u0027: \"${projectNamespace}/calico/node\"\n  ]\n\nChange-Id: I8f6cdb0b90edb263e2d24e987eee8b8be2e54df3\n"
    },
    {
      "commit": "8cd6d22a439db05e6edb5fab35d53671e8c6ea20",
      "tree": "a6c18e092a3b23af78631bfeca0353c44ce4405b",
      "parents": [
        "8567272fbc1f2df7e1faafb00ab05e8b5a700c8b"
      ],
      "author": {
        "name": "Sergey Kulanov",
        "email": "skulanov@mirantis.com",
        "time": "Thu Nov 17 13:42:47 2016 +0200"
      },
      "committer": {
        "name": "Sergey Kulanov",
        "email": "skulanov@mirantis.com",
        "time": "Thu Nov 17 13:42:47 2016 +0200"
      },
      "message": "Extend uploadImageToArtifactory function\n\nWe need to publish BuildInfo object as well (as for binary) for\ndocker images.\n1. Replace:\n    String artifactoryURL\n   by\n    ArtifactoryServer server\n2. If buildInfo is defined, let\u0027s publish it to artifactory\n\nChange-Id: Iadb724307b81a8f40cf1852b909bbb25208dc143\n"
    },
    {
      "commit": "8567272fbc1f2df7e1faafb00ab05e8b5a700c8b",
      "tree": "84ffbf23fb44772df36b0bd7db1db6b98f5d5392",
      "parents": [
        "c70f1c21c8e9ebd7776ed4c065fd1aa05115ba3c"
      ],
      "author": {
        "name": "Sergey Kulanov",
        "email": "skulanov@mirantis.com",
        "time": "Wed Nov 16 17:46:58 2016 +0200"
      },
      "committer": {
        "name": "Sergey Kulanov",
        "email": "skulanov@mirantis.com",
        "time": "Wed Nov 16 19:05:22 2016 +0200"
      },
      "message": "Update getGitDescribe function\n\nParametrize getGitDescribe(Boolean useShort \u003d false):\n  useShort Boolean, returns String in format:\n       false (Default): {gitTag}-{numCommits}-g{gitsha}\n       true:            {gitTag}-{numCommits}\n\nChange-Id: Ibf2e90f2fdef0611c3622b817d5f4e174fa90200\n"
    },
    {
      "commit": "c70f1c21c8e9ebd7776ed4c065fd1aa05115ba3c",
      "tree": "661410ac8d0e544c6d19e6284b96531557662a3b",
      "parents": [
        "edba5a547578272921ae33929424e36173f68ca1"
      ],
      "author": {
        "name": "Sergey Kulanov",
        "email": "skulanov@mirantis.com",
        "time": "Wed Nov 16 13:05:20 2016 +0200"
      },
      "committer": {
        "name": "Sergey Kulanov",
        "email": "skulanov@mirantis.com",
        "time": "Wed Nov 16 13:05:20 2016 +0200"
      },
      "message": "Artifactory refactoring\n\n* Define new mandatory properties in artifactory:\n  \u0027com.mirantis.buildName\u0027:\"${env.JOB_NAME}\"\n  \u0027com.mirantis.buildNumber\u0027: \"${env.BUILD_NUMBER}\"\n\n* All mandatory properties MUST be the same both for binary\n  and docker images\n\n* Remove overloaded uriByProperties() with String as second\n  paramter, it\u0027s better to use the original one with LinkedHashMap\n\nChange-Id: I2c6ea7e4fd035a1b68122ee4bc00562c0f4d8814\n"
    },
    {
      "commit": "edba5a547578272921ae33929424e36173f68ca1",
      "tree": "3c5a6babe9cb57de0de25600d1ef632a6a1e37f2",
      "parents": [
        "91d8def7ed5c57ea5d4cadf375ecb7e8a9fb6105"
      ],
      "author": {
        "name": "Denis Egorenko",
        "email": "degorenko@mirantis.com",
        "time": "Tue Nov 15 19:55:56 2016 +0300"
      },
      "committer": {
        "name": "Denis Egorenko",
        "email": "degorenko@mirantis.com",
        "time": "Tue Nov 15 19:58:00 2016 +0300"
      },
      "message": "Update MCPArtifactory package according to actual code in Tools\n\nMinor update of uploadImageToArtifactory function:\n- explicity set type of function parameters;\n- remove external ENV var;\n- add reminder what should be improved;\n\nChange-Id: I116294a317dcf610f9fb4043c48593ea96212b04\n"
    },
    {
      "commit": "91d8def7ed5c57ea5d4cadf375ecb7e8a9fb6105",
      "tree": "e5d080c530b30b16e61a5c38a66938a1c9fa79f3",
      "parents": [
        "90d4e679b3ced71175587ba95dba99635ace4df5"
      ],
      "author": {
        "name": "Sergey Kulanov",
        "email": "skulanov@mirantis.com",
        "time": "Tue Nov 15 13:53:17 2016 +0200"
      },
      "committer": {
        "name": "Sergey Kulanov",
        "email": "skulanov@mirantis.com",
        "time": "Tue Nov 15 15:42:12 2016 +0200"
      },
      "message": "Fix uploadBinariesToArtifactory function\n\nChange-Id: I51eac8b39d772dc84a6166f5d66c7e8f316afe41\n"
    },
    {
      "commit": "90d4e679b3ced71175587ba95dba99635ace4df5",
      "tree": "9575beb9488f81e5bf5746e5a5fa986cfac126fc",
      "parents": [
        "b28156cd51cef8f316f4fe339f77c1b0fc230b46"
      ],
      "author": {
        "name": "Ruslan Kamaldinov",
        "email": "rkamaldinov@mirantis.com",
        "time": "Fri Nov 11 18:31:00 2016 +0300"
      },
      "committer": {
        "name": "Ruslan Kamaldinov",
        "email": "rkamaldinov@mirantis.com",
        "time": "Mon Nov 14 18:55:27 2016 +0300"
      },
      "message": "Refactor structure of Pipeline library\n\n* Moved everything under com.mirantis.mcp package\n* Functions are grouped under different files, each with specific\n  functionality (e.g Artifactory, Docker, Git, etc)\n* Tools.groovy remains as is to avoid breaking existing jobs that\n  use it\n\nNext steps:\n* Modify existing pipelines to use functions from new package\n* Gradually get rid of Tools.groovy\n\nChange-Id: I56386f994666baa1c6db51b27beef4de4284ecb8\n"
    },
    {
      "commit": "b28156cd51cef8f316f4fe339f77c1b0fc230b46",
      "tree": "ef7adf29ba8360321a3508069b0c9ed76d8780f3",
      "parents": [
        "4932b17cb762e5c02d8f76ef5ec2b08e07d781ad"
      ],
      "author": {
        "name": "Alexander Saprykin",
        "email": "asaprykin@mirantis.com",
        "time": "Wed Nov 09 11:09:48 2016 +0100"
      },
      "committer": {
        "name": "Sergey Kulanov",
        "email": "skulanov@mirantis.com",
        "time": "Thu Nov 10 15:42:12 2016 +0000"
      },
      "message": "Add function getGitDescribe\n\nFunction getGitCommitDescribe describes commit based on\nrecent git tag\n\nChange-Id: I2e83923fcfb0800a4a1b5d7b5fc67942d02ed051\n"
    },
    {
      "commit": "d4e31281bfea4a36052aad5e656a12c80e824328",
      "tree": "6c73519aff368b16fbcc4b3f55fb860909590e74",
      "parents": [
        "9cef9255475b22624f9da80fc964661940a2c5cf"
      ],
      "author": {
        "name": "Sergey Kulanov",
        "email": "skulanov@mirantis.com",
        "time": "Tue Nov 08 17:39:19 2016 +0200"
      },
      "committer": {
        "name": "Sergey Kulanov",
        "email": "skulanov@mirantis.com",
        "time": "Tue Nov 08 17:43:45 2016 +0200"
      },
      "message": "Add uriByProperties() with String as second parameter\n\nAdd overloaded function uriByProperties() which allows to pass\nproperties for search in format\n   prop1\u003dval1\u0026prop2\u003dval2\u0026prop3\u003dval3\n\nExample:\n  // return prop1\u003dval1;prop2;val2\n  def properties \u003d tools.getBinaryBuildProperties().replaceAll(\";\", \"\u0026\")\n  // Search for an artifact with required properties\n  def artifactURI \u003d tools.uriByProperties(env.ARTIFACTORY_URL, properties)\n\nChange-Id: I112e85309d92a37963b9bb35aa07f0c8cb897b2f\n"
    },
    {
      "commit": "20c8b1307b841582a5f3d1e89c8ed3209c739a6c",
      "tree": "fa020644b9c06d3f642457a8a27953bb428e22ae",
      "parents": [
        "00a84f6cbf22ca214aaa78f47dd880f3090cbdb6"
      ],
      "author": {
        "name": "Sergey Kulanov",
        "email": "skulanov@mirantis.com",
        "time": "Wed Nov 02 13:24:32 2016 +0200"
      },
      "committer": {
        "name": "Sergey Kulanov",
        "email": "skulanov@mirantis.com",
        "time": "Wed Nov 02 13:58:12 2016 +0200"
      },
      "message": "Add setDockerLabels method\n\n* Add mandatory LABEL to the end of the Dockerfile\n* User can also add some custom properties\n\n1. Simple usage, which adds mandatory properties to Dockerfile which\nis located in current directory\n   tools.setDockerfileLabels()\n\n2. Extended usage, add Labels to calico ctl and node images\n   def properties \u003d [\n     \"CALICO_NODE_IMAGE_REPO\u003d${calicoNodeImageRepo}\",\n     \"CALICOCTL_IMAGE_REPO\u003d${calicoCtlImageRepo}\",\n     \"CALICO_VERSION\u003d${calicoVersion}\"\n   ]\n   tools.setDockerfileLabels(\"./calicoctl/Dockerfile\", properties)\n   tools.setDockerfileLabels(\"./calico_node/Dockerfile\", properties)\n\nChange-Id: I0f9e6b83d4ffe5fe6a5ff02da50658b9eded5824\n"
    },
    {
      "commit": "4f2fbcbaf8d498722e0549911be91142b23b5c33",
      "tree": "5febf769d0714c66b34055a0dafcec31cd59b770",
      "parents": [
        "e3552687466f62578ff7384f7061b903b71d3741"
      ],
      "author": {
        "name": "Sergey Kulanov",
        "email": "skulanov@mirantis.com",
        "time": "Fri Oct 28 14:25:20 2016 +0300"
      },
      "committer": {
        "name": "Sergey Kulanov",
        "email": "skulanov@mirantis.com",
        "time": "Fri Oct 28 15:22:49 2016 +0300"
      },
      "message": "Add timestamp generator\n\nCan be used for artifacts versioning\n\nChange-Id: I3b80b711740f0c9da7400e91a72caee87c0d5464\n"
    },
    {
      "commit": "e3552687466f62578ff7384f7061b903b71d3741",
      "tree": "31675943296f74d9d5d903c17d320bc76202301b",
      "parents": [
        "00d743445c9306e4c8c56300ec1cc41bb54a7b0c"
      ],
      "author": {
        "name": "Denis Egorenko",
        "email": "degorenko@mirantis.com",
        "time": "Tue Oct 18 13:29:29 2016 +0300"
      },
      "committer": {
        "name": "Denis Egorenko",
        "email": "degorenko@mirantis.com",
        "time": "Fri Oct 28 10:30:21 2016 +0000"
      },
      "message": "Extend pipeline library for Artifactory usage\n\nThis patch extends pipeline library with functions for working\nwith Artifactory repos and artifacts.\n\nAlso adds examples of usage.\n\nChange-Id: I641d00a69028b67f35f8455c7ad235591ef27496\n"
    },
    {
      "commit": "1835afe0e26087df344e523d7ca7bcc7fd8e4c72",
      "tree": "eb1f894f68a0a216b2088f51ef7ca204e6c8a286",
      "parents": [
        "2202ad28229f020bab263a8a43288a7db6a2d37e"
      ],
      "author": {
        "name": "Sergey Kulanov",
        "email": "skulanov@mirantis.com",
        "time": "Wed Oct 19 16:53:14 2016 +0300"
      },
      "committer": {
        "name": "Sergey Kulanov",
        "email": "skulanov@mirantis.com",
        "time": "Wed Oct 19 16:53:14 2016 +0300"
      },
      "message": "Parse HEAD of current directory and return commit hash\n\nChange-Id: If8d5eae45dc8e60708f93b6e259ae6694b69ba64\n"
    },
    {
      "commit": "64bc88a761ba9acdd8aae8940ae8e17f921f823c",
      "tree": "f6415b104ffc4b30d9e8d6e2b420be678ff6d4db",
      "parents": [
        "247c4e733e3f1035b59b9844de4a4b3acc605c78"
      ],
      "author": {
        "name": "Sergey Kulanov",
        "email": "skulanov@mirantis.com",
        "time": "Tue Oct 18 16:26:34 2016 +0300"
      },
      "committer": {
        "name": "Sergey Kulanov",
        "email": "skulanov@mirantis.com",
        "time": "Tue Oct 18 16:26:34 2016 +0300"
      },
      "message": "Rename property gitSha to gerritPatchsetRevision\n\nBinary property gitSha should not confuse, so we must to rename\nit to gerritPatchsetRevision since it comes from variable\nGERRIT_PATCHSET_REVISION\n\nChange-Id: Ieb388fe3162019e8ac3fb4b88756fe183bfa3ec7\n"
    },
    {
      "commit": "56d0d05728a4cb04aeceae006b2999c0d0dd9e5e",
      "tree": "21866efbfc86d669b897ee47d5fd38c66b7fc759",
      "parents": [
        "0a7c17c7ee4b1a092e0e1f68bff08fc3067c8fbc"
      ],
      "author": {
        "name": "Sergey Kulanov",
        "email": "skulanov@mirantis.com",
        "time": "Thu Oct 13 15:48:56 2016 +0300"
      },
      "committer": {
        "name": "Sergey Kulanov",
        "email": "skulanov@mirantis.com",
        "time": "Mon Oct 17 12:14:09 2016 +0300"
      },
      "message": "Implement getBinaryBuildProperties method\n\n1. getBinaryBuildProperties() should be used to define mandatory\nproperties for binary artifact, which are:\n\n    \"gerritProject\u003d${env.GERRIT_PROJECT}\",\n    \"gerritChangeNumber\u003d${env.GERRIT_CHANGE_NUMBER}\",\n    \"gerritPatchsetNumber\u003d${env.GERRIT_PATCHSET_NUMBER}\",\n    \"gerritChangeId\u003d${env.GERRIT_CHANGE_ID}\",\n    \"gitSha\u003d${env.GERRIT_PATCHSET_REVISION}\"\n\n2. User can add some custom properties, e.g:\n\ndef properties \u003d tools.getBinaryBuildProperties(\n   [\"test\u003d123\",\n    \"prop1\u003dval1\",\n     prop2\u003dval2\"\n   ])\n\n3. The resulting values will be the string in props format with\nnamespace com.mirantis, e.g:\n\n  gerritProject\u003dasd;gerritChangeNumber\u003d123;gerritChangeId\u003dddd\n\n4. How to use:\n\n    def tools \u003d new ci.mcp.Tools()\n    ...\n    def buildInfo \u003d Artifactory.newBuildInfo()\n    ...\n    def properties \u003d tools.getBinaryBuildProperties()\n    ...\n    // Create the upload spec.\n    def uploadSpec \u003d \"\"\"{\n        \"files\": [\n                {\n                    \"pattern\": \"**\",\n                    \"target\": \"some/target\",\n                    \"props\": \"${properties}\"\n                }\n            ]\n        }\"\"\"\n    server.upload(uploadSpec, buildInfo)\n    server.publishBuildInfo buildInfo\n\nChange-Id: I6dcc879c10b7fccf6dfcd8cb3ce86f52311c1a5a\n"
    },
    {
      "commit": "1bbd3610f04603b77eff7b999c0d157db214ffb6",
      "tree": "44343861e77f1a969cd1ec70a554dee0a7e2ca4c",
      "parents": [
        "72f763e29d878108b67cfde70214e3f2a02fc594"
      ],
      "author": {
        "name": "Sergey Kulanov",
        "email": "skulanov@mirantis.com",
        "time": "Fri Sep 30 11:40:11 2016 +0300"
      },
      "committer": {
        "name": "Sergey Kulanov",
        "email": "skulanov@mirantis.com",
        "time": "Fri Sep 30 11:40:11 2016 +0300"
      },
      "message": "Add getCommandBuilder command\n\nWe need to have an ability to build command line options for\ndocker command, e.g:\n  docker build --build-arg CALICO_REPO\u003drepo \\\n               --build-arg CALICO_VER\u003dmcp-0.1 \\\n               --build-arg LIBCALICO_REPO\u003drepo \\\n               --build-arg LIBCALICO_VER\u003dmcp-0.1\n               ...\n\nThis can be easily done by groovy and works in jenkins\n   [\"opt1\", \"opt2\", \"opt3\"].collect{ \"--build-arg \" + it }.join(\" \")\n\nbut doesn\u0027t for pipelines because of [1], so we need to\nhave our own bicycle - the first one, but not the last\n\n[1]. https://issues.jenkins-ci.org/browse/JENKINS-26481\n\nChange-Id: I5e06b305fc7e3d0c26c847779ec8a1ad81850e51\n"
    },
    {
      "commit": "9021bbe21a0f05d2bc042da5eac3aaab93c3a6fa",
      "tree": "0d2cdbf16e8ea1f1fde940aecea255e0a3bd0b33",
      "parents": [
        "6e41b527c99cd0495636f3418493ed1030e184f1"
      ],
      "author": {
        "name": "Igor Belikov",
        "email": "ibelikov@mirantis.com",
        "time": "Wed Sep 28 19:22:20 2016 +0300"
      },
      "committer": {
        "name": "Igor Belikov",
        "email": "ibelikov@mirantis.com",
        "time": "Thu Sep 29 15:33:37 2016 +0300"
      },
      "message": "Initial structure and basic funtions\n\n* Create initial repository structure\n* Add gerritPatchsetCheckout and runTox global functions\n\nChange-Id: I3c716e12dec76bb405d33501bc260425419814be\n"
    }
  ]
}
