| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- #!/usr/local/bin/node
- const ora = require('ora');
- const request = require('request');
- const fs = require('fs');
- const path = require('path');
- const ProgressBar = require('progress');
- const spawn = require('cross-spawn');
- const format = require('date-fns/format');
- const OSS = require('ali-oss');
- let spinner;
- function exec(cmd, args, options) {
- return new Promise((resolve, reject) => {
- var s = spawn(cmd, args, options);
- s.stdout.on('data', function(s) {});
- s.stderr.on('data', function(s) {
- console.error(s.toString());
- //reject(s.toString())
- });
- s.on('close', code => {
- if (code == 0) {
- resolve();
- } else {
- reject();
- }
- });
- });
- }
- const cwd = path.resolve(__dirname);
- const vueDir = path.resolve(__dirname, 'vue');
- const apkDir = path.resolve(
- __dirname,
- 'platforms',
- 'android',
- 'app',
- 'build',
- 'outputs',
- 'apk',
- 'armv7',
- 'release',
- 'app-armv7-release.apk',
- );
- var argv = require('minimist')(process.argv.slice(2));
- // console.dir(argv);
- spinner = ora('running webpack build').start();
- (function() {
- if (argv['skip-build']) {
- return new Promise(resolve => resolve());
- } else {
- return exec('npm', ['run', 'build'], { cwd: vueDir });
- }
- })()
- .then(res => {
- if (argv['skip-build']) {
- spinner.succeed('webpack build skipped');
- } else {
- spinner.succeed('webpack build success');
- }
- spinner.start('preparing');
- return exec('cordova', ['prepare'], { cwd: cwd });
- })
- .then(res => {
- spinner.succeed('prepare success');
- spinner.start('building android apk');
- return exec(
- 'cordova',
- [
- 'build',
- 'android',
- '--release',
- '--',
- `--keystore=${(path.resolve(__dirname), 'zouma.jks')}`,
- '--storePassword=zouma123',
- '--password=zouma123',
- '--alias=zouma',
- ],
- { cwd: cwd },
- );
- })
- .then(res => {
- return new Promise((resolve, reject) => {
- spinner.succeed('apk build success');
- var bar = new ProgressBar(
- ' uploading apk [:bar] :rateKb/s :percent :etas',
- {
- complete: '=',
- incomplete: ' ',
- width: 20,
- total: fs.statSync(apkDir).size / 1000,
- clear: true,
- },
- );
- let totalSize = fs.statSync(apkDir).size / 1000;
- let client = new OSS({
- accessKeyId: 'LTAIHYL4VnCqqPS5',
- accessKeySecret: 'fBsIc47hemxc97rh1RvY3pYvzCcsjp',
- bucket: 'yuanqijjc',
- });
- client
- .multipartUpload(
- `/apk/${format(new Date(), 'yyyy-dd-MM-HH-mm-ss')}.apk`,
- apkDir,
- {
- parallel: 4,
- partSize: 1024 * 1024,
- progress: function(p, cpt, res) {
- bar.tick(totalSize * p);
- },
- },
- )
- .then(res => {
- resolve(res);
- })
- .catch(e => {
- reject(e);
- });
- // request.post(
- // {
- // url: 'https://www.pgyer.com/apiv2/app/upload',
- // formData: {
- // _api_key: '35efa7161ada3352813c0edc1e375286',
- // file: fs.createReadStream(apkDir).on('data', chunk => {
- // bar.tick(chunk.length / 1000);
- // }),
- // },
- // },
- // (err, httpResponse, body) => {
- // if (err) {
- // reject(err);
- // } else {
- // resolve(JSON.parse(body));
- // }
- // },
- // );
- });
- })
- .then(res => {
- spinner.succeed('apk upload success');
- spinner.succeed('apk url: ' + res.res.requestUrls[0].split('?')[0]);
- })
- .catch(e => {
- console.log(e);
- spinner.fail('fail');
- spinner.stop();
- });
- function pad(n, width, z) {
- z = z || '0';
- n = n + '';
- return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
- }
|