gulpfile.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  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. if (opts.completed <= opts.total){
  70. var d = new Date();
  71. var cmdText = "["+dateFormat(d, "HH:MM:ss")+"]"+" "+this.description + ': ' + cell + empty + ' ' + (100*percent).toFixed(2) + '% '+speed+count;
  72. slog(cmdText);
  73. }
  74. };
  75. }
  76. function downloadFile(path, filename, headcb, progresscb, cb){
  77. var dest = `o2server/${filename}`;
  78. // fs.exists(dest, function(exists) {
  79. // if (exists){
  80. // headcb(1);
  81. // progresscb({transferred:1});
  82. // cb();
  83. // }else{
  84. let stream = fs.createWriteStream(dest);
  85. var options = { url:protocol+"://"+downloadHost+path };
  86. var fileHost = downloadHost;
  87. var filePath = path;
  88. stream.on('finish', () => {
  89. //gutil.log("download", ":", gutil.colors.green(filename), " completed!");
  90. cb();
  91. });
  92. stream.on('error', (err) => {
  93. gutil.log(gutil.colors.red("download error"), ":", gutil.colors.red(filename), err);
  94. });
  95. var req = http.request({
  96. host:fileHost,
  97. path:filePath,
  98. method:'HEAD'
  99. },function (res){
  100. if (res.statusCode == 200) {
  101. res.setEncoding(null);
  102. var time = 0;
  103. var l = res.headers['content-length'];
  104. var str = progress({
  105. length: l,
  106. time: 100 /* ms */
  107. });
  108. headcb(l);
  109. str.on('progress', function(progress) {
  110. if (pb){
  111. progresscb(progress);
  112. pb.render({ completed: currentLength, total: totalLength, time: time+=100 });
  113. }
  114. });
  115. request.get(options).pipe(str).pipe(stream);
  116. } else {
  117. gutil.log(gutil.colors.red("download error"), ":", gutil.colors.red(filename), "statusCode:"+response.statusCode);
  118. }
  119. })
  120. req.on('error', (e) => {
  121. gutil.log(gutil.colors.red("download error"), ":", gutil.colors.red(filename), e);
  122. });
  123. req.end();
  124. // }
  125. //});
  126. }
  127. var commonsLength = 0;
  128. var jvmLenght = 0;
  129. var totalLength = 0;
  130. var currentLength = 0;
  131. var commonsCurrentLength = 0;
  132. var jvmCurrentLength = 0;
  133. var pb = null;
  134. function initProgress(){
  135. if (commonsLength && jvmLenght){
  136. totalLength = +commonsLength + jvmLenght;
  137. var t = (totalLength/1024/1024).toFixed(2);
  138. pb = new ProgressBar('total: '+t+"M", 50);
  139. }
  140. }
  141. function download_commons_and_jvm(cb){
  142. gutil.log(gutil.colors.green("begin download commons and jvm"));
  143. console.log(`---------------------------------------------------------------------
  144. . Start to download the dependencies needed for compilation ...
  145. ---------------------------------------------------------------------`);
  146. var downloader = new Promise((resolve, reject) => {
  147. var commonLoaded = false;
  148. var jvmLoaded = false;
  149. downloadFile(commonUrl, "commons.tar.gz", (length)=>{
  150. commonsLength = +length;
  151. initProgress();
  152. }, (progress)=>{
  153. commonsCurrentLength = progress.transferred;
  154. currentLength = +commonsCurrentLength+jvmCurrentLength;
  155. }, ()=>{
  156. commonLoaded = true;
  157. if (jvmLoaded && commonLoaded) resolve();
  158. });
  159. // var jvmName = jvmUrl.substr(jvmUrl.lastIndexOf("/"+1, jvmUrl.length));
  160. // console.log(jvmName);
  161. // console.log(jvmUrl);
  162. downloadFile(jvmUrl, "jvm.tar.gz", (length)=>{
  163. jvmLenght = +length;
  164. initProgress();
  165. }, (progress)=>{
  166. jvmCurrentLength = progress.transferred;
  167. currentLength = +commonsCurrentLength+jvmCurrentLength;
  168. }, ()=>{
  169. jvmLoaded = true;
  170. if (jvmLoaded && commonLoaded) resolve();
  171. });
  172. });
  173. downloader.then(()=>{
  174. //console.log();
  175. gutil.log(gutil.colors.green("download commons and jvm completed"));
  176. cb();
  177. });
  178. }
  179. function decompress_commons_and_jvm(cb){
  180. console.log(`---------------------------------------------------------------------
  181. . Start to decompress the dependencies needed for compilation ...
  182. ---------------------------------------------------------------------`);
  183. gutil.log(gutil.colors.green("begin decompress commons and jvm"));
  184. var count =0;
  185. var decompressor = new Promise((resolve, reject) => {
  186. var commonUnziped = false;
  187. var jvmUnziped = false;
  188. targz.decompress({
  189. src: 'o2server/commons.tar.gz',
  190. dest: 'o2server',
  191. tar: {map: function(header){
  192. count++;
  193. var d = new Date();
  194. slog("["+dateFormat(d, "HH:MM:ss")+"] " + count +" "+ header.name+" ...");
  195. //gutil.log(gutil.colors.cyan(header.name), gutil.colors.yellow("..."));
  196. }}
  197. }, function(err){
  198. if(err) {
  199. gutil.log(gutil.colors.red("decompress error"), ":", gutil.colors.red("common.tar.gz "), err);
  200. } else {
  201. commonUnziped = true;
  202. if (jvmUnziped && commonUnziped) resolve();
  203. }
  204. });
  205. targz.decompress({
  206. src: 'o2server/jvm.tar.gz',
  207. dest: 'o2server',
  208. tar: {map: function(header){
  209. count++;
  210. var d = new Date();
  211. slog("["+dateFormat(d, "HH:MM:ss")+"] " + count +" "+ header.name+" ...");
  212. //slog(count +" "+ header.name+" ...");
  213. //gutil.log(gutil.colors.cyan(header.name), gutil.colors.yellow("..."));
  214. }}
  215. }, function(err){
  216. if(err) {
  217. gutil.log(gutil.colors.red("decompress error"), ":", gutil.colors.red("jvm.tar.gz "), err);
  218. } else {
  219. jvmUnziped = true;
  220. if (jvmUnziped && commonUnziped) resolve();
  221. }
  222. });
  223. });
  224. decompressor.then(()=>{
  225. gutil.log(gutil.colors.green("decompress commons and jvm completed. " + count+" files"));
  226. cb();
  227. });
  228. }
  229. function build_web_minimize(cb) {
  230. console.log(`---------------------------------------------------------------------
  231. . Start compiling the web ...
  232. ---------------------------------------------------------------------`);
  233. var dest = 'target/o2server/servers/webServer/';
  234. var src_min = ['o2web/source/**/*.js', '!**/*.spec.js', '!**/test/**', '!o2web/source/o2_lib/**/*'];
  235. var entries = fg.sync(src_min, { dot: false});
  236. var size = entries.length;
  237. var pb = new ProgressBar('', 50);
  238. var doCount = 0;
  239. var stream = gulp.src(src_min);
  240. stream.on("end", ()=>{console.log();});
  241. return stream.pipe(uglify())
  242. .pipe(rename({ extname: '.min.js' }))
  243. .pipe(gulp.dest(dest))
  244. .pipe(logger(function(){
  245. doCount++;
  246. if (doCount <= size){pb.render({ completed: doCount, total: size, count: doCount})};
  247. }))
  248. .pipe(gutil.noop());
  249. }
  250. function build_web_move() {
  251. var dest = 'target/o2server/servers/webServer/';
  252. var src_move = ['o2web/source/**/*', '!**/*.spec.js', '!**/test/**'];
  253. var entries = fg.sync(src_move, { dot: false});
  254. var size = entries.length;
  255. var pb = new ProgressBar('', 50);
  256. var doCount = 0;
  257. var stream = gulp.src(src_move);
  258. stream.on("end", ()=>{console.log();});
  259. return stream.pipe(gulp.dest(dest))
  260. .pipe(logger(function(){
  261. doCount++;
  262. if (doCount <= size) {pb.render({ completed: doCount, total: size, count: doCount})};
  263. }))
  264. .pipe(gutil.noop());
  265. }
  266. exports.build_web_move = build_web_move;
  267. function clear_build(cb){
  268. console.log(`---------------------------------------------------------------------
  269. . clear old build ...
  270. ---------------------------------------------------------------------`);
  271. var dest = 'target';
  272. del(dest, { force: true });
  273. cb();
  274. }
  275. exports.clear_build = clear_build;
  276. function deploy_server(){
  277. console.log(`---------------------------------------------------------------------
  278. . deploy to target ...
  279. ---------------------------------------------------------------------`);
  280. var source = ["o2server/*store/**/*", "o2server/*commons/**/*", "o2server/*jvm/**/*", "o2server/*configSample/**/*", "o2server/*localSample/**/*"];
  281. source = source.concat(scriptSource);
  282. console.log(source)
  283. var dest = "target/o2server/"
  284. var entries = fg.sync(source, { dot: false});
  285. var size = entries.length;
  286. var pb = new ProgressBar('', 50);
  287. var doCount = 0;
  288. var stream = gulp.src(source);
  289. stream.on("end", ()=>{console.log();});
  290. return stream.pipe(gulp.dest(dest))
  291. .pipe(logger(function(){
  292. doCount++;
  293. if (doCount <= size) {pb.render({ completed: doCount, total: size, count: doCount})};
  294. }));
  295. }
  296. exports.preperation = gulp.series(download_commons_and_jvm, decompress_commons_and_jvm);
  297. var shell = require('gulp-shell')
  298. exports.build_server = function(){
  299. console.log(`---------------------------------------------------------------------
  300. . Start compiling the server ...
  301. ---------------------------------------------------------------------`);
  302. return (shell.task('npm run build_server_script'))();
  303. };
  304. exports.build_web = gulp.series(build_web_minimize, build_web_move);
  305. exports.deploy = deploy_server;