gulpfile.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. var gulp = require('gulp'),
  2. gutil = require('gulp-util'),
  3. del = require('del'),
  4. fs = require("fs"),
  5. minimist = require('minimist'),
  6. targz = require('targz'),
  7. slog = require('single-line-log').stdout,
  8. dateFormat = require('dateformat'),
  9. progress = require('progress-stream'),
  10. request = require("request"),
  11. uglify = require('gulp-tm-uglify'),
  12. rename = require('gulp-rename'),
  13. changed = require('gulp-changed'),
  14. gulpif = require('gulp-if'),
  15. http = require('http');
  16. var fg = require('fast-glob');
  17. var logger = require('gulp-logger');
  18. //var downloadHost = "download.o2oa.net";
  19. var downloadHost = "release.o2oa.net";
  20. var protocol = "http";
  21. var commonUrl = "/build/commons.tar.gz";
  22. var jvmUrls = {
  23. "all": "/build/jvm.tar.gz",
  24. "linux": "/build/linux.tar.gz",
  25. "aix": "/build/aix.tar.gz",
  26. "kylinos": "/build/kylinos_phytium.tar",
  27. "macos": "/build/macos.tar.gz",
  28. "neokylin": "/build/neokylin_loongson.tar.gz",
  29. "raspberrypi": "/build/raspberrypi.tar.gz",
  30. "windows": "/build/windows.tar.gz"
  31. };
  32. var scripts = {
  33. "all": ["o2server/*.sh", "o2server/*.jar", "o2server/*.html", "o2server/*.bat", "o2server/version.o2"],
  34. "linux": ["o2server/*linux*", "o2server/*.jar", "o2server/*.html", "o2server/version.o2"],
  35. "aix": ["o2server/*aix*", "o2server/*.jar", "o2server/*.html", "o2server/version.o2"],
  36. "kylinos": ["o2server/*kylinos_phytium*", "o2server/*.jar", "o2server/*.html", "o2server/version.o2"],
  37. "macos": ["o2server/*macos*", "o2server/*.jar", "o2server/*.html", "o2server/version.o2"],
  38. "neokylin": ["o2server/*neokylin_loongson*", "o2server/*.jar", "o2server/*.html", "o2server/version.o2"],
  39. "raspberrypi": ["o2server/*raspberrypi*", "o2server/*.jar", "o2server/*.html", "o2server/version.o2"],
  40. "windows": ["o2server/*windows*", "o2server/*.jar", "o2server/*.html", "o2server/version.o2"]
  41. };
  42. var o_options = minimist(process.argv.slice(2), {//upload: local ftp or sftp
  43. string: ["e"]
  44. });
  45. var options = {};
  46. options.ev = o_options.e || "all";
  47. var jvmUrl = jvmUrls[options.ev];
  48. var scriptSource = scripts[options.ev];
  49. function ProgressBar(description, bar_length){
  50. this.description = description || 'Progress';
  51. this.length = bar_length || 50;
  52. this.render = function (opts){
  53. var percent = (opts.completed / opts.total).toFixed(4);
  54. var cell_num = Math.floor(percent * this.length);
  55. var speed = "";
  56. if (opts.time){
  57. speed = (opts.completed/1024/1024)/(opts.time/1000);
  58. speed = speed.toFixed(2);
  59. speed = speed+"M/S";
  60. }
  61. var count = "";
  62. if (opts.count){
  63. count = "["+opts.count+"/"+opts.total+"]"
  64. }
  65. var cell = '';
  66. for (var i=0;i<cell_num;i++) { cell += '>'; }
  67. var empty = '';
  68. for (var i=0;i<this.length-cell_num;i++) { empty += '-'; }
  69. var d = new Date();
  70. var cmdText = "["+dateFormat(d, "HH:MM:ss")+"]"+" "+this.description + ': ' + cell + empty + ' ' + (100*percent).toFixed(2) + '% '+speed+count;
  71. slog(cmdText);
  72. };
  73. }
  74. function downloadFile(path, filename, headcb, progresscb, cb){
  75. var dest = `o2server/${filename}`;
  76. // fs.exists(dest, function(exists) {
  77. // if (exists){
  78. // headcb(1);
  79. // progresscb({transferred:1});
  80. // cb();
  81. // }else{
  82. let stream = fs.createWriteStream(dest);
  83. var options = { url:protocol+"://"+downloadHost+path };
  84. var fileHost = downloadHost;
  85. var filePath = path;
  86. stream.on('finish', () => {
  87. //gutil.log("download", ":", gutil.colors.green(filename), " completed!");
  88. cb();
  89. });
  90. stream.on('error', (err) => {
  91. gutil.log(gutil.colors.red("download error"), ":", gutil.colors.red(filename), err);
  92. });
  93. var req = http.request({
  94. host:fileHost,
  95. path:filePath,
  96. method:'HEAD'
  97. },function (res){
  98. if (res.statusCode == 200) {
  99. res.setEncoding(null);
  100. var time = 0;
  101. var l = res.headers['content-length'];
  102. var str = progress({
  103. length: l,
  104. time: 100 /* ms */
  105. });
  106. headcb(l);
  107. str.on('progress', function(progress) {
  108. if (pb){
  109. progresscb(progress);
  110. pb.render({ completed: currentLength, total: totalLength, time: time+=100 });
  111. }
  112. });
  113. request.get(options).pipe(str).pipe(stream);
  114. } else {
  115. gutil.log(gutil.colors.red("download error"), ":", gutil.colors.red(filename), "statusCode:"+response.statusCode);
  116. }
  117. })
  118. req.on('error', (e) => {
  119. gutil.log(gutil.colors.red("download error"), ":", gutil.colors.red(filename), e);
  120. });
  121. req.end();
  122. // }
  123. //});
  124. }
  125. var commonsLength = 0;
  126. var jvmLenght = 0;
  127. var totalLength = 0;
  128. var currentLength = 0;
  129. var commonsCurrentLength = 0;
  130. var jvmCurrentLength = 0;
  131. var pb = null;
  132. function initProgress(){
  133. if (commonsLength && jvmLenght){
  134. totalLength = +commonsLength + jvmLenght;
  135. var t = (totalLength/1024/1024).toFixed(2);
  136. pb = new ProgressBar('total: '+t+"M", 50);
  137. }
  138. }
  139. function download_commons_and_jvm(cb){
  140. gutil.log(gutil.colors.green("begin download commons and jvm"));
  141. console.log(`---------------------------------------------------------------------
  142. . Start to download the dependencies needed for compilation ...
  143. ---------------------------------------------------------------------`);
  144. var downloader = new Promise((resolve, reject) => {
  145. var commonLoaded = false;
  146. var jvmLoaded = false;
  147. downloadFile(commonUrl, "commons.tar.gz", (length)=>{
  148. commonsLength = +length;
  149. initProgress();
  150. }, (progress)=>{
  151. commonsCurrentLength = progress.transferred;
  152. currentLength = +commonsCurrentLength+jvmCurrentLength;
  153. }, ()=>{
  154. commonLoaded = true;
  155. if (jvmLoaded && commonLoaded) resolve();
  156. });
  157. // var jvmName = jvmUrl.substr(jvmUrl.lastIndexOf("/"+1, jvmUrl.length));
  158. // console.log(jvmName);
  159. // console.log(jvmUrl);
  160. downloadFile(jvmUrl, "jvm.tar.gz", (length)=>{
  161. jvmLenght = +length;
  162. initProgress();
  163. }, (progress)=>{
  164. jvmCurrentLength = progress.transferred;
  165. currentLength = +commonsCurrentLength+jvmCurrentLength;
  166. }, ()=>{
  167. jvmLoaded = true;
  168. if (jvmLoaded && commonLoaded) resolve();
  169. });
  170. });
  171. downloader.then(()=>{
  172. console.log();
  173. gutil.log(gutil.colors.green("download commons and jvm completed"));
  174. cb();
  175. });
  176. }
  177. function decompress_commons_and_jvm(cb){
  178. console.log(`---------------------------------------------------------------------
  179. . Start to decompress the dependencies needed for compilation ...
  180. ---------------------------------------------------------------------`);
  181. gutil.log(gutil.colors.green("begin decompress commons and jvm"));
  182. var count =0;
  183. var decompressor = new Promise((resolve, reject) => {
  184. var commonUnziped = false;
  185. var jvmUnziped = false;
  186. targz.decompress({
  187. src: 'o2server/commons.tar.gz',
  188. dest: 'o2server',
  189. tar: {map: function(header){
  190. count++;
  191. var d = new Date();
  192. slog("["+dateFormat(d, "HH:MM:ss")+"] " + count +" "+ header.name+" ...");
  193. //gutil.log(gutil.colors.cyan(header.name), gutil.colors.yellow("..."));
  194. }}
  195. }, function(err){
  196. if(err) {
  197. gutil.log(gutil.colors.red("decompress error"), ":", gutil.colors.red("common.tar.gz "), err);
  198. } else {
  199. commonUnziped = true;
  200. if (jvmUnziped && commonUnziped) resolve();
  201. }
  202. });
  203. targz.decompress({
  204. src: 'o2server/jvm.tar.gz',
  205. dest: 'o2server',
  206. tar: {map: function(header){
  207. count++;
  208. var d = new Date();
  209. slog("["+dateFormat(d, "HH:MM:ss")+"] " + count +" "+ header.name+" ...");
  210. //slog(count +" "+ header.name+" ...");
  211. //gutil.log(gutil.colors.cyan(header.name), gutil.colors.yellow("..."));
  212. }}
  213. }, function(err){
  214. if(err) {
  215. gutil.log(gutil.colors.red("decompress error"), ":", gutil.colors.red("jvm.tar.gz "), err);
  216. } else {
  217. jvmUnziped = true;
  218. if (jvmUnziped && commonUnziped) resolve();
  219. }
  220. });
  221. });
  222. decompressor.then(()=>{
  223. gutil.log(gutil.colors.green("decompress commons and jvm completed. " + count+" files"));
  224. cb();
  225. });
  226. }
  227. function build_web_minimize(cb) {
  228. console.log(`---------------------------------------------------------------------
  229. . Start compiling the web ...
  230. ---------------------------------------------------------------------`);
  231. var dest = 'target/o2server/webServer/';
  232. var src_min = ['o2web/source/**/*.js', '!**/*.spec.js', '!**/test/**', '!o2web/source/o2_lib/**/*'];
  233. var entries = fg.sync(src_min, { dot: false});
  234. var size = entries.length;
  235. var pb = new ProgressBar('total: '+size, 50);
  236. var doCount = 0;
  237. return gulp.src(src_min)
  238. .pipe(uglify())
  239. .pipe(rename({ extname: '.min.js' }))
  240. .pipe(gulp.dest(dest))
  241. .pipe(logger(function(){
  242. if (doCount <= size){doCount++; pb.render({ completed: doCount, total: size, count: doCount})};
  243. if (doCount > size) {console.log();}
  244. }))
  245. .pipe(gutil.noop());
  246. }
  247. function build_web_move() {
  248. var dest = 'target/o2server/webServer/';
  249. var src_move = ['o2web/source/**/*', '!**/*.spec.js', '!**/test/**'];
  250. var entries = fg.sync(src_move, { dot: false});
  251. var size = entries.length;
  252. var pb = new ProgressBar('total: '+size, 50);
  253. var doCount = 0;
  254. return gulp.src(src_move)
  255. .pipe(gulp.dest(dest))
  256. .pipe(logger(function(){
  257. if (doCount <= size) {doCount++;pb.render({ completed: doCount, total: size, count: doCount})};
  258. if (doCount > size) {console.log();}
  259. }))
  260. .pipe(gutil.noop());
  261. }
  262. exports.build_web_move = build_web_move;
  263. function clear_build(cb){
  264. console.log(`---------------------------------------------------------------------
  265. . clear old build ...
  266. ---------------------------------------------------------------------`);
  267. var dest = 'target';
  268. del(dest, { dryRun: true, force: true });
  269. cb();
  270. }
  271. exports.clear_build = clear_build;
  272. function deploy_server(){
  273. console.log(`---------------------------------------------------------------------
  274. . deploy to target ...
  275. ---------------------------------------------------------------------`);
  276. var source = ["o2server/store/**/*", "o2server/commons/**/*", "o2server/jvm/**/*", "o2server/configSample/**/*", "o2server/localSample/**/*"];
  277. source = source.concat(scriptSource);
  278. var dest = "target/o2server/servers/"
  279. var entries = fg.sync(source, { dot: false});
  280. var size = entries.length;
  281. var pb = new ProgressBar('total: '+size, 50);
  282. var doCount = 0;
  283. return gulp.src(source)
  284. .pipe(gulp.dest(dest))
  285. .pipe(logger(function(){
  286. if (doCount <= size) {doCount++; pb.render({ completed: doCount, total: size, count: doCount})};
  287. if (doCount > size) {console.log();}
  288. }));
  289. }
  290. exports.preperation = gulp.series(download_commons_and_jvm, decompress_commons_and_jvm);
  291. var shell = require('gulp-shell')
  292. exports.build_server = function(){
  293. console.log(`---------------------------------------------------------------------
  294. . Start compiling the server ...
  295. ---------------------------------------------------------------------`);
  296. return (shell.task('npm run build_server_script'))();
  297. };
  298. exports.build_web = gulp.series(build_web_minimize, build_web_move);
  299. exports.deploy = deploy_server;