gulpfile.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. var gulp = require('gulp'),
  2. gutil = require('gulp-util'),
  3. fs = require("fs"),
  4. minimist = require('minimist'),
  5. targz = require('targz'),
  6. slog = require('single-line-log').stdout,
  7. dateFormat = require('dateformat'),
  8. progress = require('progress-stream'),
  9. request = require("request"),
  10. http = require('http');
  11. //var downloadHost = "download.o2oa.net";
  12. var downloadHost = "release.o2oa.net";
  13. var protocol = "http";
  14. var commonUrl = "/build/commons.tar.gz";
  15. var jvmUrls = {
  16. "all": "/build/jvm.tar.gz",
  17. "linux": "/build/linux.tar.gz",
  18. "aix": "/build/aix.tar.gz",
  19. "kylinos": "/build/kylinos_phytium.tar",
  20. "macos": "/build/macos.tar.gz",
  21. "neokylin": "/build/neokylin_loongson.tar.gz",
  22. "raspberrypi": "/build/raspberrypi.tar.gz",
  23. "windows": "/build/windows.tar.gz"
  24. };
  25. var scripts = {
  26. "all": ["o2server/*.sh", "o2server/*.jar", "o2server/*.html", "o2server/*.bat", "o2server/version.o2"],
  27. "linux": ["o2server/*linux*", "o2server/*.jar", "o2server/*.html", "o2server/version.o2"],
  28. "aix": ["o2server/*aix*", "o2server/*.jar", "o2server/*.html", "o2server/version.o2"],
  29. "kylinos": ["o2server/*kylinos_phytium*", "o2server/*.jar", "o2server/*.html", "o2server/version.o2"],
  30. "macos": ["o2server/*macos*", "o2server/*.jar", "o2server/*.html", "o2server/version.o2"],
  31. "neokylin": ["o2server/*neokylin_loongson*", "o2server/*.jar", "o2server/*.html", "o2server/version.o2"],
  32. "raspberrypi": ["o2server/*raspberrypi*", "o2server/*.jar", "o2server/*.html", "o2server/version.o2"],
  33. "windows": ["o2server/*windows*", "o2server/*.jar", "o2server/*.html", "o2server/version.o2"]
  34. };
  35. var o_options = minimist(process.argv.slice(2), {//upload: local ftp or sftp
  36. string: ["e"]
  37. });
  38. var options = {};
  39. options.ev = o_options.e || "all";
  40. var jvmUrl = jvmUrls[options.ev];
  41. var scriptSource = scripts[options.ev];
  42. function ProgressBar(description, bar_length){
  43. this.description = description || 'Progress';
  44. this.length = bar_length || 50;
  45. this.render = function (opts){
  46. var percent = (opts.completed / opts.total).toFixed(4);
  47. var cell_num = Math.floor(percent * this.length);
  48. var speed = "";
  49. if (opts.time){
  50. speed = (opts.completed/1024/1024)/(opts.time/1000);
  51. speed = speed.toFixed(2);
  52. speed = speed+"M/S";
  53. }
  54. var count = "";
  55. if (opts.count){
  56. count = "["+opts.count+"/"+opts.total+"]"
  57. }
  58. var cell = '';
  59. for (var i=0;i<cell_num;i++) { cell += '>'; }
  60. var empty = '';
  61. for (var i=0;i<this.length-cell_num;i++) { empty += '-'; }
  62. var d = new Date();
  63. var cmdText = "["+dateFormat(d, "HH:MM:ss")+"]"+" "+this.description + ': ' + cell + empty + ' ' + (100*percent).toFixed(2) + '% '+speed+count;
  64. slog(cmdText);
  65. };
  66. }
  67. function downloadFile(path, filename, headcb, progresscb, cb){
  68. var dest = `o2server/${filename}`;
  69. // fs.exists(dest, function(exists) {
  70. // if (exists){
  71. // headcb(1);
  72. // progresscb({transferred:1});
  73. // cb();
  74. // }else{
  75. let stream = fs.createWriteStream(dest);
  76. var options = { url:protocol+"://"+downloadHost+path };
  77. var fileHost = downloadHost;
  78. var filePath = path;
  79. stream.on('finish', () => {
  80. //gutil.log("download", ":", gutil.colors.green(filename), " completed!");
  81. cb();
  82. });
  83. stream.on('error', (err) => {
  84. gutil.log(gutil.colors.red("download error"), ":", gutil.colors.red(filename), err);
  85. });
  86. var req = http.request({
  87. host:fileHost,
  88. path:filePath,
  89. method:'HEAD'
  90. },function (res){
  91. if (res.statusCode == 200) {
  92. res.setEncoding(null);
  93. var time = 0;
  94. var l = res.headers['content-length'];
  95. var str = progress({
  96. length: l,
  97. time: 100 /* ms */
  98. });
  99. headcb(l);
  100. str.on('progress', function(progress) {
  101. if (pb){
  102. progresscb(progress);
  103. pb.render({ completed: currentLength, total: totalLength, time: time+=100 });
  104. }
  105. });
  106. request.get(options).pipe(str).pipe(stream);
  107. } else {
  108. gutil.log(gutil.colors.red("download error"), ":", gutil.colors.red(filename), "statusCode:"+response.statusCode);
  109. }
  110. })
  111. req.on('error', (e) => {
  112. gutil.log(gutil.colors.red("download error"), ":", gutil.colors.red(filename), e);
  113. });
  114. req.end();
  115. // }
  116. //});
  117. }
  118. var commonsLength = 0;
  119. var jvmLenght = 0;
  120. var totalLength = 0;
  121. var currentLength = 0;
  122. var commonsCurrentLength = 0;
  123. var jvmCurrentLength = 0;
  124. var pb = null;
  125. function initProgress(){
  126. if (commonsLength && jvmLenght){
  127. totalLength = +commonsLength + jvmLenght;
  128. var t = (totalLength/1024/1024).toFixed(2);
  129. pb = new ProgressBar('total: '+t+"M", 50);
  130. }
  131. }
  132. function download_commons_and_jvm(cb){
  133. gutil.log(gutil.colors.green("begin download commons and jvm"));
  134. var downloader = new Promise((resolve, reject) => {
  135. var commonLoaded = false;
  136. var jvmLoaded = false;
  137. downloadFile(commonUrl, "commons.tar.gz", (length)=>{
  138. commonsLength = +length;
  139. initProgress();
  140. }, (progress)=>{
  141. commonsCurrentLength = progress.transferred;
  142. currentLength = +commonsCurrentLength+jvmCurrentLength;
  143. }, ()=>{
  144. commonLoaded = true;
  145. if (jvmLoaded && commonLoaded) resolve();
  146. });
  147. // var jvmName = jvmUrl.substr(jvmUrl.lastIndexOf("/"+1, jvmUrl.length));
  148. // console.log(jvmName);
  149. // console.log(jvmUrl);
  150. downloadFile(jvmUrl, "jvm.tar.gz", (length)=>{
  151. jvmLenght = +length;
  152. initProgress();
  153. }, (progress)=>{
  154. jvmCurrentLength = progress.transferred;
  155. currentLength = +commonsCurrentLength+jvmCurrentLength;
  156. }, ()=>{
  157. jvmLoaded = true;
  158. if (jvmLoaded && commonLoaded) resolve();
  159. });
  160. });
  161. downloader.then(()=>{
  162. console.log();
  163. gutil.log(gutil.colors.green("download commons and jvm completed"));
  164. cb();
  165. });
  166. }
  167. function decompress_commons_and_jvm(cb){
  168. gutil.log(gutil.colors.green("begin decompress commons and jvm"));
  169. var count =0;
  170. var decompressor = new Promise((resolve, reject) => {
  171. var commonUnziped = false;
  172. var jvmUnziped = false;
  173. targz.decompress({
  174. src: 'o2server/commons.tar.gz',
  175. dest: 'o2server',
  176. tar: {map: function(header){
  177. count++;
  178. var d = new Date();
  179. slog("["+dateFormat(d, "HH:MM:ss")+"] " + count +" "+ header.name+" ...");
  180. //gutil.log(gutil.colors.cyan(header.name), gutil.colors.yellow("..."));
  181. }}
  182. }, function(err){
  183. if(err) {
  184. gutil.log(gutil.colors.red("decompress error"), ":", gutil.colors.red("common.tar.gz "), err);
  185. } else {
  186. commonUnziped = true;
  187. if (jvmUnziped && commonUnziped) resolve();
  188. }
  189. });
  190. targz.decompress({
  191. src: 'o2server/jvm.tar.gz',
  192. dest: 'o2server',
  193. tar: {map: function(header){
  194. count++;
  195. var d = new Date();
  196. slog("["+dateFormat(d, "HH:MM:ss")+"] " + count +" "+ header.name+" ...");
  197. //slog(count +" "+ header.name+" ...");
  198. //gutil.log(gutil.colors.cyan(header.name), gutil.colors.yellow("..."));
  199. }}
  200. }, function(err){
  201. if(err) {
  202. gutil.log(gutil.colors.red("decompress error"), ":", gutil.colors.red("jvm.tar.gz "), err);
  203. } else {
  204. jvmUnziped = true;
  205. if (jvmUnziped && commonUnziped) resolve();
  206. }
  207. });
  208. });
  209. decompressor.then(()=>{
  210. gutil.log(gutil.colors.green("decompress commons and jvm completed. " + count+" files"));
  211. cb();
  212. });
  213. }
  214. function getFileCount(p){
  215. var fileCount = 0;
  216. function readFile(path,filesList, ){
  217. files = fs.readdirSync(path);
  218. files.forEach(walk);
  219. function walk(file){
  220. states = fs.statSync(path+'/'+file);
  221. if(states.isDirectory()){
  222. readFile(path+'/'+file,filesList);
  223. }else{
  224. // fileCount+=states.size;
  225. fileCount++;
  226. }
  227. }
  228. }
  229. var filesList = [];
  230. readFile(p, filesList);
  231. return fileCount;
  232. }
  233. function deploy_web(){
  234. var path = "o2server/servers/"
  235. var fileCount = getFileCount(path);
  236. //console.log(fileCount);
  237. var pb = new ProgressBar('', 50);
  238. var progressStream = progress({
  239. length: fileCount,
  240. time: 100,
  241. objectMode: true
  242. });
  243. progressStream.on('progress', function (stats) {
  244. var n = (fileCount*stats.percentage/100).toFixed(0);
  245. if (n>fileCount) n = fileCount;
  246. pb.render({ completed: n, total: fileCount, count: n});
  247. });
  248. var source = "o2server/servers/**/*";
  249. var dest = "target/o2server/servers/"
  250. return gulp.src(source)
  251. .pipe(progressStream)
  252. .pipe(gulp.dest(dest))
  253. .pipe(gutil.noop());
  254. }
  255. function deploy_server_store(){
  256. var path = "o2server/store/"
  257. var fileCount = getFileCount(path);
  258. var pb = new ProgressBar('total: '+fileCount, 50);
  259. var progressStream = progress({
  260. length: fileCount,
  261. time: 100,
  262. objectMode: true
  263. });
  264. progressStream.on('progress', function (stats) {
  265. var n = (fileCount*stats.percentage/100).toFixed(0);
  266. if (n>fileCount) n = fileCount;
  267. pb.render({ completed: n, total: fileCount, count: n});
  268. });
  269. var source = "o2server/store/**/*";
  270. var dest = "target/o2server/store/";
  271. return gulp.src(source)
  272. .pipe(progressStream)
  273. .pipe(gulp.dest(dest))
  274. .pipe(gutil.noop());
  275. }
  276. function deploy_server_commons(){
  277. var path = "o2server/commons/";
  278. var fileCount = getFileCount(path);
  279. var pb = new ProgressBar('total: '+fileCount, 50);
  280. var progressStream = progress({
  281. length: fileCount,
  282. time: 100,
  283. objectMode: true
  284. });
  285. progressStream.on('progress', function (stats) {
  286. var n = (fileCount*stats.percentage/100).toFixed(0);
  287. if (n>fileCount) n = fileCount;
  288. pb.render({ completed: n, total: fileCount, count: n});
  289. });
  290. var source = "o2server/commons/**/*";
  291. var dest = "target/o2server/commons/";
  292. return gulp.src(source)
  293. .pipe(progressStream)
  294. .pipe(gulp.dest(dest))
  295. .pipe(gutil.noop());
  296. }
  297. function deploy_server_jvm(){
  298. var path = "o2server/jvm/";
  299. var fileCount = getFileCount(path);
  300. var pb = new ProgressBar('total: '+fileCount, 50);
  301. var progressStream = progress({
  302. length: fileCount,
  303. time: 100,
  304. objectMode: true
  305. });
  306. progressStream.on('progress', function (stats) {
  307. var n = (fileCount*stats.percentage/100).toFixed(0);
  308. if (n>fileCount) n = fileCount;
  309. pb.render({ completed: n, total: fileCount, count: n});
  310. });
  311. var source = "o2server/jvm/**/*";
  312. var dest = "target/o2server/jvm/";
  313. return gulp.src(source)
  314. .pipe(progressStream)
  315. .pipe(gulp.dest(dest))
  316. .pipe(gutil.noop());
  317. }
  318. function deploy_server_config(){
  319. var path = "o2server/configSample/";
  320. var fileCount = getFileCount(path);
  321. var pb = new ProgressBar('total: '+fileCount, 50);
  322. var progressStream = progress({
  323. length: fileCount,
  324. time: 100,
  325. objectMode: true
  326. });
  327. progressStream.on('progress', function (stats) {
  328. var n = (fileCount*stats.percentage/100).toFixed(0);
  329. if (n>fileCount) n = fileCount;
  330. pb.render({ completed: n, total: fileCount, count: n});
  331. });
  332. var source = "o2server/configSample/**/*";
  333. var dest = "target/o2server/configSample/";
  334. return gulp.src(source)
  335. .pipe(progressStream)
  336. .pipe(gulp.dest(dest))
  337. .pipe(gutil.noop());
  338. }
  339. function deploy_server_local(){
  340. var path = "o2server/localSample/";
  341. var fileCount = getFileCount(path);
  342. var pb = new ProgressBar('total: '+fileCount, 50);
  343. var progressStream = progress({
  344. length: fileCount,
  345. time: 100,
  346. objectMode: true
  347. });
  348. progressStream.on('progress', function (stats) {
  349. var n = (fileCount*stats.percentage/100).toFixed(0);
  350. if (n>fileCount) n = fileCount;
  351. pb.render({ completed: n, total: fileCount, count: n});
  352. });
  353. var source = "o2server/localSample/**/*";
  354. var dest = "target/o2server/localSample/";
  355. return gulp.src(source)
  356. .pipe(progressStream)
  357. .pipe(gulp.dest(dest))
  358. .pipe(gutil.noop());
  359. }
  360. function deploy_server_script(){
  361. var dest = "target/o2server/";
  362. return gulp.src(scriptSource)
  363. .pipe(gulp.dest(dest))
  364. .pipe(gutil.noop());
  365. }
  366. exports.preperation = gulp.series(download_commons_and_jvm, decompress_commons_and_jvm);
  367. //exports.deploy_web = deploy_web;
  368. exports.deploy_server_store = deploy_server_store;
  369. exports.deploy_server_commons = deploy_server_commons;
  370. exports.deploy_server_jvm = deploy_server_jvm;
  371. exports.deploy_server_config = deploy_server_config;
  372. exports.deploy_server_local = deploy_server_local;
  373. exports.deploy_server_script = deploy_server_script;
  374. exports.deploy_server = gulp.series(deploy_server_store, deploy_server_commons, deploy_server_jvm, deploy_server_config, deploy_server_local, deploy_server_script);
  375. exports.deploy = gulp.series(deploy_server_store, deploy_server_commons, deploy_server_jvm, deploy_server_config, deploy_server_local, deploy_server_script);