Add medic command to download BuildBot CI logs

Project: http://git-wip-us.apache.org/repos/asf/cordova-medic/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-medic/commit/cfe4e828
Tree: http://git-wip-us.apache.org/repos/asf/cordova-medic/tree/cfe4e828
Diff: http://git-wip-us.apache.org/repos/asf/cordova-medic/diff/cfe4e828

Branch: refs/heads/master
Commit: cfe4e828fb392709ee97f4da1df46264e6d0faa7
Parents: 4cbdf65
Author: Nikhil Khandelwal <nikhi...@microsoft.com>
Authored: Tue Apr 12 16:45:39 2016 -0700
Committer: Nikhil Khandelwal <nikhi...@microsoft.com>
Committed: Tue Apr 19 10:46:06 2016 -0700

----------------------------------------------------------------------
 medic/medic-downloadlogs.js | 83 ++++++++++++++++++++++++++++++++++++++++
 medic/medic.js              |  1 +
 package.json                |  3 +-
 3 files changed, 86 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-medic/blob/cfe4e828/medic/medic-downloadlogs.js
----------------------------------------------------------------------
diff --git a/medic/medic-downloadlogs.js b/medic/medic-downloadlogs.js
new file mode 100644
index 0000000..2e58c40
--- /dev/null
+++ b/medic/medic-downloadlogs.js
@@ -0,0 +1,83 @@
+var path = require('path'),
+    fs = require('fs'),
+    https = require('https'),
+    optimist = require('optimist'),
+    q = require('Q'),
+    mkdirp = require('mkdirp'),
+    util = require('util');
+
+var SERVER = "https://ci.apache.org";;
+var BUILDERS = ["cordova-windows-store8.1", "cordova-ios", 
"cordova-windows-phone8.1", "cordova-android-osx","cordova-android-win"];
+var STEPS = ["running-tests", "gathering-logs", "getting-test-results"];
+
+function downloadLogs(outputDir) {
+    var counter = 0;
+    var builderPromises = BUILDERS.map(function(builder) {
+        var buildInfoFile = path.join(outputDir, builder + ".json");
+       
+        //Donwload JSON data on all builds - 
https://ci.apache.org/json/builders/cordova-ios/builds/_all
+        var buildInfoUrl = util.format("%s/json/builders/%s/builds/_all", 
SERVER, builder);
+        return download(buildInfoUrl, buildInfoFile).then(function() {
+            var buildInfo = JSON.parse(fs.readFileSync(buildInfoFile));
+            var promises = [];
+            for(var buildNumber in buildInfo) {
+                // find all the build steps that have logs 
+                var steps = buildInfo[buildNumber].steps.filter(function 
(step) {
+                        return STEPS.indexOf(step.name) !== -1 && step.logs && 
step.logs.length > 0;
+                    });
+                steps.forEach(function (step) {
+                    var filename = util.format("%s_%s_%s_stdio.log", builder, 
buildNumber, step.name);
+                    if(step.logs[0].length !== 2) {
+                        throw new Error("Unexpected build info schema");
+                    }
+                    counter++;
+                    var downloadPromise = download(step.logs[0][1] + "/text", 
path.join(outputDir, filename));
+                    promises.push(downloadPromise);
+                });
+            }
+            return q.all(promises);
+        });
+    });
+    
+    q.all(builderPromises).done(function() {
+        console.log("Downloaded " + counter + " logs to " + outputDir);
+    }, function(error) {
+        console.log("Error: " + error);
+    });
+}
+
+function download(url, filename){
+    var defer = q.defer();
+    
+    https.get(url, function(res) {
+        res.setEncoding('utf-8');
+        if (res.statusCode == 200) {
+            var file = fs.createWriteStream(filename);
+            res.pipe(file);
+            file.on('finish', function() {
+               console.log(url + " -> " + filename);
+               file.end();
+               defer.resolve(); 
+            });
+        } else {
+            defer.reject(url + " Status code: " + res.statusCode);
+        }
+    }).on('error', function(error) {
+        defer.reject(url + " Error: " + error);
+    });
+    
+    return defer.promise;   
+}
+
+// main
+function main() {
+    // get args
+    var argv = optimist
+        .usage("Usage: $0 --outpdir {path}")
+        .default("outputDir", ".")
+        .argv;
+        
+    mkdirp.sync(argv.outputDir);
+    downloadLogs(argv.outputDir);
+}
+main();

http://git-wip-us.apache.org/repos/asf/cordova-medic/blob/cfe4e828/medic/medic.js
----------------------------------------------------------------------
diff --git a/medic/medic.js b/medic/medic.js
index 206c856..2566ead 100755
--- a/medic/medic.js
+++ b/medic/medic.js
@@ -37,6 +37,7 @@ function main() {
         .command("check",    "analyze test runs from a medic DB")
         .command("log",      "output platform-specific logs to console")
         .command("appium",   "run Appium tests")
+        .command("downloadLogs", "download logs from the CI server")
         .parse(process.argv);
 }
 

http://git-wip-us.apache.org/repos/asf/cordova-medic/blob/cfe4e828/package.json
----------------------------------------------------------------------
diff --git a/package.json b/package.json
index ff03c55..594a176 100644
--- a/package.json
+++ b/package.json
@@ -19,7 +19,8 @@
     "shelljs": "^0.4.0",
     "tree-kill": "^1.0.0",
     "unorm": "^1.4.1",
-    "wd": "^0.3.11"
+    "wd": "^0.3.11",
+    "mkdirp": "^0.5.1"
   },
   "subdomain": "cordova.medic",
   "engines": {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@cordova.apache.org
For additional commands, e-mail: commits-h...@cordova.apache.org

Reply via email to