gulpfile.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  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. var downloader = new Promise((resolve, reject) => {
  142. var commonLoaded = false;
  143. var jvmLoaded = false;
  144. downloadFile(commonUrl, "commons.tar.gz", (length)=>{
  145. commonsLength = +length;
  146. initProgress();
  147. }, (progress)=>{
  148. commonsCurrentLength = progress.transferred;
  149. currentLength = +commonsCurrentLength+jvmCurrentLength;
  150. }, ()=>{
  151. commonLoaded = true;
  152. if (jvmLoaded && commonLoaded) resolve();
  153. });
  154. // var jvmName = jvmUrl.substr(jvmUrl.lastIndexOf("/"+1, jvmUrl.length));
  155. // console.log(jvmName);
  156. // console.log(jvmUrl);
  157. downloadFile(jvmUrl, "jvm.tar.gz", (length)=>{
  158. jvmLenght = +length;
  159. initProgress();
  160. }, (progress)=>{
  161. jvmCurrentLength = progress.transferred;
  162. currentLength = +commonsCurrentLength+jvmCurrentLength;
  163. }, ()=>{
  164. jvmLoaded = true;
  165. if (jvmLoaded && commonLoaded) resolve();
  166. });
  167. });
  168. downloader.then(()=>{
  169. console.log();
  170. gutil.log(gutil.colors.green("download commons and jvm completed"));
  171. cb();
  172. });
  173. }
  174. function decompress_commons_and_jvm(cb){
  175. gutil.log(gutil.colors.green("begin decompress commons and jvm"));
  176. var count =0;
  177. var decompressor = new Promise((resolve, reject) => {
  178. var commonUnziped = false;
  179. var jvmUnziped = false;
  180. targz.decompress({
  181. src: 'o2server/commons.tar.gz',
  182. dest: 'o2server',
  183. tar: {map: function(header){
  184. count++;
  185. var d = new Date();
  186. slog("["+dateFormat(d, "HH:MM:ss")+"] " + count +" "+ header.name+" ...");
  187. //gutil.log(gutil.colors.cyan(header.name), gutil.colors.yellow("..."));
  188. }}
  189. }, function(err){
  190. if(err) {
  191. gutil.log(gutil.colors.red("decompress error"), ":", gutil.colors.red("common.tar.gz "), err);
  192. } else {
  193. commonUnziped = true;
  194. if (jvmUnziped && commonUnziped) resolve();
  195. }
  196. });
  197. targz.decompress({
  198. src: 'o2server/jvm.tar.gz',
  199. dest: 'o2server',
  200. tar: {map: function(header){
  201. count++;
  202. var d = new Date();
  203. slog("["+dateFormat(d, "HH:MM:ss")+"] " + count +" "+ header.name+" ...");
  204. //slog(count +" "+ header.name+" ...");
  205. //gutil.log(gutil.colors.cyan(header.name), gutil.colors.yellow("..."));
  206. }}
  207. }, function(err){
  208. if(err) {
  209. gutil.log(gutil.colors.red("decompress error"), ":", gutil.colors.red("jvm.tar.gz "), err);
  210. } else {
  211. jvmUnziped = true;
  212. if (jvmUnziped && commonUnziped) resolve();
  213. }
  214. });
  215. });
  216. decompressor.then(()=>{
  217. gutil.log(gutil.colors.green("decompress commons and jvm completed. " + count+" files"));
  218. cb();
  219. });
  220. }
  221. function getJsFileCount(p){
  222. var fileCount = 0;
  223. function readFile(path,filesList, ){
  224. files = fs.readdirSync(path);
  225. files.forEach(walk);
  226. function walk(file){
  227. states = fs.statSync(path+'/'+file);
  228. if(states.isDirectory()){
  229. readFile(path+'/'+file,filesList);
  230. }else{
  231. // fileCount+=states.size;
  232. fileCount++;
  233. }
  234. }
  235. }
  236. var filesList = [];
  237. readFile(p, filesList);
  238. return fileCount;
  239. }
  240. function build_web_minimize(cb) {
  241. var dest = 'target/o2server/webServer/';
  242. var src_min = ['o2web/source/**/*.js', '!**/*.spec.js', '!**/test/**', '!o2web/source/o2_lib/**/*'];
  243. //var src_min = ['o2web/source/o2_core/**/*.js', '!**/*.spec.js', '!**/test/**', '!o2web/source/o2_lib/**/*'];
  244. var entries = fg.sync(src_min, { dot: true});
  245. var size = entries.length;
  246. var pb = new ProgressBar('total: '+size, 50);
  247. var doCount = 0;
  248. return gulp.src(src_min)
  249. .pipe(uglify())
  250. .pipe(rename({ extname: '.min.js' }))
  251. .pipe(gulp.dest(dest))
  252. .pipe(logger(function(){
  253. doCount++;
  254. pb.render({ completed: doCount, total: size, count: doCount});
  255. if (doCount == size) console.log();
  256. }))
  257. .pipe(gutil.noop());
  258. }
  259. function build_web_move() {
  260. var dest = 'target/o2server/webServer/';
  261. var src_move = ['o2web/source/**/*', '!**/*.spec.js', '!**/test/**'];
  262. var entries = fg.sync(src_move, { dot: true});
  263. var size = entries.length;
  264. var pb = new ProgressBar('total: '+size, 50);
  265. var doCount = 0;
  266. return gulp.src(src_move)
  267. .pipe(gulp.dest(dest))
  268. .pipe(logger(function(){
  269. doCount++;
  270. pb.render({ completed: doCount, total: size, count: doCount});
  271. if (doCount == size) console.log();
  272. }))
  273. .pipe(gutil.noop());
  274. }
  275. exports.build_web_move = build_web_move;
  276. function clear_build(cb){
  277. console.log(`---------------------------------------------------------------------
  278. . clear old build ...
  279. ---------------------------------------------------------------------`);
  280. var dest = 'target';
  281. del(dest, { dryRun: true, force: true });
  282. cb();
  283. }
  284. exports.clear_build = clear_build;
  285. function deploy_server(){
  286. console.log(`---------------------------------------------------------------------
  287. . deploy to target ...
  288. ---------------------------------------------------------------------`);
  289. var source1 = ["o2server/store/**/*", "o2server/commons/**/*", "o2server/jvm/**/*", "o2server/configSample/**/*", "o2server/localSample/**/*"];
  290. source = source1.concat(scriptSource);
  291. var dest = "target/o2server/servers/"
  292. var entries = fg.sync(source, { dot: true});
  293. var size = entries.length;
  294. var pb = new ProgressBar('total: '+size, 50);
  295. var doCount = 0;
  296. return gulp.src(source)
  297. .pipe(gulp.dest(dest))
  298. .pipe(logger(function(){
  299. doCount++;
  300. if (doCount <= size) pb.render({ completed: doCount, total: size, count: doCount});
  301. if (doCount > size) {console.log();}
  302. }));
  303. //.pipe(gutil.noop());
  304. }
  305. exports.preperation = function(cd){
  306. console.log(`---------------------------------------------------------------------
  307. . Start to download the dependencies needed for compilation ...
  308. ---------------------------------------------------------------------`);
  309. (gulp.series(download_commons_and_jvm, decompress_commons_and_jvm))();
  310. cb();
  311. }
  312. var shell = require('gulp-shell')
  313. exports.build_server = function(){
  314. console.log(`---------------------------------------------------------------------
  315. . Start compiling the server ...
  316. ---------------------------------------------------------------------`);
  317. return (shell.task('npm run build_server_script'))();
  318. };
  319. exports.build_web = function(){
  320. console.log(`---------------------------------------------------------------------
  321. . Start compiling the web ...
  322. ---------------------------------------------------------------------`);
  323. return (gulp.series(build_web_minimize, build_web_move))();
  324. }
  325. exports.deploy = deploy_server;