distribute.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #!/usr/local/bin/node
  2. const ora = require('ora');
  3. const request = require('request');
  4. const fs = require('fs');
  5. const path = require('path');
  6. const ProgressBar = require('progress');
  7. const spawn = require('cross-spawn');
  8. const format = require('date-fns/format');
  9. const OSS = require('ali-oss');
  10. let spinner;
  11. function exec(cmd, args, options) {
  12. return new Promise((resolve, reject) => {
  13. var s = spawn(cmd, args, options);
  14. s.stdout.on('data', function(s) {});
  15. s.stderr.on('data', function(s) {
  16. console.error(s.toString());
  17. //reject(s.toString())
  18. });
  19. s.on('close', code => {
  20. if (code == 0) {
  21. resolve();
  22. } else {
  23. reject();
  24. }
  25. });
  26. });
  27. }
  28. const cwd = path.resolve(__dirname);
  29. const vueDir = path.resolve(__dirname, 'vue');
  30. const apkDir = path.resolve(
  31. __dirname,
  32. 'platforms',
  33. 'android',
  34. 'app',
  35. 'build',
  36. 'outputs',
  37. 'apk',
  38. 'armv7',
  39. 'release',
  40. 'app-armv7-release.apk',
  41. );
  42. var argv = require('minimist')(process.argv.slice(2));
  43. // console.dir(argv);
  44. spinner = ora('running webpack build').start();
  45. (function() {
  46. if (argv['skip-build']) {
  47. return new Promise(resolve => resolve());
  48. } else {
  49. return exec('npm', ['run', 'build'], { cwd: vueDir });
  50. }
  51. })()
  52. .then(res => {
  53. if (argv['skip-build']) {
  54. spinner.succeed('webpack build skipped');
  55. } else {
  56. spinner.succeed('webpack build success');
  57. }
  58. spinner.start('preparing');
  59. return exec('cordova', ['prepare'], { cwd: cwd });
  60. })
  61. .then(res => {
  62. spinner.succeed('prepare success');
  63. spinner.start('building android apk');
  64. return exec(
  65. 'cordova',
  66. [
  67. 'build',
  68. 'android',
  69. '--release',
  70. '--',
  71. `--keystore=${(path.resolve(__dirname), 'zouma.jks')}`,
  72. '--storePassword=zouma123',
  73. '--password=zouma123',
  74. '--alias=zouma',
  75. ],
  76. { cwd: cwd },
  77. );
  78. })
  79. .then(res => {
  80. return new Promise((resolve, reject) => {
  81. spinner.succeed('apk build success');
  82. var bar = new ProgressBar(
  83. ' uploading apk [:bar] :rateKb/s :percent :etas',
  84. {
  85. complete: '=',
  86. incomplete: ' ',
  87. width: 20,
  88. total: fs.statSync(apkDir).size / 1000,
  89. clear: true,
  90. },
  91. );
  92. let totalSize = fs.statSync(apkDir).size / 1000;
  93. let client = new OSS({
  94. accessKeyId: 'LTAIHYL4VnCqqPS5',
  95. accessKeySecret: 'fBsIc47hemxc97rh1RvY3pYvzCcsjp',
  96. bucket: 'yuanqijjc',
  97. });
  98. client
  99. .multipartUpload(
  100. `/apk/${format(new Date(), 'yyyy-dd-MM-HH-mm-ss')}.apk`,
  101. apkDir,
  102. {
  103. parallel: 4,
  104. partSize: 1024 * 1024,
  105. progress: function(p, cpt, res) {
  106. bar.tick(totalSize * p);
  107. },
  108. },
  109. )
  110. .then(res => {
  111. resolve(res);
  112. })
  113. .catch(e => {
  114. reject(e);
  115. });
  116. // request.post(
  117. // {
  118. // url: 'https://www.pgyer.com/apiv2/app/upload',
  119. // formData: {
  120. // _api_key: '35efa7161ada3352813c0edc1e375286',
  121. // file: fs.createReadStream(apkDir).on('data', chunk => {
  122. // bar.tick(chunk.length / 1000);
  123. // }),
  124. // },
  125. // },
  126. // (err, httpResponse, body) => {
  127. // if (err) {
  128. // reject(err);
  129. // } else {
  130. // resolve(JSON.parse(body));
  131. // }
  132. // },
  133. // );
  134. });
  135. })
  136. .then(res => {
  137. spinner.succeed('apk upload success');
  138. spinner.succeed('apk url: ' + res.res.requestUrls[0].split('?')[0]);
  139. })
  140. .catch(e => {
  141. console.log(e);
  142. spinner.fail('fail');
  143. spinner.stop();
  144. });
  145. function pad(n, width, z) {
  146. z = z || '0';
  147. n = n + '';
  148. return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
  149. }