From 89a49451624239f765c9cd4585329f0442e3a8d2 Mon Sep 17 00:00:00 2001
From: blavenie <benoit.lavenier@e-is.pro>
Date: Mon, 13 Jun 2016 17:15:39 +0200
Subject: [PATCH] - prepare next release 0.1.17 - Add gulp task for deployment
 to playstore - Add release deployment script

---
 .gitignore                                   |   1 +
 config.xml                                   | 103 +++++++++----------
 gulpfile.js                                  |  34 ++++++
 hooks/after_build/090_deploy_to_playstore.js |  68 ++++++++++++
 package.json                                 |   3 +-
 release.sh                                   |  10 ++
 scripts/afterBuild.js                        |  23 -----
 www/js/config.js                             |   2 +-
 8 files changed, 167 insertions(+), 77 deletions(-)
 create mode 100755 hooks/after_build/090_deploy_to_playstore.js
 create mode 100644 release.sh
 delete mode 100644 scripts/afterBuild.js

diff --git a/.gitignore b/.gitignore
index 71e1d6be..8ed8afb5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,3 +21,4 @@ www/lib/angular-moment
 www/lib/moment
 www/lib/waves
 www/dist
+hooks/playstore-config.json
diff --git a/config.xml b/config.xml
index deb1d45d..e3fc2fbf 100644
--- a/config.xml
+++ b/config.xml
@@ -3,12 +3,12 @@
   xmlns="http://www.w3.org/ns/widgets"
   xmlns:cdv="http://cordova.apache.org/ns/1.0"
   id="fr.duniter.cesium"
-  version="0.1.16"
-  android-versionCode="4"
+  version="0.1.17"
+  android-versionCode="5"
   >
   <name>Cesium</name>
   <description>
-  A webapp client for Duniter
+  An simple App for Duniter
   </description>
   <author email="contact@duniter.fr" href="http://www.duniter.fr">
     Duniter team
@@ -29,53 +29,52 @@
   <feature name="StatusBar">
     <param name="ios-package" onload="true" value="CDVStatusBar" />
   </feature>
-    <platform name="android">
-        <icon density="ldpi" src="resources/android/icon/drawable-ldpi-icon.png" />
-        <icon density="mdpi" src="resources/android/icon/drawable-mdpi-icon.png" />
-        <icon density="hdpi" src="resources/android/icon/drawable-hdpi-icon.png" />
-        <icon density="xhdpi" src="resources/android/icon/drawable-xhdpi-icon.png" />
-        <icon density="xxhdpi" src="resources/android/icon/drawable-xxhdpi-icon.png" />
-        <icon density="xxxhdpi" src="resources/android/icon/drawable-xxxhdpi-icon.png" />
-        <splash density="land-ldpi" src="resources/android/splash/drawable-land-ldpi-screen.png" />
-        <splash density="land-mdpi" src="resources/android/splash/drawable-land-mdpi-screen.png" />
-        <splash density="land-hdpi" src="resources/android/splash/drawable-land-hdpi-screen.png" />
-        <splash density="land-xhdpi" src="resources/android/splash/drawable-land-xhdpi-screen.png" />
-        <splash density="land-xxhdpi" src="resources/android/splash/drawable-land-xxhdpi-screen.png" />
-        <splash density="land-xxxhdpi" src="resources/android/splash/drawable-land-xxxhdpi-screen.png" />
-        <splash density="port-ldpi" src="resources/android/splash/drawable-port-ldpi-screen.png" />
-        <splash density="port-mdpi" src="resources/android/splash/drawable-port-mdpi-screen.png" />
-        <splash density="port-hdpi" src="resources/android/splash/drawable-port-hdpi-screen.png" />
-        <splash density="port-xhdpi" src="resources/android/splash/drawable-port-xhdpi-screen.png" />
-        <splash density="port-xxhdpi" src="resources/android/splash/drawable-port-xxhdpi-screen.png" />
-        <splash density="port-xxxhdpi" src="resources/android/splash/drawable-port-xxxhdpi-screen.png" />
-    </platform>
-    <platform name="ios">
-        <icon height="57" src="resources/ios/icon/icon.png" width="57" />
-        <icon height="114" src="resources/ios/icon/icon@2x.png" width="114" />
-        <icon height="40" src="resources/ios/icon/icon-40.png" width="40" />
-        <icon height="80" src="resources/ios/icon/icon-40@2x.png" width="80" />
-        <icon height="50" src="resources/ios/icon/icon-50.png" width="50" />
-        <icon height="100" src="resources/ios/icon/icon-50@2x.png" width="100" />
-        <icon height="60" src="resources/ios/icon/icon-60.png" width="60" />
-        <icon height="120" src="resources/ios/icon/icon-60@2x.png" width="120" />
-        <icon height="180" src="resources/ios/icon/icon-60@3x.png" width="180" />
-        <icon height="72" src="resources/ios/icon/icon-72.png" width="72" />
-        <icon height="144" src="resources/ios/icon/icon-72@2x.png" width="144" />
-        <icon height="76" src="resources/ios/icon/icon-76.png" width="76" />
-        <icon height="152" src="resources/ios/icon/icon-76@2x.png" width="152" />
-        <icon height="29" src="resources/ios/icon/icon-small.png" width="29" />
-        <icon height="58" src="resources/ios/icon/icon-small@2x.png" width="58" />
-        <icon height="87" src="resources/ios/icon/icon-small@3x.png" width="87" />
-        <splash height="1136" src="resources/ios/splash/Default-568h@2x~iphone.png" width="640" />
-        <splash height="1334" src="resources/ios/splash/Default-667h.png" width="750" />
-        <splash height="2208" src="resources/ios/splash/Default-736h.png" width="1242" />
-        <splash height="1242" src="resources/ios/splash/Default-Landscape-736h.png" width="2208" />
-        <splash height="1536" src="resources/ios/splash/Default-Landscape@2x~ipad.png" width="2048" />
-        <splash height="768" src="resources/ios/splash/Default-Landscape~ipad.png" width="1024" />
-        <splash height="2048" src="resources/ios/splash/Default-Portrait@2x~ipad.png" width="1536" />
-        <splash height="1024" src="resources/ios/splash/Default-Portrait~ipad.png" width="768" />
-        <splash height="960" src="resources/ios/splash/Default@2x~iphone.png" width="640" />
-        <splash height="480" src="resources/ios/splash/Default~iphone.png" width="320" />
-    </platform>
-  <hook type="after_build" src="scripts/afterBuild.js" />
+  <platform name="android">
+      <icon density="ldpi" src="resources/android/icon/drawable-ldpi-icon.png" />
+      <icon density="mdpi" src="resources/android/icon/drawable-mdpi-icon.png" />
+      <icon density="hdpi" src="resources/android/icon/drawable-hdpi-icon.png" />
+      <icon density="xhdpi" src="resources/android/icon/drawable-xhdpi-icon.png" />
+      <icon density="xxhdpi" src="resources/android/icon/drawable-xxhdpi-icon.png" />
+      <icon density="xxxhdpi" src="resources/android/icon/drawable-xxxhdpi-icon.png" />
+      <splash density="land-ldpi" src="resources/android/splash/drawable-land-ldpi-screen.png" />
+      <splash density="land-mdpi" src="resources/android/splash/drawable-land-mdpi-screen.png" />
+      <splash density="land-hdpi" src="resources/android/splash/drawable-land-hdpi-screen.png" />
+      <splash density="land-xhdpi" src="resources/android/splash/drawable-land-xhdpi-screen.png" />
+      <splash density="land-xxhdpi" src="resources/android/splash/drawable-land-xxhdpi-screen.png" />
+      <splash density="land-xxxhdpi" src="resources/android/splash/drawable-land-xxxhdpi-screen.png" />
+      <splash density="port-ldpi" src="resources/android/splash/drawable-port-ldpi-screen.png" />
+      <splash density="port-mdpi" src="resources/android/splash/drawable-port-mdpi-screen.png" />
+      <splash density="port-hdpi" src="resources/android/splash/drawable-port-hdpi-screen.png" />
+      <splash density="port-xhdpi" src="resources/android/splash/drawable-port-xhdpi-screen.png" />
+      <splash density="port-xxhdpi" src="resources/android/splash/drawable-port-xxhdpi-screen.png" />
+      <splash density="port-xxxhdpi" src="resources/android/splash/drawable-port-xxxhdpi-screen.png" />
+  </platform>
+  <platform name="ios">
+      <icon height="57" src="resources/ios/icon/icon.png" width="57" />
+      <icon height="114" src="resources/ios/icon/icon@2x.png" width="114" />
+      <icon height="40" src="resources/ios/icon/icon-40.png" width="40" />
+      <icon height="80" src="resources/ios/icon/icon-40@2x.png" width="80" />
+      <icon height="50" src="resources/ios/icon/icon-50.png" width="50" />
+      <icon height="100" src="resources/ios/icon/icon-50@2x.png" width="100" />
+      <icon height="60" src="resources/ios/icon/icon-60.png" width="60" />
+      <icon height="120" src="resources/ios/icon/icon-60@2x.png" width="120" />
+      <icon height="180" src="resources/ios/icon/icon-60@3x.png" width="180" />
+      <icon height="72" src="resources/ios/icon/icon-72.png" width="72" />
+      <icon height="144" src="resources/ios/icon/icon-72@2x.png" width="144" />
+      <icon height="76" src="resources/ios/icon/icon-76.png" width="76" />
+      <icon height="152" src="resources/ios/icon/icon-76@2x.png" width="152" />
+      <icon height="29" src="resources/ios/icon/icon-small.png" width="29" />
+      <icon height="58" src="resources/ios/icon/icon-small@2x.png" width="58" />
+      <icon height="87" src="resources/ios/icon/icon-small@3x.png" width="87" />
+      <splash height="1136" src="resources/ios/splash/Default-568h@2x~iphone.png" width="640" />
+      <splash height="1334" src="resources/ios/splash/Default-667h.png" width="750" />
+      <splash height="2208" src="resources/ios/splash/Default-736h.png" width="1242" />
+      <splash height="1242" src="resources/ios/splash/Default-Landscape-736h.png" width="2208" />
+      <splash height="1536" src="resources/ios/splash/Default-Landscape@2x~ipad.png" width="2048" />
+      <splash height="768" src="resources/ios/splash/Default-Landscape~ipad.png" width="1024" />
+      <splash height="2048" src="resources/ios/splash/Default-Portrait@2x~ipad.png" width="1536" />
+      <splash height="1024" src="resources/ios/splash/Default-Portrait~ipad.png" width="768" />
+      <splash height="960" src="resources/ios/splash/Default@2x~iphone.png" width="640" />
+      <splash height="480" src="resources/ios/splash/Default~iphone.png" width="320" />
+  </platform>
 </widget>
diff --git a/gulpfile.js b/gulpfile.js
index c35ec637..78d1a95e 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -4,6 +4,7 @@ var gulp = require('gulp');
 var gutil = require('gulp-util');
 var bower = require('bower');
 var concat = require('gulp-concat');
+var path = require("path");
 var sass = require('gulp-sass');
 var minifyCss = require('gulp-minify-css');
 var rename = require('gulp-rename');
@@ -292,3 +293,36 @@ gulp.task('build:web', ['zip:web'], function(done) {
       './tmp'
     ]);
 });
+
+gulp.task('deploy:android', function (done) {
+  var config = require('./hooks/playstore-config.json');
+
+  if(!config) {
+    gutil.log(gutil.colors.red("ERROR => Could not load `./hooks/playstore-config.json` file!"));
+    return done();
+  }
+  if(!config.client_email || !config.private_key) {
+    gutil.log(gutil.colors.red("ERROR => Could not found 'client_email' or 'private_key' in 'hooks/playstore-config.json' file."));
+    return done();
+  }
+
+  var publisher = require('playup')(config);
+
+  var apkFileLocation = path.join('.', 'platforms', 'android', 'build', 'outputs', 'apk', 'android-release.apk');
+  console.log('Publishing APK file [' + apkFileLocation + '] to playstore...');
+
+  publisher.upload(apkFileLocation, {
+    track: 'production',
+    recentChanges: {
+      'fr-FR': 'New stable release'
+    }
+  })
+  .then(function (data) {
+    console.log(' > APK has been deployed to playstore !');
+    done();
+  })
+  .catch(function(err){
+    console.log(err);
+    done();
+  });
+});
diff --git a/hooks/after_build/090_deploy_to_playstore.js b/hooks/after_build/090_deploy_to_playstore.js
new file mode 100755
index 00000000..ff766da6
--- /dev/null
+++ b/hooks/after_build/090_deploy_to_playstore.js
@@ -0,0 +1,68 @@
+#!/usr/bin/env node
+"use strict";
+var gulp = require('gulp');
+var gutil = require('gulp-util');
+var path = require("path");
+
+var cmd = process.env.CORDOVA_CMDLINE;
+var rootdir = process.argv[2];
+var argv = require('yargs').argv;
+
+var skip = true;
+if (cmd.indexOf("--release") > -1 || cmd.indexOf("--useref") > -1) {
+    skip = false;
+}
+
+if (rootdir && !skip) {
+
+  // go through each of the platform directories that have been prepared
+  var platforms = (process.env.CORDOVA_PLATFORMS ? process.env.CORDOVA_PLATFORMS.split(',') : []);
+
+  for(var x=0; x<platforms.length; x++) {
+
+    var platform = platforms[x].trim().toLowerCase();
+    var platformRoot = path.join(rootdir, 'platforms', platform);
+
+    // Deploy for Android
+    if(platform == 'android') {
+
+     var apkFileLocation = path.join(platformRoot, 'build/outputs/apk/android-release.apk');
+
+      console.log('Publishing APK file [' + apkFileLocation + '] to playstore...');
+
+      var config = JSON.parse(fs.readFileSync('../playstore-config.json', 'utf8'));
+
+      if(!config) {
+        gutil.log(gutil.colors.red("ERROR => Could not load `hooks/playstore-config.json` file!"));
+        return;
+      }
+      if(!config.client_email || !config.private_key) {
+        gutil.log(gutil.colors.red("ERROR => Could not found 'client_email' or 'private_key' in 'hooks/playstore-config.json' file."));
+        return;
+      }
+
+      var publisher = require('playup')(config);
+
+      publisher.upload(apkFileLocation,
+      {
+        track: 'production',
+        recentChanges: {
+          'fr-FR': 'New stable release'
+        }
+      })
+      .then(function (data) {
+        console.log(' > APK file successfully deployed to Playstore !');
+      })
+      .catch(function(err) {
+        console.log('ERROR while publsihing to playtore: \n' + err);
+      })
+
+    }
+
+    else {
+      // TODO : deploy other for platforms
+    }
+
+  }
+}
+
diff --git a/package.json b/package.json
index 6a651a0e..6e364d0b 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "cesium",
-  "version": "0.1.16",
+  "version": "0.1.17",
   "description": "A webapp client for Duniter network",
   "dependencies": {
     "delete-empty": "^0.1.3",
@@ -40,6 +40,7 @@
     "ionic-minify": "^2.0.8",
     "jshint": "^2.9.2",
     "mv": "^2.1.1",
+    "playup": "^1.0.2",
     "shelljs": "^0.3.0",
     "yargs": "^4.3.1"
   },
diff --git a/release.sh b/release.sh
new file mode 100644
index 00000000..1a74fcc7
--- /dev/null
+++ b/release.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+gulp default --env default
+
+ionic build android --release
+
+gulp build:web
+
+
+
diff --git a/scripts/afterBuild.js b/scripts/afterBuild.js
deleted file mode 100644
index 3bf6bcdf..00000000
--- a/scripts/afterBuild.js
+++ /dev/null
@@ -1,23 +0,0 @@
-module.exports = function(ctx) {
-    // make sure android platform is part of build
-    if (ctx.opts.platforms.indexOf('android') < 0) {
-        return;
-    }
-    var fs = ctx.requireCordovaModule('fs'),
-        path = ctx.requireCordovaModule('path'),
-        deferral = ctx.requireCordovaModule('q').defer();
-
-    var platformRoot = path.join(ctx.opts.projectRoot, 'platforms/android');
-    var apkFileLocation = path.join(platformRoot, 'build/outputs/apk/android-debug.apk');
-
-    fs.stat(apkFileLocation, function(err,stats) {
-        if (err) {
-                deferral.reject('Operation failed');
-        } else {
-            console.log('Size of ' + apkFileLocation + ' is ' + stats.size +' bytes');
-            deferral.resolve();
-        }
-    });
-
-    return deferral.promise;
-};
diff --git a/www/js/config.js b/www/js/config.js
index a3bb9fc0..87a536af 100644
--- a/www/js/config.js
+++ b/www/js/config.js
@@ -14,7 +14,7 @@ angular.module("cesium.config", [])
 	"TIMEOUT": 4000,
 	"DEBUG": false,
 	"VERSION": "0.1.16",
-	"BUILD_DATE": "2016-06-13T13:42:57.980Z"
+	"BUILD_DATE": "2016-06-13T13:50:48.101Z"
 })
 
 ;
\ No newline at end of file
-- 
GitLab